diff options
Diffstat (limited to 'fs/ext4/ioctl.c')
-rw-r--r-- | fs/ext4/ioctl.c | 65 |
1 files changed, 31 insertions, 34 deletions
diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c index f18bfe37aff8..a56796814d6a 100644 --- a/fs/ext4/ioctl.c +++ b/fs/ext4/ioctl.c | |||
@@ -21,6 +21,7 @@ | |||
21 | long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | 21 | long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) |
22 | { | 22 | { |
23 | struct inode *inode = filp->f_dentry->d_inode; | 23 | struct inode *inode = filp->f_dentry->d_inode; |
24 | struct super_block *sb = inode->i_sb; | ||
24 | struct ext4_inode_info *ei = EXT4_I(inode); | 25 | struct ext4_inode_info *ei = EXT4_I(inode); |
25 | unsigned int flags; | 26 | unsigned int flags; |
26 | 27 | ||
@@ -173,33 +174,8 @@ setversion_out: | |||
173 | mnt_drop_write(filp->f_path.mnt); | 174 | mnt_drop_write(filp->f_path.mnt); |
174 | return err; | 175 | return err; |
175 | } | 176 | } |
176 | #ifdef CONFIG_JBD2_DEBUG | ||
177 | case EXT4_IOC_WAIT_FOR_READONLY: | ||
178 | /* | ||
179 | * This is racy - by the time we're woken up and running, | ||
180 | * the superblock could be released. And the module could | ||
181 | * have been unloaded. So sue me. | ||
182 | * | ||
183 | * Returns 1 if it slept, else zero. | ||
184 | */ | ||
185 | { | ||
186 | struct super_block *sb = inode->i_sb; | ||
187 | DECLARE_WAITQUEUE(wait, current); | ||
188 | int ret = 0; | ||
189 | |||
190 | set_current_state(TASK_INTERRUPTIBLE); | ||
191 | add_wait_queue(&EXT4_SB(sb)->ro_wait_queue, &wait); | ||
192 | if (timer_pending(&EXT4_SB(sb)->turn_ro_timer)) { | ||
193 | schedule(); | ||
194 | ret = 1; | ||
195 | } | ||
196 | remove_wait_queue(&EXT4_SB(sb)->ro_wait_queue, &wait); | ||
197 | return ret; | ||
198 | } | ||
199 | #endif | ||
200 | case EXT4_IOC_GROUP_EXTEND: { | 177 | case EXT4_IOC_GROUP_EXTEND: { |
201 | ext4_fsblk_t n_blocks_count; | 178 | ext4_fsblk_t n_blocks_count; |
202 | struct super_block *sb = inode->i_sb; | ||
203 | int err, err2=0; | 179 | int err, err2=0; |
204 | 180 | ||
205 | err = ext4_resize_begin(sb); | 181 | err = ext4_resize_begin(sb); |
@@ -209,6 +185,13 @@ setversion_out: | |||
209 | if (get_user(n_blocks_count, (__u32 __user *)arg)) | 185 | if (get_user(n_blocks_count, (__u32 __user *)arg)) |
210 | return -EFAULT; | 186 | return -EFAULT; |
211 | 187 | ||
188 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, | ||
189 | EXT4_FEATURE_RO_COMPAT_BIGALLOC)) { | ||
190 | ext4_msg(sb, KERN_ERR, | ||
191 | "Online resizing not supported with bigalloc"); | ||
192 | return -EOPNOTSUPP; | ||
193 | } | ||
194 | |||
212 | err = mnt_want_write(filp->f_path.mnt); | 195 | err = mnt_want_write(filp->f_path.mnt); |
213 | if (err) | 196 | if (err) |
214 | return err; | 197 | return err; |
@@ -250,6 +233,13 @@ setversion_out: | |||
250 | goto mext_out; | 233 | goto mext_out; |
251 | } | 234 | } |
252 | 235 | ||
236 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, | ||
237 | EXT4_FEATURE_RO_COMPAT_BIGALLOC)) { | ||
238 | ext4_msg(sb, KERN_ERR, | ||
239 | "Online defrag not supported with bigalloc"); | ||
240 | return -EOPNOTSUPP; | ||
241 | } | ||
242 | |||
253 | err = mnt_want_write(filp->f_path.mnt); | 243 | err = mnt_want_write(filp->f_path.mnt); |
254 | if (err) | 244 | if (err) |
255 | goto mext_out; | 245 | goto mext_out; |
@@ -270,7 +260,6 @@ mext_out: | |||
270 | 260 | ||
271 | case EXT4_IOC_GROUP_ADD: { | 261 | case EXT4_IOC_GROUP_ADD: { |
272 | struct ext4_new_group_data input; | 262 | struct ext4_new_group_data input; |
273 | struct super_block *sb = inode->i_sb; | ||
274 | int err, err2=0; | 263 | int err, err2=0; |
275 | 264 | ||
276 | err = ext4_resize_begin(sb); | 265 | err = ext4_resize_begin(sb); |
@@ -281,6 +270,13 @@ mext_out: | |||
281 | sizeof(input))) | 270 | sizeof(input))) |
282 | return -EFAULT; | 271 | return -EFAULT; |
283 | 272 | ||
273 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, | ||
274 | EXT4_FEATURE_RO_COMPAT_BIGALLOC)) { | ||
275 | ext4_msg(sb, KERN_ERR, | ||
276 | "Online resizing not supported with bigalloc"); | ||
277 | return -EOPNOTSUPP; | ||
278 | } | ||
279 | |||
284 | err = mnt_want_write(filp->f_path.mnt); | 280 | err = mnt_want_write(filp->f_path.mnt); |
285 | if (err) | 281 | if (err) |
286 | return err; | 282 | return err; |
@@ -337,7 +333,6 @@ mext_out: | |||
337 | 333 | ||
338 | case FITRIM: | 334 | case FITRIM: |
339 | { | 335 | { |
340 | struct super_block *sb = inode->i_sb; | ||
341 | struct request_queue *q = bdev_get_queue(sb->s_bdev); | 336 | struct request_queue *q = bdev_get_queue(sb->s_bdev); |
342 | struct fstrim_range range; | 337 | struct fstrim_range range; |
343 | int ret = 0; | 338 | int ret = 0; |
@@ -348,7 +343,14 @@ mext_out: | |||
348 | if (!blk_queue_discard(q)) | 343 | if (!blk_queue_discard(q)) |
349 | return -EOPNOTSUPP; | 344 | return -EOPNOTSUPP; |
350 | 345 | ||
351 | if (copy_from_user(&range, (struct fstrim_range *)arg, | 346 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, |
347 | EXT4_FEATURE_RO_COMPAT_BIGALLOC)) { | ||
348 | ext4_msg(sb, KERN_ERR, | ||
349 | "FITRIM not supported with bigalloc"); | ||
350 | return -EOPNOTSUPP; | ||
351 | } | ||
352 | |||
353 | if (copy_from_user(&range, (struct fstrim_range __user *)arg, | ||
352 | sizeof(range))) | 354 | sizeof(range))) |
353 | return -EFAULT; | 355 | return -EFAULT; |
354 | 356 | ||
@@ -358,7 +360,7 @@ mext_out: | |||
358 | if (ret < 0) | 360 | if (ret < 0) |
359 | return ret; | 361 | return ret; |
360 | 362 | ||
361 | if (copy_to_user((struct fstrim_range *)arg, &range, | 363 | if (copy_to_user((struct fstrim_range __user *)arg, &range, |
362 | sizeof(range))) | 364 | sizeof(range))) |
363 | return -EFAULT; | 365 | return -EFAULT; |
364 | 366 | ||
@@ -396,11 +398,6 @@ long ext4_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
396 | case EXT4_IOC32_SETVERSION_OLD: | 398 | case EXT4_IOC32_SETVERSION_OLD: |
397 | cmd = EXT4_IOC_SETVERSION_OLD; | 399 | cmd = EXT4_IOC_SETVERSION_OLD; |
398 | break; | 400 | break; |
399 | #ifdef CONFIG_JBD2_DEBUG | ||
400 | case EXT4_IOC32_WAIT_FOR_READONLY: | ||
401 | cmd = EXT4_IOC_WAIT_FOR_READONLY; | ||
402 | break; | ||
403 | #endif | ||
404 | case EXT4_IOC32_GETRSVSZ: | 401 | case EXT4_IOC32_GETRSVSZ: |
405 | cmd = EXT4_IOC_GETRSVSZ; | 402 | cmd = EXT4_IOC_GETRSVSZ; |
406 | break; | 403 | break; |