vfs: only allow FSSETXATTR to set DAX flag on files and dirs
authorDarrick J. Wong <darrick.wong@oracle.com>
Mon, 1 Jul 2019 15:25:36 +0000 (08:25 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Mon, 1 Jul 2019 15:25:36 +0000 (08:25 -0700)
The DAX flag only applies to files and directories, so don't let it get
set for other types of files.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Jan Kara <jack@suse.cz>
fs/inode.c

index 0cbce5a..446d05e 100644 (file)
@@ -2239,6 +2239,14 @@ int vfs_ioc_fssetxattr_check(struct inode *inode, const struct fsxattr *old_fa,
            !S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode))
                return -EINVAL;
 
+       /*
+        * It is only valid to set the DAX flag on regular files and
+        * directories on filesystems.
+        */
+       if ((fa->fsx_xflags & FS_XFLAG_DAX) &&
+           !(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))
+               return -EINVAL;
+
        /* Extent size hints of zero turn off the flags. */
        if (fa->fsx_extsize == 0)
                fa->fsx_xflags &= ~(FS_XFLAG_EXTSIZE | FS_XFLAG_EXTSZINHERIT);