• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/fs/nfs/

Lines Matching defs:dreq

92 static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode);
95 static inline void get_dreq(struct nfs_direct_req *dreq)
97 atomic_inc(&dreq->io_count);
100 static inline int put_dreq(struct nfs_direct_req *dreq)
102 return atomic_dec_and_test(&dreq->io_count);
152 struct nfs_direct_req *dreq;
154 dreq = kmem_cache_alloc(nfs_direct_cachep, GFP_KERNEL);
155 if (!dreq)
158 kref_init(&dreq->kref);
159 kref_get(&dreq->kref);
160 init_completion(&dreq->completion);
161 INIT_LIST_HEAD(&dreq->rewrite_list);
162 dreq->iocb = NULL;
163 dreq->ctx = NULL;
164 dreq->l_ctx = NULL;
165 spin_lock_init(&dreq->lock);
166 atomic_set(&dreq->io_count, 0);
167 dreq->count = 0;
168 dreq->error = 0;
169 dreq->flags = 0;
171 return dreq;
176 struct nfs_direct_req *dreq = container_of(kref, struct nfs_direct_req, kref);
178 if (dreq->l_ctx != NULL)
179 nfs_put_lock_context(dreq->l_ctx);
180 if (dreq->ctx != NULL)
181 put_nfs_open_context(dreq->ctx);
182 kmem_cache_free(nfs_direct_cachep, dreq);
185 static void nfs_direct_req_release(struct nfs_direct_req *dreq)
187 kref_put(&dreq->kref, nfs_direct_req_free);
193 static ssize_t nfs_direct_wait(struct nfs_direct_req *dreq)
198 if (dreq->iocb)
201 result = wait_for_completion_killable(&dreq->completion);
204 result = dreq->error;
206 result = dreq->count;
216 static void nfs_direct_complete(struct nfs_direct_req *dreq)
218 if (dreq->iocb) {
219 long res = (long) dreq->error;
221 res = (long) dreq->count;
222 aio_complete(dreq->iocb, res, 0);
224 complete_all(&dreq->completion);
226 nfs_direct_req_release(dreq);
245 struct nfs_direct_req *dreq = (struct nfs_direct_req *) data->req;
248 spin_lock(&dreq->lock);
250 dreq->error = status;
251 spin_unlock(&dreq->lock);
253 dreq->count += data->res.count;
254 spin_unlock(&dreq->lock);
261 if (put_dreq(dreq))
262 nfs_direct_complete(dreq);
281 static ssize_t nfs_direct_read_schedule_segment(struct nfs_direct_req *dreq,
285 struct nfs_open_context *ctx = dreq->ctx;
336 get_dreq(dreq);
338 data->req = (struct nfs_page *) dreq;
343 data->args.lock_context = dreq->l_ctx;
387 static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,
396 get_dreq(dreq);
400 result = nfs_direct_read_schedule_segment(dreq, vec, pos);
414 nfs_direct_req_release(dreq);
418 if (put_dreq(dreq))
419 nfs_direct_complete(dreq);
428 struct nfs_direct_req *dreq;
430 dreq = nfs_direct_req_alloc();
431 if (dreq == NULL)
434 dreq->inode = inode;
435 dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp));
436 dreq->l_ctx = nfs_get_lock_context(dreq->ctx);
437 if (dreq->l_ctx == NULL)
440 dreq->iocb = iocb;
442 result = nfs_direct_read_schedule_iovec(dreq, iov, nr_segs, pos);
444 result = nfs_direct_wait(dreq);
446 nfs_direct_req_release(dreq);
451 static void nfs_direct_free_writedata(struct nfs_direct_req *dreq)
453 while (!list_empty(&dreq->rewrite_list)) {
454 struct nfs_write_data *data = list_entry(dreq->rewrite_list.next, struct nfs_write_data, pages);
462 static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
464 struct inode *inode = dreq->inode;
469 .rpc_cred = dreq->ctx->cred,
479 dreq->count = 0;
480 get_dreq(dreq);
482 list_for_each(p, &dreq->rewrite_list) {
485 get_dreq(dreq);
522 if (put_dreq(dreq))
523 nfs_direct_write_complete(dreq, inode);
537 struct nfs_direct_req *dreq = (struct nfs_direct_req *) data->req;
543 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
544 } else if (memcmp(&dreq->verf, &data->verf, sizeof(data->verf))) {
546 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
550 nfs_direct_write_complete(dreq, data->inode);
562 static void nfs_direct_commit_schedule(struct nfs_direct_req *dreq)
564 struct nfs_write_data *data = dreq->commit_data;
569 .rpc_cred = dreq->ctx->cred,
573 .rpc_client = NFS_CLIENT(dreq->inode),
581 data->inode = dreq->inode;
587 data->args.context = dreq->ctx;
588 data->args.lock_context = dreq->l_ctx;
596 /* Note: task.tk_ops->rpc_release will free dreq->commit_data */
597 dreq->commit_data = NULL;
606 static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode)
608 int flags = dreq->flags;
610 dreq->flags = 0;
613 nfs_direct_commit_schedule(dreq);
616 nfs_direct_write_reschedule(dreq);
619 if (dreq->commit_data != NULL)
620 nfs_commit_free(dreq->commit_data);
621 nfs_direct_free_writedata(dreq);
623 nfs_direct_complete(dreq);
627 static void nfs_alloc_commit_data(struct nfs_direct_req *dreq)
629 dreq->commit_data = nfs_commitdata_alloc();
630 if (dreq->commit_data != NULL)
631 dreq->commit_data->req = (struct nfs_page *) dreq;
634 static inline void nfs_alloc_commit_data(struct nfs_direct_req *dreq)
636 dreq->commit_data = NULL;
639 static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode)
641 nfs_direct_free_writedata(dreq);
643 nfs_direct_complete(dreq);
662 struct nfs_direct_req *dreq = (struct nfs_direct_req *) data->req;
665 spin_lock(&dreq->lock);
669 dreq->flags = 0;
670 dreq->error = status;
672 if (unlikely(dreq->error != 0))
675 dreq->count += data->res.count;
678 switch (dreq->flags) {
680 memcpy(&dreq->verf, &data->verf, sizeof(dreq->verf));
681 dreq->flags = NFS_ODIRECT_DO_COMMIT;
684 if (memcmp(&dreq->verf, &data->verf, sizeof(dreq->verf))) {
686 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
691 spin_unlock(&dreq->lock);
693 if (put_dreq(dreq))
694 nfs_direct_write_complete(dreq, data->inode);
712 static ssize_t nfs_direct_write_schedule_segment(struct nfs_direct_req *dreq,
716 struct nfs_open_context *ctx = dreq->ctx;
767 get_dreq(dreq);
769 list_move_tail(&data->pages, &dreq->rewrite_list);
771 data->req = (struct nfs_page *) dreq;
776 data->args.lock_context = dreq->l_ctx;
822 static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
831 get_dreq(dreq);
835 result = nfs_direct_write_schedule_segment(dreq, vec,
850 nfs_direct_req_release(dreq);
854 if (put_dreq(dreq))
855 nfs_direct_write_complete(dreq, dreq->inode);
865 struct nfs_direct_req *dreq;
869 dreq = nfs_direct_req_alloc();
870 if (!dreq)
872 nfs_alloc_commit_data(dreq);
874 if (dreq->commit_data == NULL || count < wsize)
877 dreq->inode = inode;
878 dreq->ctx = get_nfs_open_context(nfs_file_open_context(iocb->ki_filp));
879 dreq->l_ctx = nfs_get_lock_context(dreq->ctx);
880 if (dreq->l_ctx == NULL)
883 dreq->iocb = iocb;
885 result = nfs_direct_write_schedule_iovec(dreq, iov, nr_segs, pos, sync);
887 result = nfs_direct_wait(dreq);
889 nfs_direct_req_release(dreq);