[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20200208193445.27421-7-ira.weiny@intel.com>
Date: Sat, 8 Feb 2020 11:34:39 -0800
From: ira.weiny@...el.com
To: linux-kernel@...r.kernel.org
Cc: Ira Weiny <ira.weiny@...el.com>,
Alexander Viro <viro@...iv.linux.org.uk>,
"Darrick J. Wong" <darrick.wong@...cle.com>,
Dan Williams <dan.j.williams@...el.com>,
Dave Chinner <david@...morbit.com>,
Christoph Hellwig <hch@....de>,
"Theodore Y. Ts'o" <tytso@....edu>, Jan Kara <jack@...e.cz>,
linux-ext4@...r.kernel.org, linux-xfs@...r.kernel.org,
linux-fsdevel@...r.kernel.org
Subject: [PATCH v3 06/12] fs/xfs: Check if the inode supports DAX under lock
From: Ira Weiny <ira.weiny@...el.com>
One of the checks for an inode supporting DAX is if the inode is
reflinked. During a non-DAX to DAX state change we could race with
the file being reflinked and end up with a reflinked file being in DAX
state.
Prevent this race by checking for DAX support under the MMAP_LOCK.
Signed-off-by: Ira Weiny <ira.weiny@...el.com>
---
fs/xfs/xfs_ioctl.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
index da1eb2bdb386..4ff402fd6636 100644
--- a/fs/xfs/xfs_ioctl.c
+++ b/fs/xfs/xfs_ioctl.c
@@ -1194,10 +1194,6 @@ xfs_ioctl_setattr_dax_invalidate(
*join_flags = 0;
- if ((fa->fsx_xflags & FS_XFLAG_DAX) == FS_XFLAG_DAX &&
- !xfs_inode_supports_dax(ip))
- return -EINVAL;
-
/* If the DAX state is not changing, we have nothing to do here. */
if ((fa->fsx_xflags & FS_XFLAG_DAX) &&
(ip->i_d.di_flags2 & XFS_DIFLAG2_DAX))
@@ -1211,6 +1207,13 @@ xfs_ioctl_setattr_dax_invalidate(
/* lock, flush and invalidate mapping in preparation for flag change */
xfs_ilock(ip, XFS_MMAPLOCK_EXCL | XFS_IOLOCK_EXCL);
+
+ if ((fa->fsx_xflags & FS_XFLAG_DAX) == FS_XFLAG_DAX &&
+ !xfs_inode_supports_dax(ip)) {
+ error = -EINVAL;
+ goto out_unlock;
+ }
+
error = filemap_write_and_wait(inode->i_mapping);
if (error)
goto out_unlock;
--
2.21.0
Powered by blists - more mailing lists