• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/src/linux/linux-2.6/fs/nfs/

Lines Matching refs:dreq

90 static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode);
93 static inline void get_dreq(struct nfs_direct_req *dreq)
95 atomic_inc(&dreq->io_count);
98 static inline int put_dreq(struct nfs_direct_req *dreq)
100 return atomic_dec_and_test(&dreq->io_count);
150 struct nfs_direct_req *dreq;
152 dreq = kmem_cache_alloc(nfs_direct_cachep, GFP_KERNEL);
153 if (!dreq)
156 kref_init(&dreq->kref);
157 kref_get(&dreq->kref);
158 init_completion(&dreq->completion);
159 INIT_LIST_HEAD(&dreq->rewrite_list);
160 dreq->iocb = NULL;
161 dreq->ctx = NULL;
162 spin_lock_init(&dreq->lock);
163 atomic_set(&dreq->io_count, 0);
164 dreq->count = 0;
165 dreq->error = 0;
166 dreq->flags = 0;
168 return dreq;
173 struct nfs_direct_req *dreq = container_of(kref, struct nfs_direct_req, kref);
175 if (dreq->ctx != NULL)
176 put_nfs_open_context(dreq->ctx);
177 kmem_cache_free(nfs_direct_cachep, dreq);
180 static void nfs_direct_req_release(struct nfs_direct_req *dreq)
182 kref_put(&dreq->kref, nfs_direct_req_free);
188 static ssize_t nfs_direct_wait(struct nfs_direct_req *dreq)
193 if (dreq->iocb)
196 result = wait_for_completion_interruptible(&dreq->completion);
199 result = dreq->error;
201 result = dreq->count;
211 static void nfs_direct_complete(struct nfs_direct_req *dreq)
213 if (dreq->iocb) {
214 long res = (long) dreq->error;
216 res = (long) dreq->count;
217 aio_complete(dreq->iocb, res, 0);
219 complete_all(&dreq->completion);
221 nfs_direct_req_release(dreq);
232 struct nfs_direct_req *dreq = (struct nfs_direct_req *) data->req;
237 spin_lock(&dreq->lock);
239 dreq->error = task->tk_status;
240 spin_unlock(&dreq->lock);
242 dreq->count += data->res.count;
243 spin_unlock(&dreq->lock);
250 if (put_dreq(dreq))
251 nfs_direct_complete(dreq);
266 static ssize_t nfs_direct_read_schedule(struct nfs_direct_req *dreq, unsigned long user_addr, size_t count, loff_t pos)
268 struct nfs_open_context *ctx = dreq->ctx;
275 get_dreq(dreq);
303 get_dreq(dreq);
305 data->req = (struct nfs_page *) dreq;
344 if (put_dreq(dreq))
345 nfs_direct_complete(dreq);
358 struct nfs_direct_req *dreq;
360 dreq = nfs_direct_req_alloc();
361 if (!dreq)
364 dreq->inode = inode;
365 dreq->ctx = get_nfs_open_context((struct nfs_open_context *)iocb->ki_filp->private_data);
367 dreq->iocb = iocb;
371 result = nfs_direct_read_schedule(dreq, user_addr, count, pos);
373 result = nfs_direct_wait(dreq);
375 nfs_direct_req_release(dreq);
380 static void nfs_direct_free_writedata(struct nfs_direct_req *dreq)
382 while (!list_empty(&dreq->rewrite_list)) {
383 struct nfs_write_data *data = list_entry(dreq->rewrite_list.next, struct nfs_write_data, pages);
391 static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
393 struct inode *inode = dreq->inode;
397 dreq->count = 0;
398 get_dreq(dreq);
400 list_for_each(p, &dreq->rewrite_list) {
403 get_dreq(dreq);
436 if (put_dreq(dreq))
437 nfs_direct_write_complete(dreq, inode);
443 struct nfs_direct_req *dreq = (struct nfs_direct_req *) data->req;
451 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
452 } else if (memcmp(&dreq->verf, &data->verf, sizeof(data->verf))) {
454 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
458 nfs_direct_write_complete(dreq, data->inode);
466 static void nfs_direct_commit_schedule(struct nfs_direct_req *dreq)
468 struct nfs_write_data *data = dreq->commit_data;
470 data->inode = dreq->inode;
471 data->cred = dreq->ctx->cred;
480 rpc_init_task(&data->task, NFS_CLIENT(dreq->inode), RPC_TASK_ASYNC,
486 /* Note: task.tk_ops->rpc_release will free dreq->commit_data */
487 dreq->commit_data = NULL;
494 static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode)
496 int flags = dreq->flags;
498 dreq->flags = 0;
501 nfs_direct_commit_schedule(dreq);
504 nfs_direct_write_reschedule(dreq);
508 if (dreq->commit_data != NULL)
509 nfs_commit_free(dreq->commit_data);
510 nfs_direct_free_writedata(dreq);
512 nfs_direct_complete(dreq);
516 static void nfs_alloc_commit_data(struct nfs_direct_req *dreq)
518 dreq->commit_data = nfs_commit_alloc();
519 if (dreq->commit_data != NULL)
520 dreq->commit_data->req = (struct nfs_page *) dreq;
523 static inline void nfs_alloc_commit_data(struct nfs_direct_req *dreq)
525 dreq->commit_data = NULL;
528 static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode)
531 nfs_direct_free_writedata(dreq);
533 nfs_direct_complete(dreq);
540 struct nfs_direct_req *dreq = (struct nfs_direct_req *) data->req;
546 spin_lock(&dreq->lock);
548 if (unlikely(dreq->error != 0))
552 dreq->flags = 0;
553 dreq->error = status;
556 dreq->count += data->res.count;
559 switch (dreq->flags) {
561 memcpy(&dreq->verf, &data->verf, sizeof(dreq->verf));
562 dreq->flags = NFS_ODIRECT_DO_COMMIT;
565 if (memcmp(&dreq->verf, &data->verf, sizeof(dreq->verf))) {
567 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
572 spin_unlock(&dreq->lock);
582 struct nfs_direct_req *dreq = (struct nfs_direct_req *) data->req;
584 if (put_dreq(dreq))
585 nfs_direct_write_complete(dreq, data->inode);
600 static ssize_t nfs_direct_write_schedule(struct nfs_direct_req *dreq, unsigned long user_addr, size_t count, loff_t pos, int sync)
602 struct nfs_open_context *ctx = dreq->ctx;
609 get_dreq(dreq);
637 get_dreq(dreq);
639 list_move_tail(&data->pages, &dreq->rewrite_list);
641 data->req = (struct nfs_page *) dreq;
682 if (put_dreq(dreq))
683 nfs_direct_write_complete(dreq, inode);
696 struct nfs_direct_req *dreq;
700 dreq = nfs_direct_req_alloc();
701 if (!dreq)
703 nfs_alloc_commit_data(dreq);
705 if (dreq->commit_data == NULL || count < wsize)
708 dreq->inode = inode;
709 dreq->ctx = get_nfs_open_context((struct nfs_open_context *)iocb->ki_filp->private_data);
711 dreq->iocb = iocb;
718 result = nfs_direct_write_schedule(dreq, user_addr, count, pos, sync);
720 result = nfs_direct_wait(dreq);
722 nfs_direct_req_release(dreq);