]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.7-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 23 Jul 2020 18:16:30 +0000 (20:16 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 23 Jul 2020 18:16:30 +0000 (20:16 +0200)
added patches:
sunrpc-reverting-d03727b248d0-nfsv4-fix-close-not-waiting-for-direct-io-compeletion.patch

queue-5.7/series
queue-5.7/sunrpc-reverting-d03727b248d0-nfsv4-fix-close-not-waiting-for-direct-io-compeletion.patch [new file with mode: 0644]

index 00e6793c394fb2dda3f901ea5da8f18e63430267..7964cc31e42cd4a316a0d59064044adde879e0ae 100644 (file)
@@ -23,3 +23,4 @@ drm-amd-display-check-dmcu-exists-before-loading.patch
 drm-amd-display-add-dmcub-check-on-renoir.patch
 dm-mpath-pass-io-start-time-to-path-selector.patch
 dm-do-not-use-waitqueue-for-request-based-dm.patch
+sunrpc-reverting-d03727b248d0-nfsv4-fix-close-not-waiting-for-direct-io-compeletion.patch
diff --git a/queue-5.7/sunrpc-reverting-d03727b248d0-nfsv4-fix-close-not-waiting-for-direct-io-compeletion.patch b/queue-5.7/sunrpc-reverting-d03727b248d0-nfsv4-fix-close-not-waiting-for-direct-io-compeletion.patch
new file mode 100644 (file)
index 0000000..72577a8
--- /dev/null
@@ -0,0 +1,84 @@
+From 65caafd0d2145d1dd02072c4ced540624daeab40 Mon Sep 17 00:00:00 2001
+From: Olga Kornievskaia <kolga@netapp.com>
+Date: Wed, 15 Jul 2020 13:04:15 -0400
+Subject: SUNRPC reverting d03727b248d0 ("NFSv4 fix CLOSE not waiting for direct IO compeletion")
+
+From: Olga Kornievskaia <kolga@netapp.com>
+
+commit 65caafd0d2145d1dd02072c4ced540624daeab40 upstream.
+
+Reverting commit d03727b248d0 "NFSv4 fix CLOSE not waiting for
+direct IO compeletion". This patch made it so that fput() by calling
+inode_dio_done() in nfs_file_release() would wait uninterruptably
+for any outstanding directIO to the file (but that wait on IO should
+be killable).
+
+The problem the patch was also trying to address was REMOVE returning
+ERR_ACCESS because the file is still opened, is supposed to be resolved
+by server returning ERR_FILE_OPEN and not ERR_ACCESS.
+
+Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
+Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/nfs/direct.c |   13 ++++---------
+ fs/nfs/file.c   |    1 -
+ 2 files changed, 4 insertions(+), 10 deletions(-)
+
+--- a/fs/nfs/direct.c
++++ b/fs/nfs/direct.c
+@@ -267,6 +267,8 @@ static void nfs_direct_complete(struct n
+ {
+       struct inode *inode = dreq->inode;
++      inode_dio_end(inode);
++
+       if (dreq->iocb) {
+               long res = (long) dreq->error;
+               if (dreq->count != 0) {
+@@ -278,10 +280,7 @@ static void nfs_direct_complete(struct n
+       complete(&dreq->completion);
+-      igrab(inode);
+       nfs_direct_req_release(dreq);
+-      inode_dio_end(inode);
+-      iput(inode);
+ }
+ static void nfs_direct_read_completion(struct nfs_pgio_header *hdr)
+@@ -411,10 +410,8 @@ static ssize_t nfs_direct_read_schedule_
+        * generic layer handle the completion.
+        */
+       if (requested_bytes == 0) {
+-              igrab(inode);
+-              nfs_direct_req_release(dreq);
+               inode_dio_end(inode);
+-              iput(inode);
++              nfs_direct_req_release(dreq);
+               return result < 0 ? result : -EIO;
+       }
+@@ -867,10 +864,8 @@ static ssize_t nfs_direct_write_schedule
+        * generic layer handle the completion.
+        */
+       if (requested_bytes == 0) {
+-              igrab(inode);
+-              nfs_direct_req_release(dreq);
+               inode_dio_end(inode);
+-              iput(inode);
++              nfs_direct_req_release(dreq);
+               return result < 0 ? result : -EIO;
+       }
+--- a/fs/nfs/file.c
++++ b/fs/nfs/file.c
+@@ -83,7 +83,6 @@ nfs_file_release(struct inode *inode, st
+       dprintk("NFS: release(%pD2)\n", filp);
+       nfs_inc_stats(inode, NFSIOS_VFSRELEASE);
+-      inode_dio_wait(inode);
+       nfs_file_clear_open_context(filp);
+       return 0;
+ }