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 --- |