btrfs: bugfix: handle FS_IOC32_{GETFLAGS,SETFLAGS,GETVERSION} in btrfs_ioctl
32-bit ioctl uses these rather than the regular FS_IOC_* versions. They can be handled in btrfs using the same code. Without this, 32-bit {ch,ls}attr fail. Signed-off-by: Luke Dashjr <luke-jr+git@utopios.org> Cc: stable@vger.kernel.org Reviewed-by: Josef Bacik <jbacik@fb.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
02da2d7217
commit
4c63c2454e
|
@ -4122,6 +4122,7 @@ void btrfs_test_inode_set_ops(struct inode *inode);
|
||||||
|
|
||||||
/* ioctl.c */
|
/* ioctl.c */
|
||||||
long btrfs_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
|
long btrfs_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
|
||||||
|
long btrfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
|
||||||
int btrfs_ioctl_get_supported_features(void __user *arg);
|
int btrfs_ioctl_get_supported_features(void __user *arg);
|
||||||
void btrfs_update_iflags(struct inode *inode);
|
void btrfs_update_iflags(struct inode *inode);
|
||||||
void btrfs_inherit_iflags(struct inode *inode, struct inode *dir);
|
void btrfs_inherit_iflags(struct inode *inode, struct inode *dir);
|
||||||
|
|
|
@ -2956,7 +2956,7 @@ const struct file_operations btrfs_file_operations = {
|
||||||
.fallocate = btrfs_fallocate,
|
.fallocate = btrfs_fallocate,
|
||||||
.unlocked_ioctl = btrfs_ioctl,
|
.unlocked_ioctl = btrfs_ioctl,
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
.compat_ioctl = btrfs_ioctl,
|
.compat_ioctl = btrfs_compat_ioctl,
|
||||||
#endif
|
#endif
|
||||||
.copy_file_range = btrfs_copy_file_range,
|
.copy_file_range = btrfs_copy_file_range,
|
||||||
.clone_file_range = btrfs_clone_file_range,
|
.clone_file_range = btrfs_clone_file_range,
|
||||||
|
|
|
@ -10184,7 +10184,7 @@ static const struct file_operations btrfs_dir_file_operations = {
|
||||||
.iterate = btrfs_real_readdir,
|
.iterate = btrfs_real_readdir,
|
||||||
.unlocked_ioctl = btrfs_ioctl,
|
.unlocked_ioctl = btrfs_ioctl,
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
.compat_ioctl = btrfs_ioctl,
|
.compat_ioctl = btrfs_compat_ioctl,
|
||||||
#endif
|
#endif
|
||||||
.release = btrfs_release_file,
|
.release = btrfs_release_file,
|
||||||
.fsync = btrfs_sync_file,
|
.fsync = btrfs_sync_file,
|
||||||
|
|
|
@ -5552,3 +5552,24 @@ long btrfs_ioctl(struct file *file, unsigned int
|
||||||
|
|
||||||
return -ENOTTY;
|
return -ENOTTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_COMPAT
|
||||||
|
long btrfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||||
|
{
|
||||||
|
switch (cmd) {
|
||||||
|
case FS_IOC32_GETFLAGS:
|
||||||
|
cmd = FS_IOC_GETFLAGS;
|
||||||
|
break;
|
||||||
|
case FS_IOC32_SETFLAGS:
|
||||||
|
cmd = FS_IOC_SETFLAGS;
|
||||||
|
break;
|
||||||
|
case FS_IOC32_GETVERSION:
|
||||||
|
cmd = FS_IOC_GETVERSION;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -ENOIOCTLCMD;
|
||||||
|
}
|
||||||
|
|
||||||
|
return btrfs_ioctl(file, cmd, (unsigned long) compat_ptr(arg));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue