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