vfs: create a generic checking function for FS_IOC_FSSETXATTR
Create a generic checking function for the incoming FS_IOC_FSSETXATTR fsxattr values so that we can standardize some of the implementation behaviors. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Jan Kara <jack@suse.cz>
This commit is contained in:
@@ -721,6 +721,17 @@ static int ext4_ioctl_check_project(struct inode *inode, struct fsxattr *fa)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ext4_fill_fsxattr(struct inode *inode, struct fsxattr *fa)
|
||||
{
|
||||
struct ext4_inode_info *ei = EXT4_I(inode);
|
||||
|
||||
simple_fill_fsxattr(fa, ext4_iflags_to_xflags(ei->i_flags &
|
||||
EXT4_FL_USER_VISIBLE));
|
||||
|
||||
if (ext4_has_feature_project(inode->i_sb))
|
||||
fa->fsx_projid = from_kprojid(&init_user_ns, ei->i_projid);
|
||||
}
|
||||
|
||||
long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct inode *inode = file_inode(filp);
|
||||
@@ -1089,13 +1100,7 @@ resizefs_out:
|
||||
{
|
||||
struct fsxattr fa;
|
||||
|
||||
memset(&fa, 0, sizeof(struct fsxattr));
|
||||
fa.fsx_xflags = ext4_iflags_to_xflags(ei->i_flags & EXT4_FL_USER_VISIBLE);
|
||||
|
||||
if (ext4_has_feature_project(inode->i_sb)) {
|
||||
fa.fsx_projid = (__u32)from_kprojid(&init_user_ns,
|
||||
EXT4_I(inode)->i_projid);
|
||||
}
|
||||
ext4_fill_fsxattr(inode, &fa);
|
||||
|
||||
if (copy_to_user((struct fsxattr __user *)arg,
|
||||
&fa, sizeof(fa)))
|
||||
@@ -1104,7 +1109,7 @@ resizefs_out:
|
||||
}
|
||||
case EXT4_IOC_FSSETXATTR:
|
||||
{
|
||||
struct fsxattr fa;
|
||||
struct fsxattr fa, old_fa;
|
||||
int err;
|
||||
|
||||
if (copy_from_user(&fa, (struct fsxattr __user *)arg,
|
||||
@@ -1127,7 +1132,11 @@ resizefs_out:
|
||||
return err;
|
||||
|
||||
inode_lock(inode);
|
||||
ext4_fill_fsxattr(inode, &old_fa);
|
||||
err = ext4_ioctl_check_project(inode, &fa);
|
||||
if (err)
|
||||
goto out;
|
||||
err = vfs_ioc_fssetxattr_check(inode, &old_fa, &fa);
|
||||
if (err)
|
||||
goto out;
|
||||
flags = (ei->i_flags & ~EXT4_FL_XFLAG_VISIBLE) |
|
||||
|
Reference in New Issue
Block a user