fs/xfs: Create function xfs_inode_should_enable_dax()
authorIra Weiny <ira.weiny@intel.com>
Mon, 4 May 2020 16:02:42 +0000 (09:02 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Mon, 4 May 2020 16:03:43 +0000 (09:03 -0700)
xfs_inode_supports_dax() should reflect if the inode can support DAX not
that it is enabled for DAX.

Change the use of xfs_inode_supports_dax() to reflect only if the inode
and underlying storage support dax.

Add a new function xfs_inode_should_enable_dax() which reflects if the
inode should be enabled for DAX.

Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_iops.c

index 97c0e31241b768cf8c9d49fb3cb28647eca40450..6b9a29a052177cb93441b8e87279f2abe5b7b0c9 100644 (file)
@@ -1238,13 +1238,12 @@ xfs_inode_supports_dax(
 {
        struct xfs_mount        *mp = ip->i_mount;
 
-       /* Only supported on non-reflinked files. */
-       if (!S_ISREG(VFS_I(ip)->i_mode) || xfs_is_reflink_inode(ip))
+       /* Only supported on regular files. */
+       if (!S_ISREG(VFS_I(ip)->i_mode))
                return false;
 
-       /* DAX mount option or DAX iflag must be set. */
-       if (!(mp->m_flags & XFS_MOUNT_DAX_ALWAYS) &&
-           !(ip->i_d.di_flags2 & XFS_DIFLAG2_DAX))
+       /* Only supported on non-reflinked files. */
+       if (xfs_is_reflink_inode(ip))
                return false;
 
        /* Block size must match page size */
@@ -1255,6 +1254,23 @@ xfs_inode_supports_dax(
        return xfs_inode_buftarg(ip)->bt_daxdev != NULL;
 }
 
+static bool
+xfs_inode_should_enable_dax(
+       struct xfs_inode *ip)
+{
+       if (!IS_ENABLED(CONFIG_FS_DAX))
+               return false;
+       if (ip->i_mount->m_flags & XFS_MOUNT_DAX_NEVER)
+               return false;
+       if (!xfs_inode_supports_dax(ip))
+               return false;
+       if (ip->i_mount->m_flags & XFS_MOUNT_DAX_ALWAYS)
+               return true;
+       if (ip->i_d.di_flags2 & XFS_DIFLAG2_DAX)
+               return true;
+       return false;
+}
+
 STATIC void
 xfs_diflags_to_iflags(
        struct inode            *inode,
@@ -1273,7 +1289,7 @@ xfs_diflags_to_iflags(
                inode->i_flags |= S_SYNC;
        if (flags & XFS_DIFLAG_NOATIME)
                inode->i_flags |= S_NOATIME;
-       if (xfs_inode_supports_dax(ip))
+       if (xfs_inode_should_enable_dax(ip))
                inode->i_flags |= S_DAX;
 }