Lines Matching defs:dreq
71 static void nfs_direct_write_complete(struct nfs_direct_req *dreq);
74 static inline void get_dreq(struct nfs_direct_req *dreq)
76 atomic_inc(&dreq->io_count);
79 static inline int put_dreq(struct nfs_direct_req *dreq)
81 return atomic_dec_and_test(&dreq->io_count);
85 nfs_direct_handle_truncated(struct nfs_direct_req *dreq,
92 if (dreq->max_count >= dreq_len) {
93 dreq->max_count = dreq_len;
94 if (dreq->count > dreq_len)
95 dreq->count = dreq_len;
98 if (test_bit(NFS_IOHDR_ERROR, &hdr->flags) && !dreq->error)
99 dreq->error = hdr->error;
103 nfs_direct_count_bytes(struct nfs_direct_req *dreq,
109 if (hdr_end > dreq->io_start)
110 dreq_len = hdr_end - dreq->io_start;
112 nfs_direct_handle_truncated(dreq, hdr, dreq_len);
114 if (dreq_len > dreq->max_count)
115 dreq_len = dreq->max_count;
117 if (dreq->count < dreq_len)
118 dreq->count = dreq_len;
121 static void nfs_direct_truncate_request(struct nfs_direct_req *dreq,
125 size_t req_start = (size_t)(offs - dreq->io_start);
127 if (req_start < dreq->max_count)
128 dreq->max_count = req_start;
129 if (req_start < dreq->count)
130 dreq->count = req_start;
163 struct nfs_direct_req *dreq)
165 cinfo->inode = dreq->inode;
166 cinfo->mds = &dreq->mds_cinfo;
167 cinfo->ds = &dreq->ds_cinfo;
168 cinfo->dreq = dreq;
174 struct nfs_direct_req *dreq;
176 dreq = kmem_cache_zalloc(nfs_direct_cachep, GFP_KERNEL);
177 if (!dreq)
180 kref_init(&dreq->kref);
181 kref_get(&dreq->kref);
182 init_completion(&dreq->completion);
183 INIT_LIST_HEAD(&dreq->mds_cinfo.list);
184 pnfs_init_ds_commit_info(&dreq->ds_cinfo);
185 INIT_WORK(&dreq->work, nfs_direct_write_schedule_work);
186 spin_lock_init(&dreq->lock);
188 return dreq;
193 struct nfs_direct_req *dreq = container_of(kref, struct nfs_direct_req, kref);
195 pnfs_release_ds_info(&dreq->ds_cinfo, dreq->inode);
196 if (dreq->l_ctx != NULL)
197 nfs_put_lock_context(dreq->l_ctx);
198 if (dreq->ctx != NULL)
199 put_nfs_open_context(dreq->ctx);
200 kmem_cache_free(nfs_direct_cachep, dreq);
203 static void nfs_direct_req_release(struct nfs_direct_req *dreq)
205 kref_put(&dreq->kref, nfs_direct_req_free);
208 ssize_t nfs_dreq_bytes_left(struct nfs_direct_req *dreq, loff_t offset)
210 loff_t start = offset - dreq->io_start;
211 return dreq->max_count - start;
218 static ssize_t nfs_direct_wait(struct nfs_direct_req *dreq)
223 if (dreq->iocb)
226 result = wait_for_completion_killable(&dreq->completion);
229 result = dreq->count;
230 WARN_ON_ONCE(dreq->count < 0);
233 result = dreq->error;
243 static void nfs_direct_complete(struct nfs_direct_req *dreq)
245 struct inode *inode = dreq->inode;
249 if (dreq->iocb) {
250 long res = (long) dreq->error;
251 if (dreq->count != 0) {
252 res = (long) dreq->count;
253 WARN_ON_ONCE(dreq->count < 0);
255 dreq->iocb->ki_complete(dreq->iocb, res);
258 complete(&dreq->completion);
260 nfs_direct_req_release(dreq);
266 struct nfs_direct_req *dreq = hdr->dreq;
268 spin_lock(&dreq->lock);
270 spin_unlock(&dreq->lock);
274 nfs_direct_count_bytes(dreq, hdr);
275 spin_unlock(&dreq->lock);
282 (dreq->flags == NFS_ODIRECT_SHOULD_DIRTY))
289 if (put_dreq(dreq))
290 nfs_direct_complete(dreq);
307 get_dreq(hdr->dreq);
324 static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,
329 struct inode *inode = dreq->inode;
334 nfs_pageio_init_read(&desc, dreq->inode, false,
336 get_dreq(dreq);
337 desc.pg_dreq = dreq;
357 req = nfs_page_create_from_page(dreq->ctx, pagevec[i],
372 dreq->bytes_left -= req_len;
388 nfs_direct_req_release(dreq);
392 if (put_dreq(dreq))
393 nfs_direct_complete(dreq);
423 struct nfs_direct_req *dreq;
439 dreq = nfs_direct_req_alloc();
440 if (dreq == NULL)
443 dreq->inode = inode;
444 dreq->bytes_left = dreq->max_count = count;
445 dreq->io_start = iocb->ki_pos;
446 dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp));
447 l_ctx = nfs_get_lock_context(dreq->ctx);
450 nfs_direct_req_release(dreq);
453 dreq->l_ctx = l_ctx;
455 dreq->iocb = iocb;
458 dreq->flags = NFS_ODIRECT_SHOULD_DIRTY;
464 requested = nfs_direct_read_schedule_iovec(dreq, iter, iocb->ki_pos);
470 result = nfs_direct_wait(dreq);
481 nfs_direct_req_release(dreq);
541 static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
548 nfs_init_cinfo_from_dreq(&cinfo, dreq);
549 nfs_direct_write_scan_commit_list(dreq->inode, &reqs, &cinfo);
551 nfs_direct_join_group(&reqs, &cinfo, dreq->inode);
553 nfs_clear_pnfs_ds_commit_verifiers(&dreq->ds_cinfo);
554 get_dreq(dreq);
556 nfs_pageio_init_write(&desc, dreq->inode, FLUSH_STABLE, false,
558 desc.pg_dreq = dreq;
565 spin_lock(&dreq->lock);
566 if (dreq->error < 0) {
567 desc.pg_error = dreq->error;
569 dreq->flags = 0;
572 dreq->error = desc.pg_error;
574 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
575 spin_unlock(&dreq->lock);
589 spin_lock(&dreq->lock);
590 nfs_direct_truncate_request(dreq, req);
591 spin_unlock(&dreq->lock);
596 if (put_dreq(dreq))
597 nfs_direct_write_complete(dreq);
603 struct nfs_direct_req *dreq = data->dreq;
608 trace_nfs_direct_commit_complete(dreq);
612 dreq->error = status;
613 dreq->flags = NFS_ODIRECT_DONE;
615 status = dreq->error;
618 nfs_init_cinfo_from_dreq(&cinfo, dreq);
624 spin_lock(&dreq->lock);
625 nfs_direct_truncate_request(dreq, req);
626 spin_unlock(&dreq->lock);
629 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
642 nfs_direct_write_complete(dreq);
648 struct nfs_direct_req *dreq = cinfo->dreq;
650 trace_nfs_direct_resched_write(dreq);
652 spin_lock(&dreq->lock);
653 if (dreq->flags != NFS_ODIRECT_DONE)
654 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
655 spin_unlock(&dreq->lock);
664 static void nfs_direct_commit_schedule(struct nfs_direct_req *dreq)
670 nfs_init_cinfo_from_dreq(&cinfo, dreq);
672 nfs_scan_commit(dreq->inode, &mds_list, &cinfo);
673 res = nfs_generic_commit_list(dreq->inode, &mds_list, 0, &cinfo);
675 spin_lock(&dreq->lock);
676 if (dreq->flags == 0)
677 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
678 spin_unlock(&dreq->lock);
681 nfs_direct_write_complete(dreq);
684 static void nfs_direct_write_clear_reqs(struct nfs_direct_req *dreq)
690 nfs_init_cinfo_from_dreq(&cinfo, dreq);
691 nfs_direct_write_scan_commit_list(dreq->inode, &reqs, &cinfo);
696 nfs_direct_truncate_request(dreq, req);
704 struct nfs_direct_req *dreq = container_of(work, struct nfs_direct_req, work);
705 int flags = dreq->flags;
707 dreq->flags = 0;
710 nfs_direct_commit_schedule(dreq);
713 nfs_direct_write_reschedule(dreq);
716 nfs_direct_write_clear_reqs(dreq);
717 nfs_zap_mapping(dreq->inode, dreq->inode->i_mapping);
718 nfs_direct_complete(dreq);
722 static void nfs_direct_write_complete(struct nfs_direct_req *dreq)
724 trace_nfs_direct_write_complete(dreq);
725 queue_work(nfsiod_workqueue, &dreq->work); /* Calls nfs_direct_write_schedule_work */
730 struct nfs_direct_req *dreq = hdr->dreq;
735 trace_nfs_direct_write_completion(dreq);
737 nfs_init_cinfo_from_dreq(&cinfo, dreq);
739 spin_lock(&dreq->lock);
741 spin_unlock(&dreq->lock);
745 nfs_direct_count_bytes(dreq, hdr);
748 if (!dreq->flags)
749 dreq->flags = NFS_ODIRECT_DO_COMMIT;
750 flags = dreq->flags;
752 spin_unlock(&dreq->lock);
772 if (put_dreq(dreq))
773 nfs_direct_write_complete(dreq);
790 struct nfs_direct_req *dreq = hdr->dreq;
794 trace_nfs_direct_write_reschedule_io(dreq);
796 nfs_init_cinfo_from_dreq(&cinfo, dreq);
797 spin_lock(&dreq->lock);
798 if (dreq->error == 0)
799 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
801 spin_unlock(&dreq->lock);
829 static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
834 struct inode *inode = dreq->inode;
841 trace_nfs_direct_write_schedule_iovec(dreq);
845 desc.pg_dreq = dreq;
846 get_dreq(dreq);
867 req = nfs_page_create_from_page(dreq->ctx, pagevec[i],
884 dreq->bytes_left -= req_len;
903 nfs_init_cinfo_from_dreq(&cinfo, dreq);
904 spin_lock(&dreq->lock);
905 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
906 spin_unlock(&dreq->lock);
925 nfs_direct_req_release(dreq);
929 if (put_dreq(dreq))
930 nfs_direct_write_complete(dreq);
963 struct nfs_direct_req *dreq;
986 dreq = nfs_direct_req_alloc();
987 if (!dreq)
990 dreq->inode = inode;
991 dreq->bytes_left = dreq->max_count = count;
992 dreq->io_start = pos;
993 dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp));
994 l_ctx = nfs_get_lock_context(dreq->ctx);
997 nfs_direct_req_release(dreq);
1000 dreq->l_ctx = l_ctx;
1002 dreq->iocb = iocb;
1003 pnfs_init_ds_commit_info_ops(&dreq->ds_cinfo, inode);
1006 requested = nfs_direct_write_schedule_iovec(dreq, iter, pos,
1011 requested = nfs_direct_write_schedule_iovec(dreq, iter, pos,
1023 result = nfs_direct_wait(dreq);
1036 nfs_direct_req_release(dreq);