direct.c (a20c6bec0b8ae775e2e8f350819cef98eea9a832) direct.c (0b7c01533aa9f4a228d07d2768d084acb3a387bc)
1/*
2 * linux/fs/nfs/direct.c
3 *
4 * Copyright (C) 2003 by Chuck Lever <cel@netapp.com>
5 *
6 * High-performance uncached I/O for the Linux NFS client
7 *
8 * There are important applications whose performance or correctness

--- 68 unchanged lines hidden (view full) ---

77 atomic_t io_count; /* i/os we're waiting for */
78 spinlock_t lock; /* protect completion state */
79 ssize_t count, /* bytes actually processed */
80 error; /* any reported error */
81 struct completion completion; /* wait for i/o completion */
82
83 /* commit state */
84 struct list_head rewrite_list; /* saved nfs_write_data structs */
1/*
2 * linux/fs/nfs/direct.c
3 *
4 * Copyright (C) 2003 by Chuck Lever <cel@netapp.com>
5 *
6 * High-performance uncached I/O for the Linux NFS client
7 *
8 * There are important applications whose performance or correctness

--- 68 unchanged lines hidden (view full) ---

77 atomic_t io_count; /* i/os we're waiting for */
78 spinlock_t lock; /* protect completion state */
79 ssize_t count, /* bytes actually processed */
80 error; /* any reported error */
81 struct completion completion; /* wait for i/o completion */
82
83 /* commit state */
84 struct list_head rewrite_list; /* saved nfs_write_data structs */
85 struct nfs_write_data * commit_data; /* special write_data for commits */
85 struct nfs_commit_data *commit_data; /* special write_data for commits */
86 int flags;
87#define NFS_ODIRECT_DO_COMMIT (1) /* an unstable reply was received */
88#define NFS_ODIRECT_RESCHED_WRITES (2) /* write verification failed */
89 struct nfs_writeverf verf; /* unstable write verifier */
90};
91
92static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode);
93static const struct rpc_call_ops nfs_write_direct_ops;

--- 425 unchanged lines hidden (view full) ---

519 }
520
521 if (put_dreq(dreq))
522 nfs_direct_write_complete(dreq, inode);
523}
524
525static void nfs_direct_commit_result(struct rpc_task *task, void *calldata)
526{
86 int flags;
87#define NFS_ODIRECT_DO_COMMIT (1) /* an unstable reply was received */
88#define NFS_ODIRECT_RESCHED_WRITES (2) /* write verification failed */
89 struct nfs_writeverf verf; /* unstable write verifier */
90};
91
92static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode);
93static const struct rpc_call_ops nfs_write_direct_ops;

--- 425 unchanged lines hidden (view full) ---

