Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

fs: prepare for extending file_get/setattr()

We intend to add support for more xflags to selective filesystems and
We cannot rely on copy_struct_from_user() to detect this extension.

In preparation of extending the API, do not allow setting xflags unknown
by this kernel version.

Also do not pass the read-only flags and read-only field fsx_nextents to
filesystem.

These changes should not affect existing chattr programs that use the
ioctl to get fsxattr before setting the new values.

Link: https://lore.kernel.org/linux-fsdevel/20250216164029.20673-4-pali@kernel.org/
Cc: Pali Rohár <pali@kernel.org>
Cc: Andrey Albershteyn <aalbersh@redhat.com>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Andrey Albershteyn <aalbersh@kernel.org>
Link: https://lore.kernel.org/20250630-xattrat-syscall-v6-5-c4e3bc35227b@kernel.org
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>

authored by

Amir Goldstein and committed by
Christian Brauner
276e136b 474b155a

+27 -1
+7 -1
fs/file_attr.c
··· 100 100 int copy_fsxattr_to_user(const struct fileattr *fa, struct fsxattr __user *ufa) 101 101 { 102 102 struct fsxattr xfa; 103 + __u32 mask = FS_XFLAGS_MASK; 103 104 104 105 memset(&xfa, 0, sizeof(xfa)); 105 - xfa.fsx_xflags = fa->fsx_xflags; 106 + xfa.fsx_xflags = fa->fsx_xflags & mask; 106 107 xfa.fsx_extsize = fa->fsx_extsize; 107 108 xfa.fsx_nextents = fa->fsx_nextents; 108 109 xfa.fsx_projid = fa->fsx_projid; ··· 120 119 struct fsxattr __user *ufa) 121 120 { 122 121 struct fsxattr xfa; 122 + __u32 mask = FS_XFLAGS_MASK; 123 123 124 124 if (copy_from_user(&xfa, ufa, sizeof(xfa))) 125 125 return -EFAULT; 126 126 127 + if (xfa.fsx_xflags & ~mask) 128 + return -EOPNOTSUPP; 129 + 127 130 fileattr_fill_xflags(fa, xfa.fsx_xflags); 131 + fa->fsx_xflags &= ~FS_XFLAG_RDONLY_MASK; 128 132 fa->fsx_extsize = xfa.fsx_extsize; 129 133 fa->fsx_nextents = xfa.fsx_nextents; 130 134 fa->fsx_projid = xfa.fsx_projid;
+20
include/linux/fileattr.h
··· 14 14 FS_XFLAG_NODUMP | FS_XFLAG_NOATIME | FS_XFLAG_DAX | \ 15 15 FS_XFLAG_PROJINHERIT) 16 16 17 + /* Read-only inode flags */ 18 + #define FS_XFLAG_RDONLY_MASK \ 19 + (FS_XFLAG_PREALLOC | FS_XFLAG_HASATTR) 20 + 21 + /* Flags to indicate valid value of fsx_ fields */ 22 + #define FS_XFLAG_VALUES_MASK \ 23 + (FS_XFLAG_EXTSIZE | FS_XFLAG_COWEXTSIZE) 24 + 25 + /* Flags for directories */ 26 + #define FS_XFLAG_DIRONLY_MASK \ 27 + (FS_XFLAG_RTINHERIT | FS_XFLAG_NOSYMLINKS | FS_XFLAG_EXTSZINHERIT) 28 + 29 + /* Misc settable flags */ 30 + #define FS_XFLAG_MISC_MASK \ 31 + (FS_XFLAG_REALTIME | FS_XFLAG_NODEFRAG | FS_XFLAG_FILESTREAM) 32 + 33 + #define FS_XFLAGS_MASK \ 34 + (FS_XFLAG_COMMON | FS_XFLAG_RDONLY_MASK | FS_XFLAG_VALUES_MASK | \ 35 + FS_XFLAG_DIRONLY_MASK | FS_XFLAG_MISC_MASK) 36 + 17 37 /* 18 38 * Merged interface for miscellaneous file attributes. 'flags' originates from 19 39 * ext* and 'fsx_flags' from xfs. There's some overlap between the two, which