Lines Matching defs:dreq
102 static void nfs_direct_write_complete(struct nfs_direct_req *dreq);
105 static inline void get_dreq(struct nfs_direct_req *dreq)
107 atomic_inc(&dreq->io_count);
110 static inline int put_dreq(struct nfs_direct_req *dreq)
112 return atomic_dec_and_test(&dreq->io_count);
116 nfs_direct_handle_truncated(struct nfs_direct_req *dreq,
123 if (dreq->max_count >= dreq_len) {
124 dreq->max_count = dreq_len;
125 if (dreq->count > dreq_len)
126 dreq->count = dreq_len;
129 dreq->error = hdr->error;
131 dreq->error = 0;
136 nfs_direct_count_bytes(struct nfs_direct_req *dreq,
142 if (hdr_end > dreq->io_start)
143 dreq_len = hdr_end - dreq->io_start;
145 nfs_direct_handle_truncated(dreq, hdr, dreq_len);
147 if (dreq_len > dreq->max_count)
148 dreq_len = dreq->max_count;
150 if (dreq->count < dreq_len)
151 dreq->count = dreq_len;
187 struct nfs_direct_req *dreq)
189 cinfo->inode = dreq->inode;
190 cinfo->mds = &dreq->mds_cinfo;
191 cinfo->ds = &dreq->ds_cinfo;
192 cinfo->dreq = dreq;
198 struct nfs_direct_req *dreq;
200 dreq = kmem_cache_zalloc(nfs_direct_cachep, GFP_KERNEL);
201 if (!dreq)
204 kref_init(&dreq->kref);
205 kref_get(&dreq->kref);
206 init_completion(&dreq->completion);
207 INIT_LIST_HEAD(&dreq->mds_cinfo.list);
208 pnfs_init_ds_commit_info(&dreq->ds_cinfo);
209 INIT_WORK(&dreq->work, nfs_direct_write_schedule_work);
210 spin_lock_init(&dreq->lock);
212 return dreq;
217 struct nfs_direct_req *dreq = container_of(kref, struct nfs_direct_req, kref);
219 pnfs_release_ds_info(&dreq->ds_cinfo, dreq->inode);
220 if (dreq->l_ctx != NULL)
221 nfs_put_lock_context(dreq->l_ctx);
222 if (dreq->ctx != NULL)
223 put_nfs_open_context(dreq->ctx);
224 kmem_cache_free(nfs_direct_cachep, dreq);
227 static void nfs_direct_req_release(struct nfs_direct_req *dreq)
229 kref_put(&dreq->kref, nfs_direct_req_free);
232 ssize_t nfs_dreq_bytes_left(struct nfs_direct_req *dreq)
234 return dreq->bytes_left;
241 static ssize_t nfs_direct_wait(struct nfs_direct_req *dreq)
246 if (dreq->iocb)
249 result = wait_for_completion_killable(&dreq->completion);
252 result = dreq->count;
253 WARN_ON_ONCE(dreq->count < 0);
256 result = dreq->error;
266 static void nfs_direct_complete(struct nfs_direct_req *dreq)
268 struct inode *inode = dreq->inode;
272 if (dreq->iocb) {
273 long res = (long) dreq->error;
274 if (dreq->count != 0) {
275 res = (long) dreq->count;
276 WARN_ON_ONCE(dreq->count < 0);
278 dreq->iocb->ki_complete(dreq->iocb, res, 0);
281 complete(&dreq->completion);
283 nfs_direct_req_release(dreq);
289 struct nfs_direct_req *dreq = hdr->dreq;
291 spin_lock(&dreq->lock);
293 spin_unlock(&dreq->lock);
297 nfs_direct_count_bytes(dreq, hdr);
298 spin_unlock(&dreq->lock);
305 (dreq->flags == NFS_ODIRECT_SHOULD_DIRTY))
312 if (put_dreq(dreq))
313 nfs_direct_complete(dreq);
330 get_dreq(hdr->dreq);
347 static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,
352 struct inode *inode = dreq->inode;
357 nfs_pageio_init_read(&desc, dreq->inode, false,
359 get_dreq(dreq);
360 desc.pg_dreq = dreq;
381 req = nfs_create_request(dreq->ctx, pagevec[i],
398 dreq->bytes_left -= req_len;
414 nfs_direct_req_release(dreq);
418 if (put_dreq(dreq))
419 nfs_direct_complete(dreq);
449 struct nfs_direct_req *dreq;
465 dreq = nfs_direct_req_alloc();
466 if (dreq == NULL)
469 dreq->inode = inode;
470 dreq->bytes_left = dreq->max_count = count;
471 dreq->io_start = iocb->ki_pos;
472 dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp));
473 l_ctx = nfs_get_lock_context(dreq->ctx);
476 nfs_direct_req_release(dreq);
479 dreq->l_ctx = l_ctx;
481 dreq->iocb = iocb;
484 dreq->flags = NFS_ODIRECT_SHOULD_DIRTY;
490 requested = nfs_direct_read_schedule_iovec(dreq, iter, iocb->ki_pos);
496 result = nfs_direct_wait(dreq);
507 nfs_direct_req_release(dreq);
567 static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
575 nfs_init_cinfo_from_dreq(&cinfo, dreq);
576 nfs_direct_write_scan_commit_list(dreq->inode, &reqs, &cinfo);
578 nfs_direct_join_group(&reqs, &cinfo, dreq->inode);
580 dreq->count = 0;
581 dreq->max_count = 0;
583 dreq->max_count += req->wb_bytes;
584 nfs_clear_pnfs_ds_commit_verifiers(&dreq->ds_cinfo);
585 get_dreq(dreq);
587 nfs_pageio_init_write(&desc, dreq->inode, FLUSH_STABLE, false,
589 desc.pg_dreq = dreq;
597 dreq->flags = 0;
599 dreq->error = desc.pg_error;
601 dreq->error = -EIO;
614 if (put_dreq(dreq))
615 nfs_direct_write_complete(dreq);
621 struct nfs_direct_req *dreq = data->dreq;
628 dreq->error = status;
629 dreq->max_count = 0;
630 dreq->count = 0;
631 dreq->flags = NFS_ODIRECT_DONE;
632 } else if (dreq->flags == NFS_ODIRECT_DONE)
633 status = dreq->error;
635 nfs_init_cinfo_from_dreq(&cinfo, dreq);
641 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
654 nfs_direct_write_complete(dreq);
660 struct nfs_direct_req *dreq = cinfo->dreq;
662 spin_lock(&dreq->lock);
663 if (dreq->flags != NFS_ODIRECT_DONE)
664 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
665 spin_unlock(&dreq->lock);
674 static void nfs_direct_commit_schedule(struct nfs_direct_req *dreq)
680 nfs_init_cinfo_from_dreq(&cinfo, dreq);
682 nfs_scan_commit(dreq->inode, &mds_list, &cinfo);
683 res = nfs_generic_commit_list(dreq->inode, &mds_list, 0, &cinfo);
685 spin_lock(&dreq->lock);
686 if (dreq->flags == 0)
687 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
688 spin_unlock(&dreq->lock);
691 nfs_direct_write_complete(dreq);
694 static void nfs_direct_write_clear_reqs(struct nfs_direct_req *dreq)
700 nfs_init_cinfo_from_dreq(&cinfo, dreq);
701 nfs_direct_write_scan_commit_list(dreq->inode, &reqs, &cinfo);
713 struct nfs_direct_req *dreq = container_of(work, struct nfs_direct_req, work);
714 int flags = dreq->flags;
716 dreq->flags = 0;
719 nfs_direct_commit_schedule(dreq);
722 nfs_direct_write_reschedule(dreq);
725 nfs_direct_write_clear_reqs(dreq);
726 nfs_zap_mapping(dreq->inode, dreq->inode->i_mapping);
727 nfs_direct_complete(dreq);
731 static void nfs_direct_write_complete(struct nfs_direct_req *dreq)
733 queue_work(nfsiod_workqueue, &dreq->work); /* Calls nfs_direct_write_schedule_work */
738 struct nfs_direct_req *dreq = hdr->dreq;
743 nfs_init_cinfo_from_dreq(&cinfo, dreq);
745 spin_lock(&dreq->lock);
747 spin_unlock(&dreq->lock);
751 nfs_direct_count_bytes(dreq, hdr);
753 if (!dreq->flags)
754 dreq->flags = NFS_ODIRECT_DO_COMMIT;
755 flags = dreq->flags;
757 spin_unlock(&dreq->lock);
777 if (put_dreq(dreq))
778 nfs_direct_write_complete(dreq);
795 struct nfs_direct_req *dreq = hdr->dreq;
797 spin_lock(&dreq->lock);
798 if (dreq->error == 0) {
799 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
805 spin_unlock(&dreq->lock);
827 static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
832 struct inode *inode = dreq->inode;
839 desc.pg_dreq = dreq;
840 get_dreq(dreq);
862 req = nfs_create_request(dreq->ctx, pagevec[i],
887 dreq->bytes_left -= req_len;
902 nfs_direct_req_release(dreq);
906 if (put_dreq(dreq))
907 nfs_direct_write_complete(dreq);
940 struct nfs_direct_req *dreq;
963 dreq = nfs_direct_req_alloc();
964 if (!dreq)
967 dreq->inode = inode;
968 dreq->bytes_left = dreq->max_count = count;
969 dreq->io_start = pos;
970 dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp));
971 l_ctx = nfs_get_lock_context(dreq->ctx);
974 nfs_direct_req_release(dreq);
977 dreq->l_ctx = l_ctx;
979 dreq->iocb = iocb;
980 pnfs_init_ds_commit_info_ops(&dreq->ds_cinfo, inode);
983 requested = nfs_direct_write_schedule_iovec(dreq, iter, pos,
988 requested = nfs_direct_write_schedule_iovec(dreq, iter, pos,
1000 result = nfs_direct_wait(dreq);
1012 nfs_direct_req_release(dreq);