519 }
520
521 if (put_dreq(dreq))
522 nfs_direct_write_complete(dreq, inode);
523}
524
525static void nfs_direct_commit_result(struct rpc_task *task, void *calldata)
526{
527 struct nfs_write_data *data = calldata;
527 struct nfs_commit_data *data = calldata;
528
529 /* Call the NFS version-specific code */
530 NFS_PROTO(data->inode)->commit_done(task, data);
531}
532
533static void nfs_direct_commit_release(void *calldata)
534{
528
529 /* Call the NFS version-specific code */
530 NFS_PROTO(data->inode)->commit_done(task, data);
531}
532
533static void nfs_direct_commit_release(void *calldata)
534{
535 struct nfs_write_data *data = calldata;
536 struct nfs_direct_req *dreq = (struct nfs_direct_req *) data->req;
535 struct nfs_commit_data *data = calldata;
536 struct nfs_direct_req *dreq = data->dreq;
537 int status = data->task.tk_status;
538
539 if (status < 0) {
540 dprintk("NFS: %5u commit failed with error %d.\n",
541 data->task.tk_pid, status);
542 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
543 } else if (memcmp(&dreq->verf, &data->verf, sizeof(data->verf))) {
544 dprintk("NFS: %5u commit verify failed\n", data->task.tk_pid);
545 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
546 }
547
548 dprintk("NFS: %5u commit returned %d\n", data->task.tk_pid, status);
549 nfs_direct_write_complete(dreq, data->inode);
550 nfs_commit_free(data);
551}
552
553static const struct rpc_call_ops nfs_commit_direct_ops = {
537 int status = data->task.tk_status;
538
539 if (status < 0) {
540 dprintk("NFS: %5u commit failed with error %d.\n",
541 data->task.tk_pid, status);
542 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
543 } else if (memcmp(&dreq->verf, &data->verf, sizeof(data->verf))) {
544 dprintk("NFS: %5u commit verify failed\n", data->task.tk_pid);
545 dreq->flags = NFS_ODIRECT_RESCHED_WRITES;
546 }
547
548 dprintk("NFS: %5u commit returned %d\n", data->task.tk_pid, status);
549 nfs_direct_write_complete(dreq, data->inode);
550 nfs_commit_free(data);
551}
552
553static const struct rpc_call_ops nfs_commit_direct_ops = {
554 .rpc_call_prepare = nfs_write_prepare,
554 .rpc_call_prepare = nfs_commit_prepare,
555 .rpc_call_done = nfs_direct_commit_result,
556 .rpc_release = nfs_direct_commit_release,
557};
558
559static void nfs_direct_commit_schedule(struct nfs_direct_req *dreq)
560{
555 .rpc_call_done = nfs_direct_commit_result,
556 .rpc_release = nfs_direct_commit_release,
557};
558
559static void nfs_direct_commit_schedule(struct nfs_direct_req *dreq)
560{
561 struct nfs_write_data *data = dreq->commit_data;
561 struct nfs_commit_data *data = dreq->commit_data;
562 struct rpc_task *task;
563 struct rpc_message msg = {
564 .rpc_argp = &data->args,
565 .rpc_resp = &data->res,
566 .rpc_cred = dreq->ctx->cred,
567 };
568 struct rpc_task_setup task_setup_data = {
569 .task = &data->task,

--- 6 unchanged lines hidden (view full) ---

576 };
577
578 data->inode = dreq->inode;
579 data->cred = msg.rpc_cred;
580
581 data->args.fh = NFS_FH(data->inode);
582 data->args.offset = 0;
583 data->args.count = 0;
562 struct rpc_task *task;
563 struct rpc_message msg = {
564 .rpc_argp = &data->args,
565 .rpc_resp = &data->res,
566 .rpc_cred = dreq->ctx->cred,
567 };
568 struct rpc_task_setup task_setup_data = {
569 .task = &data->task,

--- 6 unchanged lines hidden (view full) ---

576 };
577
578 data->inode = dreq->inode;
579 data->cred = msg.rpc_cred;
580
581 data->args.fh = NFS_FH(data->inode);
582 data->args.offset = 0;
583 data->args.count = 0;
584 data->args.context = dreq->ctx;
585 data->args.lock_context = dreq->l_ctx;
586 data->res.count = 0;
587 data->res.fattr = &data->fattr;
588 data->res.verf = &data->verf;
589 nfs_fattr_init(&data->fattr);
590
591 NFS_PROTO(data->inode)->commit_setup(data, &msg);
592
593 /* Note: task.tk_ops->rpc_release will free dreq->commit_data */
594 dreq->commit_data = NULL;

--- 25 unchanged lines hidden (view full) ---

620 nfs_direct_complete(dreq);
621 }
622}
623
624static void nfs_alloc_commit_data(struct nfs_direct_req *dreq)
625{
626 dreq->commit_data = nfs_commitdata_alloc();
627 if (dreq->commit_data != NULL)
584 data->res.fattr = &data->fattr;
585 data->res.verf = &data->verf;
586 nfs_fattr_init(&data->fattr);
587
588 NFS_PROTO(data->inode)->commit_setup(data, &msg);
589
590 /* Note: task.tk_ops->rpc_release will free dreq->commit_data */
591 dreq->commit_data = NULL;

--- 25 unchanged lines hidden (view full) ---

617 nfs_direct_complete(dreq);
618 }
619}
620
621static void nfs_alloc_commit_data(struct nfs_direct_req *dreq)
622{
623 dreq->commit_data = nfs_commitdata_alloc();
624 if (dreq->commit_data != NULL)
628 dreq->commit_data->req = (struct nfs_page *) dreq;
625 dreq->commit_data->dreq = dreq;
629}
630#else
631static inline void nfs_alloc_commit_data(struct nfs_direct_req *dreq)
632{
633 dreq->commit_data = NULL;
634}
635
636static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode)

--- 396 unchanged lines hidden ---
626}
627#else
628static inline void nfs_alloc_commit_data(struct nfs_direct_req *dreq)
629{
630 dreq->commit_data = NULL;
631}
632
633static void nfs_direct_write_complete(struct nfs_direct_req *dreq, struct inode *inode)

--- 396 unchanged lines hidden ---