]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
fixes for 5.1
authorSasha Levin <sashal@kernel.org>
Wed, 24 Jul 2019 00:35:28 +0000 (20:35 -0400)
committerSasha Levin <sashal@kernel.org>
Wed, 24 Jul 2019 00:35:28 +0000 (20:35 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-5.1/series
queue-5.1/xfs-abort-unaligned-nowait-directio-early.patch [new file with mode: 0644]

index fe7470c9c5ffd77cab062bb112e41c43780c8721..ddfdbb8b14a3929de43af0ddf889124b1cd9d6d2 100644 (file)
@@ -343,3 +343,4 @@ coda-pass-the-host-file-in-vma-vm_file-on-mmap.patch
 include-asm-generic-bug.h-fix-cut-here-for-warn_on-for-__warn_taint-architectures.patch
 resource-fix-locking-in-find_next_iomem_res.patch
 btrfs-correctly-validate-compression-type.patch
+xfs-abort-unaligned-nowait-directio-early.patch
diff --git a/queue-5.1/xfs-abort-unaligned-nowait-directio-early.patch b/queue-5.1/xfs-abort-unaligned-nowait-directio-early.patch
new file mode 100644 (file)
index 0000000..8680324
--- /dev/null
@@ -0,0 +1,51 @@
+From 724b8a9a6f8e82d271f80316799d5b03c5cf1212 Mon Sep 17 00:00:00 2001
+From: "Darrick J. Wong" <darrick.wong@oracle.com>
+Date: Thu, 18 Jul 2019 23:06:17 +0000
+Subject: xfs: abort unaligned nowait directio early
+
+[ Upstream commit 1fdeaea4d92c69fb9f871a787af6ad00f32eeea7 ]
+
+Dave Chinner noticed that xfs_file_dio_aio_write returns EAGAIN without
+dropping the IOLOCK when its deciding not to wait, which means that we
+leak the IOLOCK there.  Since we now make unaligned directio always
+wait, we have the opportunity to bail out before trying to take the
+lock, which should reduce the overhead of this never-gonna-work case
+considerably while also solving the dropped lock problem.
+
+Reported-by: Dave Chinner <david@fromorbit.com>
+Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
+Reviewed-by: Brian Foster <bfoster@redhat.com>
+Reviewed-by: Dave Chinner <dchinner@redhat.com>
+Reviewed-by: Christoph Hellwig <hch@lst.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/xfs/xfs_file.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
+index a7ceae90110e..76748255f843 100644
+--- a/fs/xfs/xfs_file.c
++++ b/fs/xfs/xfs_file.c
+@@ -517,6 +517,9 @@ xfs_file_dio_aio_write(
+       }
+       if (iocb->ki_flags & IOCB_NOWAIT) {
++              /* unaligned dio always waits, bail */
++              if (unaligned_io)
++                      return -EAGAIN;
+               if (!xfs_ilock_nowait(ip, iolock))
+                       return -EAGAIN;
+       } else {
+@@ -536,9 +539,6 @@ xfs_file_dio_aio_write(
+        * xfs_file_aio_write_checks() for other reasons.
+        */
+       if (unaligned_io) {
+-              /* unaligned dio always waits, bail */
+-              if (iocb->ki_flags & IOCB_NOWAIT)
+-                      return -EAGAIN;
+               inode_dio_wait(inode);
+       } else if (iolock == XFS_IOLOCK_EXCL) {
+               xfs_ilock_demote(ip, XFS_IOLOCK_EXCL);
+-- 
+2.20.1
+