mirror of
https://github.com/torvalds/linux.git
synced 2026-01-12 00:42:35 +08:00
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>
This commit is contained in:
committed by
Christian Brauner
parent
474b155adf
commit
276e136bff
@@ -100,9 +100,10 @@ EXPORT_SYMBOL(vfs_fileattr_get);
|
||||
int copy_fsxattr_to_user(const struct fileattr *fa, struct fsxattr __user *ufa)
|
||||
{
|
||||
struct fsxattr xfa;
|
||||
__u32 mask = FS_XFLAGS_MASK;
|
||||
|
||||
memset(&xfa, 0, sizeof(xfa));
|
||||
xfa.fsx_xflags = fa->fsx_xflags;
|
||||
xfa.fsx_xflags = fa->fsx_xflags & mask;
|
||||
xfa.fsx_extsize = fa->fsx_extsize;
|
||||
xfa.fsx_nextents = fa->fsx_nextents;
|
||||
xfa.fsx_projid = fa->fsx_projid;
|
||||
@@ -119,11 +120,16 @@ static int copy_fsxattr_from_user(struct fileattr *fa,
|
||||
struct fsxattr __user *ufa)
|
||||
{
|
||||
struct fsxattr xfa;
|
||||
__u32 mask = FS_XFLAGS_MASK;
|
||||
|
||||
if (copy_from_user(&xfa, ufa, sizeof(xfa)))
|
||||
return -EFAULT;
|
||||
|
||||
if (xfa.fsx_xflags & ~mask)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
fileattr_fill_xflags(fa, xfa.fsx_xflags);
|
||||
fa->fsx_xflags &= ~FS_XFLAG_RDONLY_MASK;
|
||||
fa->fsx_extsize = xfa.fsx_extsize;
|
||||
fa->fsx_nextents = xfa.fsx_nextents;
|
||||
fa->fsx_projid = xfa.fsx_projid;
|
||||
|
||||
@@ -14,6 +14,26 @@
|
||||
FS_XFLAG_NODUMP | FS_XFLAG_NOATIME | FS_XFLAG_DAX | \
|
||||
FS_XFLAG_PROJINHERIT)
|
||||
|
||||
/* Read-only inode flags */
|
||||
#define FS_XFLAG_RDONLY_MASK \
|
||||
(FS_XFLAG_PREALLOC | FS_XFLAG_HASATTR)
|
||||
|
||||
/* Flags to indicate valid value of fsx_ fields */
|
||||
#define FS_XFLAG_VALUES_MASK \
|
||||
(FS_XFLAG_EXTSIZE | FS_XFLAG_COWEXTSIZE)
|
||||
|
||||
/* Flags for directories */
|
||||
#define FS_XFLAG_DIRONLY_MASK \
|
||||
(FS_XFLAG_RTINHERIT | FS_XFLAG_NOSYMLINKS | FS_XFLAG_EXTSZINHERIT)
|
||||
|
||||
/* Misc settable flags */
|
||||
#define FS_XFLAG_MISC_MASK \
|
||||
(FS_XFLAG_REALTIME | FS_XFLAG_NODEFRAG | FS_XFLAG_FILESTREAM)
|
||||
|
||||
#define FS_XFLAGS_MASK \
|
||||
(FS_XFLAG_COMMON | FS_XFLAG_RDONLY_MASK | FS_XFLAG_VALUES_MASK | \
|
||||
FS_XFLAG_DIRONLY_MASK | FS_XFLAG_MISC_MASK)
|
||||
|
||||
/*
|
||||
* Merged interface for miscellaneous file attributes. 'flags' originates from
|
||||
* ext* and 'fsx_flags' from xfs. There's some overlap between the two, which
|
||||
|
||||
Reference in New Issue
Block a user