diff --git a/patches.suse/NFS-commit-errors-should-be-fatal.patch b/patches.suse/NFS-commit-errors-should-be-fatal.patch new file mode 100644 index 0000000..bf87313 --- /dev/null +++ b/patches.suse/NFS-commit-errors-should-be-fatal.patch @@ -0,0 +1,87 @@ +From: Trond Myklebust +Date: Sat, 21 Mar 2020 09:36:13 -0400 +Subject: [PATCH] NFS: commit errors should be fatal +Git-commit: fb5f7f20cdb91f8ef985aef09fa2217c49c38396 +Patch-mainline: v5.7 +References: git-fixes + +Fix the O_DIRECT code to avoid retries if the COMMIT fails with a fatal +error. + +Signed-off-by: Trond Myklebust +Acked-by: NeilBrown + +--- + fs/nfs/direct.c | 32 ++++++++++++++++++++++++++++++-- + 1 file changed, 30 insertions(+), 2 deletions(-) + +--- a/fs/nfs/direct.c ++++ b/fs/nfs/direct.c +@@ -103,6 +103,7 @@ struct nfs_direct_req { + #define NFS_ODIRECT_RESCHED_WRITES (2) /* write verification failed */ + /* for read */ + #define NFS_ODIRECT_SHOULD_DIRTY (3) /* dirty user-space page after read */ ++#define NFS_ODIRECT_DONE INT_MAX /* write verification failed */ + struct nfs_writeverf verf; /* unstable write verifier */ + }; + +@@ -724,8 +725,17 @@ static void nfs_direct_commit_complete(s + struct nfs_page *req; + int status = data->task.tk_status; + ++ if (status < 0) { ++ /* Errors in commit are fatal */ ++ dreq->error = status; ++ dreq->max_count = 0; ++ dreq->count = 0; ++ dreq->flags = NFS_ODIRECT_DONE; ++ } else if (dreq->flags == NFS_ODIRECT_DONE) ++ status = dreq->error; ++ + nfs_init_cinfo_from_dreq(&cinfo, dreq); +- if (status < 0 || nfs_direct_cmp_commit_data_verf(dreq, data)) ++ if (nfs_direct_cmp_commit_data_verf(dreq, data)) + dreq->flags = NFS_ODIRECT_RESCHED_WRITES; + + while (!list_empty(&data->pages)) { +@@ -749,7 +759,8 @@ static void nfs_direct_resched_write(str + struct nfs_direct_req *dreq = cinfo->dreq; + + spin_lock(&dreq->lock); +- dreq->flags = NFS_ODIRECT_RESCHED_WRITES; ++ if (dreq->flags != NFS_ODIRECT_DONE) ++ dreq->flags = NFS_ODIRECT_RESCHED_WRITES; + spin_unlock(&dreq->lock); + nfs_mark_request_commit(req, NULL, cinfo, 0); + } +@@ -772,6 +783,22 @@ static void nfs_direct_commit_schedule(s + nfs_direct_write_reschedule(dreq); + } + ++static void nfs_direct_write_clear_reqs(struct nfs_direct_req *dreq) ++{ ++ struct nfs_commit_info cinfo; ++ struct nfs_page *req; ++ LIST_HEAD(reqs); ++ ++ nfs_init_cinfo_from_dreq(&cinfo, dreq); ++ nfs_direct_write_scan_commit_list(dreq->inode, &reqs, &cinfo); ++ ++ while (!list_empty(&reqs)) { ++ req = nfs_list_entry(reqs.next); ++ nfs_list_remove_request(req); ++ nfs_unlock_and_release_request(req); ++ } ++} ++ + static void nfs_direct_write_schedule_work(struct work_struct *work) + { + struct nfs_direct_req *dreq = container_of(work, struct nfs_direct_req, work); +@@ -786,6 +813,7 @@ static void nfs_direct_write_schedule_wo + nfs_direct_write_reschedule(dreq); + break; + default: ++ nfs_direct_write_clear_reqs(dreq); + nfs_zap_mapping(dreq->inode, dreq->inode->i_mapping); + nfs_direct_complete(dreq); + } diff --git a/series.conf b/series.conf index 6aa7b44..7287766 100644 --- a/series.conf +++ b/series.conf @@ -56541,6 +56541,7 @@ patches.suse/net-dsa-bcm_sf2-Ensure-correct-sub-node-is-parsed.patch patches.suse/NFSv4-pnfs-Return-valid-stateids-in-nfs_layout_find_.patch patches.suse/NFS-direct.c-Fix-memory-leak-of-dreq-when-nfs_get_lo.patch + patches.suse/NFS-commit-errors-should-be-fatal.patch patches.suse/NFS-Fix-memory-leaks-in-nfs_pageio_stop_mirroring.patch patches.suse/0001-mm-memory_hotplug.c-only-respect-mem-parameter-durin.patch patches.suse/include-linux-swapops-h-correct-guards-for-non_swap_entry.patch