diff options
Diffstat (limited to 'fs/btrfs/ioctl.c')
-rw-r--r-- | fs/btrfs/ioctl.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 6dafa857bbb9..d3d9b4abb09b 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -187,7 +187,7 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg) | |||
187 | struct btrfs_inode *binode = BTRFS_I(inode); | 187 | struct btrfs_inode *binode = BTRFS_I(inode); |
188 | struct btrfs_root *root = binode->root; | 188 | struct btrfs_root *root = binode->root; |
189 | struct btrfs_trans_handle *trans; | 189 | struct btrfs_trans_handle *trans; |
190 | unsigned int fsflags; | 190 | unsigned int fsflags, old_fsflags; |
191 | int ret; | 191 | int ret; |
192 | const char *comp = NULL; | 192 | const char *comp = NULL; |
193 | u32 binode_flags = binode->flags; | 193 | u32 binode_flags = binode->flags; |
@@ -212,13 +212,10 @@ static int btrfs_ioctl_setflags(struct file *file, void __user *arg) | |||
212 | inode_lock(inode); | 212 | inode_lock(inode); |
213 | 213 | ||
214 | fsflags = btrfs_mask_fsflags_for_type(inode, fsflags); | 214 | fsflags = btrfs_mask_fsflags_for_type(inode, fsflags); |
215 | if ((fsflags ^ btrfs_inode_flags_to_fsflags(binode->flags)) & | 215 | old_fsflags = btrfs_inode_flags_to_fsflags(binode->flags); |
216 | (FS_APPEND_FL | FS_IMMUTABLE_FL)) { | 216 | ret = vfs_ioc_setflags_prepare(inode, old_fsflags, fsflags); |
217 | if (!capable(CAP_LINUX_IMMUTABLE)) { | 217 | if (ret) |
218 | ret = -EPERM; | 218 | goto out_unlock; |
219 | goto out_unlock; | ||
220 | } | ||
221 | } | ||
222 | 219 | ||
223 | if (fsflags & FS_SYNC_FL) | 220 | if (fsflags & FS_SYNC_FL) |
224 | binode_flags |= BTRFS_INODE_SYNC; | 221 | binode_flags |= BTRFS_INODE_SYNC; |