direct.c (18f412969687ded8f1debd21da758b041993e974) | direct.c (fb5f7f20cdb91f8ef985aef09fa2217c49c38396) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * linux/fs/nfs/direct.c 4 * 5 * Copyright (C) 2003 by Chuck Lever <cel@netapp.com> 6 * 7 * High-performance uncached I/O for the Linux NFS client 8 * --- 80 unchanged lines hidden (view full) --- 89 struct pnfs_ds_commit_info ds_cinfo; /* Storage for cinfo */ 90 struct work_struct work; 91 int flags; 92 /* for write */ 93#define NFS_ODIRECT_DO_COMMIT (1) /* an unstable reply was received */ 94#define NFS_ODIRECT_RESCHED_WRITES (2) /* write verification failed */ 95 /* for read */ 96#define NFS_ODIRECT_SHOULD_DIRTY (3) /* dirty user-space page after read */ | 1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * linux/fs/nfs/direct.c 4 * 5 * Copyright (C) 2003 by Chuck Lever <cel@netapp.com> 6 * 7 * High-performance uncached I/O for the Linux NFS client 8 * --- 80 unchanged lines hidden (view full) --- 89 struct pnfs_ds_commit_info ds_cinfo; /* Storage for cinfo */ 90 struct work_struct work; 91 int flags; 92 /* for write */ 93#define NFS_ODIRECT_DO_COMMIT (1) /* an unstable reply was received */ 94#define NFS_ODIRECT_RESCHED_WRITES (2) /* write verification failed */ 95 /* for read */ 96#define NFS_ODIRECT_SHOULD_DIRTY (3) /* dirty user-space page after read */ |
97#define NFS_ODIRECT_DONE INT_MAX /* write verification failed */ |
|
97 struct nfs_writeverf verf; /* unstable write verifier */ 98}; 99 100static const struct nfs_pgio_completion_ops nfs_direct_write_completion_ops; 101static const struct nfs_commit_completion_ops nfs_direct_commit_completion_ops; 102static void nfs_direct_write_complete(struct nfs_direct_req *dreq); 103static void nfs_direct_write_schedule_work(struct work_struct *work); 104 --- 568 unchanged lines hidden (view full) --- 673 674static void nfs_direct_commit_complete(struct nfs_commit_data *data) 675{ 676 struct nfs_direct_req *dreq = data->dreq; 677 struct nfs_commit_info cinfo; 678 struct nfs_page *req; 679 int status = data->task.tk_status; 680 | 98 struct nfs_writeverf verf; /* unstable write verifier */ 99}; 100 101static const struct nfs_pgio_completion_ops nfs_direct_write_completion_ops; 102static const struct nfs_commit_completion_ops nfs_direct_commit_completion_ops; 103static void nfs_direct_write_complete(struct nfs_direct_req *dreq); 104static void nfs_direct_write_schedule_work(struct work_struct *work); 105 --- 568 unchanged lines hidden (view full) --- 674 675static void nfs_direct_commit_complete(struct nfs_commit_data *data) 676{ 677 struct nfs_direct_req *dreq = data->dreq; 678 struct nfs_commit_info cinfo; 679 struct nfs_page *req; 680 int status = data->task.tk_status; 681 |
682 if (status < 0) { 683 /* Errors in commit are fatal */ 684 dreq->error = status; 685 dreq->max_count = 0; 686 dreq->count = 0; 687 dreq->flags = NFS_ODIRECT_DONE; 688 } else if (dreq->flags == NFS_ODIRECT_DONE) 689 status = dreq->error; 690 |
|
681 nfs_init_cinfo_from_dreq(&cinfo, dreq); | 691 nfs_init_cinfo_from_dreq(&cinfo, dreq); |
682 if (status < 0 || nfs_direct_cmp_commit_data_verf(dreq, data)) | 692 if (nfs_direct_cmp_commit_data_verf(dreq, data)) |
683 dreq->flags = NFS_ODIRECT_RESCHED_WRITES; 684 685 while (!list_empty(&data->pages)) { 686 req = nfs_list_entry(data->pages.next); 687 nfs_list_remove_request(req); 688 if (dreq->flags == NFS_ODIRECT_RESCHED_WRITES) { 689 /* 690 * Despite the reboot, the write was successful, --- 12 unchanged lines hidden (view full) --- 703} 704 705static void nfs_direct_resched_write(struct nfs_commit_info *cinfo, 706 struct nfs_page *req) 707{ 708 struct nfs_direct_req *dreq = cinfo->dreq; 709 710 spin_lock(&dreq->lock); | 693 dreq->flags = NFS_ODIRECT_RESCHED_WRITES; 694 695 while (!list_empty(&data->pages)) { 696 req = nfs_list_entry(data->pages.next); 697 nfs_list_remove_request(req); 698 if (dreq->flags == NFS_ODIRECT_RESCHED_WRITES) { 699 /* 700 * Despite the reboot, the write was successful, --- 12 unchanged lines hidden (view full) --- 713} 714 715static void nfs_direct_resched_write(struct nfs_commit_info *cinfo, 716 struct nfs_page *req) 717{ 718 struct nfs_direct_req *dreq = cinfo->dreq; 719 720 spin_lock(&dreq->lock); |
711 dreq->flags = NFS_ODIRECT_RESCHED_WRITES; | 721 if (dreq->flags != NFS_ODIRECT_DONE) 722 dreq->flags = NFS_ODIRECT_RESCHED_WRITES; |
712 spin_unlock(&dreq->lock); 713 nfs_mark_request_commit(req, NULL, cinfo, 0); 714} 715 716static const struct nfs_commit_completion_ops nfs_direct_commit_completion_ops = { 717 .completion = nfs_direct_commit_complete, 718 .resched_write = nfs_direct_resched_write, 719}; --- 6 unchanged lines hidden (view full) --- 726 727 nfs_init_cinfo_from_dreq(&cinfo, dreq); 728 nfs_scan_commit(dreq->inode, &mds_list, &cinfo); 729 res = nfs_generic_commit_list(dreq->inode, &mds_list, 0, &cinfo); 730 if (res < 0) /* res == -ENOMEM */ 731 nfs_direct_write_reschedule(dreq); 732} 733 | 723 spin_unlock(&dreq->lock); 724 nfs_mark_request_commit(req, NULL, cinfo, 0); 725} 726 727static const struct nfs_commit_completion_ops nfs_direct_commit_completion_ops = { 728 .completion = nfs_direct_commit_complete, 729 .resched_write = nfs_direct_resched_write, 730}; --- 6 unchanged lines hidden (view full) --- 737 738 nfs_init_cinfo_from_dreq(&cinfo, dreq); 739 nfs_scan_commit(dreq->inode, &mds_list, &cinfo); 740 res = nfs_generic_commit_list(dreq->inode, &mds_list, 0, &cinfo); 741 if (res < 0) /* res == -ENOMEM */ 742 nfs_direct_write_reschedule(dreq); 743} 744 |
745static void nfs_direct_write_clear_reqs(struct nfs_direct_req *dreq) 746{ 747 struct nfs_commit_info cinfo; 748 struct nfs_page *req; 749 LIST_HEAD(reqs); 750 751 nfs_init_cinfo_from_dreq(&cinfo, dreq); 752 nfs_direct_write_scan_commit_list(dreq->inode, &reqs, &cinfo); 753 754 while (!list_empty(&reqs)) { 755 req = nfs_list_entry(reqs.next); 756 nfs_list_remove_request(req); 757 nfs_unlock_and_release_request(req); 758 } 759} 760 |
|
734static void nfs_direct_write_schedule_work(struct work_struct *work) 735{ 736 struct nfs_direct_req *dreq = container_of(work, struct nfs_direct_req, work); 737 int flags = dreq->flags; 738 739 dreq->flags = 0; 740 switch (flags) { 741 case NFS_ODIRECT_DO_COMMIT: 742 nfs_direct_commit_schedule(dreq); 743 break; 744 case NFS_ODIRECT_RESCHED_WRITES: 745 nfs_direct_write_reschedule(dreq); 746 break; 747 default: | 761static void nfs_direct_write_schedule_work(struct work_struct *work) 762{ 763 struct nfs_direct_req *dreq = container_of(work, struct nfs_direct_req, work); 764 int flags = dreq->flags; 765 766 dreq->flags = 0; 767 switch (flags) { 768 case NFS_ODIRECT_DO_COMMIT: 769 nfs_direct_commit_schedule(dreq); 770 break; 771 case NFS_ODIRECT_RESCHED_WRITES: 772 nfs_direct_write_reschedule(dreq); 773 break; 774 default: |
775 nfs_direct_write_clear_reqs(dreq); |
|
748 nfs_zap_mapping(dreq->inode, dreq->inode->i_mapping); 749 nfs_direct_complete(dreq); 750 } 751} 752 753static void nfs_direct_write_complete(struct nfs_direct_req *dreq) 754{ 755 queue_work(nfsiod_workqueue, &dreq->work); /* Calls nfs_direct_write_schedule_work */ --- 301 unchanged lines hidden --- | 776 nfs_zap_mapping(dreq->inode, dreq->inode->i_mapping); 777 nfs_direct_complete(dreq); 778 } 779} 780 781static void nfs_direct_write_complete(struct nfs_direct_req *dreq) 782{ 783 queue_work(nfsiod_workqueue, &dreq->work); /* Calls nfs_direct_write_schedule_work */ --- 301 unchanged lines hidden --- |