[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20170905223541.20594-3-ross.zwisler@linux.intel.com>
Date: Tue, 5 Sep 2017 16:35:34 -0600
From: Ross Zwisler <ross.zwisler@...ux.intel.com>
To: Andrew Morton <akpm@...ux-foundation.org>,
linux-kernel@...r.kernel.org
Cc: Ross Zwisler <ross.zwisler@...ux.intel.com>,
"Darrick J. Wong" <darrick.wong@...cle.com>,
"Theodore Ts'o" <tytso@....edu>,
Andreas Dilger <adilger.kernel@...ger.ca>,
Christoph Hellwig <hch@....de>,
Dan Williams <dan.j.williams@...el.com>,
Dave Chinner <david@...morbit.com>, Jan Kara <jack@...e.cz>,
linux-ext4@...r.kernel.org, linux-nvdimm@...ts.01.org,
linux-xfs@...r.kernel.org, stable@...r.kernel.org
Subject: [PATCH 2/9] xfs: always use DAX if mount option is used
The current code has an issue where the user can't reliably tell whether or
not DAX is being used to service page faults and I/O when the DAX mount
option is used. In this case each inode within the mounted filesystem
starts with S_DAX set due to the mount option, but it can be cleared if
someone touches the individual inode flag.
For example:
# mount | grep dax
/dev/pmem0 on /mnt type xfs
(rw,relatime,seclabel,attr2,dax,inode64,sunit=4096,swidth=4096,noquota)
# touch /mnt/a /mnt/b # both files currently use DAX
# xfs_io -c "lsattr" /mnt/* # neither has the DAX inode option set
----------e----- /mnt/a
----------e----- /mnt/b
# xfs_io -c "chattr -x" /mnt/a # this clears S_DAX for /mnt/a
# xfs_io -c "lsattr" /mnt/*
----------e----- /mnt/a
----------e----- /mnt/b
We end up with both /mnt/a and /mnt/b looking identical from the point of
view of the mount option and from lsattr, but one is using DAX and the
other is not.
Fix this by always doing DAX I/O when either the mount option is set or
when the DAX inode flag is set. This means that DAX will always be used
for all inodes on a filesystem mounted with -o dax, making the usage
reliable and detectable.
Signed-off-by: Ross Zwisler <ross.zwisler@...ux.intel.com>
CC: stable@...r.kernel.org
---
fs/xfs/xfs_ioctl.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
index 9c0c7a9..8155ddc 100644
--- a/fs/xfs/xfs_ioctl.c
+++ b/fs/xfs/xfs_ioctl.c
@@ -1008,7 +1008,7 @@ xfs_diflags_to_linux(
inode->i_flags |= S_NOATIME;
else
inode->i_flags &= ~S_NOATIME;
- if (xflags & FS_XFLAG_DAX)
+ if ((xflags & FS_XFLAG_DAX) || (ip->i_mount->m_flags & XFS_MOUNT_DAX))
inode->i_flags |= S_DAX;
else
inode->i_flags &= ~S_DAX;
@@ -1091,7 +1091,14 @@ xfs_ioctl_setattr_dax_invalidate(
return -EINVAL;
}
- /* If the DAX state is not changing, we have nothing to do here. */
+ /*
+ * If the DAX state is not changing, we have nothing to do here. If
+ * the DAX mount option was used we will update the DAX inode flag as
+ * the user requested but we will continue to use DAX for I/O and page
+ * faults regardless of how the inode flag is set.
+ */
+ if (ip->i_mount->m_flags & XFS_MOUNT_DAX)
+ return 0;
if ((fa->fsx_xflags & FS_XFLAG_DAX) && IS_DAX(inode))
return 0;
if (!(fa->fsx_xflags & FS_XFLAG_DAX) && !IS_DAX(inode))
--
2.9.5
Powered by blists - more mailing lists