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

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

index 7064e40945da8b0b491ccb49b241524d427c501e..056aa040d3eeeca88206e03ef5fa3fb8cb0c846d 100644 (file)
@@ -23,3 +23,4 @@ dmabuf-use-spinlock-to-access-dmabuf-name.patch
 drm-amd-display-check-dmcu-exists-before-loading.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.4/sunrpc-reverting-d03727b248d0-nfsv4-fix-close-not-waiting-for-direct-io-compeletion.patch b/queue-5.4/sunrpc-reverting-d03727b248d0-nfsv4-fix-close-not-waiting-for-direct-io-compeletion.patch
new file mode 100644 (file)
index 0000000..c334796
--- /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
+@@ -367,6 +367,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) {
+@@ -378,10 +380,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)
+@@ -511,10 +510,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;
+       }
+@@ -926,10 +923,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;
+ }