diff options
Diffstat (limited to 'fs/ext3/ioctl.c')
-rw-r--r-- | fs/ext3/ioctl.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/fs/ext3/ioctl.c b/fs/ext3/ioctl.c index 88974814783a..f4090bd2f345 100644 --- a/fs/ext3/ioctl.c +++ b/fs/ext3/ioctl.c | |||
@@ -38,7 +38,7 @@ long ext3_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
38 | unsigned int oldflags; | 38 | unsigned int oldflags; |
39 | unsigned int jflag; | 39 | unsigned int jflag; |
40 | 40 | ||
41 | if (!is_owner_or_cap(inode)) | 41 | if (!inode_owner_or_capable(inode)) |
42 | return -EACCES; | 42 | return -EACCES; |
43 | 43 | ||
44 | if (get_user(flags, (int __user *) arg)) | 44 | if (get_user(flags, (int __user *) arg)) |
@@ -123,7 +123,7 @@ flags_out: | |||
123 | __u32 generation; | 123 | __u32 generation; |
124 | int err; | 124 | int err; |
125 | 125 | ||
126 | if (!is_owner_or_cap(inode)) | 126 | if (!inode_owner_or_capable(inode)) |
127 | return -EPERM; | 127 | return -EPERM; |
128 | 128 | ||
129 | err = mnt_want_write(filp->f_path.mnt); | 129 | err = mnt_want_write(filp->f_path.mnt); |
@@ -192,7 +192,7 @@ setversion_out: | |||
192 | if (err) | 192 | if (err) |
193 | return err; | 193 | return err; |
194 | 194 | ||
195 | if (!is_owner_or_cap(inode)) { | 195 | if (!inode_owner_or_capable(inode)) { |
196 | err = -EACCES; | 196 | err = -EACCES; |
197 | goto setrsvsz_out; | 197 | goto setrsvsz_out; |
198 | } | 198 | } |
@@ -276,7 +276,29 @@ group_add_out: | |||
276 | mnt_drop_write(filp->f_path.mnt); | 276 | mnt_drop_write(filp->f_path.mnt); |
277 | return err; | 277 | return err; |
278 | } | 278 | } |
279 | case FITRIM: { | ||
279 | 280 | ||
281 | struct super_block *sb = inode->i_sb; | ||
282 | struct fstrim_range range; | ||
283 | int ret = 0; | ||
284 | |||
285 | if (!capable(CAP_SYS_ADMIN)) | ||
286 | return -EPERM; | ||
287 | |||
288 | if (copy_from_user(&range, (struct fstrim_range *)arg, | ||
289 | sizeof(range))) | ||
290 | return -EFAULT; | ||
291 | |||
292 | ret = ext3_trim_fs(sb, &range); | ||
293 | if (ret < 0) | ||
294 | return ret; | ||
295 | |||
296 | if (copy_to_user((struct fstrim_range *)arg, &range, | ||
297 | sizeof(range))) | ||
298 | return -EFAULT; | ||
299 | |||
300 | return 0; | ||
301 | } | ||
280 | 302 | ||
281 | default: | 303 | default: |
282 | return -ENOTTY; | 304 | return -ENOTTY; |