diff options
Diffstat (limited to 'fs/ext4/ioctl.c')
| -rw-r--r-- | fs/ext4/ioctl.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c index ca09dd1039ec..9f3044ac6994 100644 --- a/fs/ext4/ioctl.c +++ b/fs/ext4/ioctl.c | |||
| @@ -267,7 +267,26 @@ setversion_out: | |||
| 267 | } | 267 | } |
| 268 | 268 | ||
| 269 | case EXT4_IOC_MIGRATE: | 269 | case EXT4_IOC_MIGRATE: |
| 270 | return ext4_ext_migrate(inode, filp, cmd, arg); | 270 | { |
| 271 | int err; | ||
| 272 | if (!is_owner_or_cap(inode)) | ||
| 273 | return -EACCES; | ||
| 274 | |||
| 275 | err = mnt_want_write(filp->f_path.mnt); | ||
| 276 | if (err) | ||
| 277 | return err; | ||
| 278 | /* | ||
| 279 | * inode_mutex prevent write and truncate on the file. | ||
| 280 | * Read still goes through. We take i_data_sem in | ||
| 281 | * ext4_ext_swap_inode_data before we switch the | ||
| 282 | * inode format to prevent read. | ||
| 283 | */ | ||
| 284 | mutex_lock(&(inode->i_mutex)); | ||
| 285 | err = ext4_ext_migrate(inode); | ||
| 286 | mutex_unlock(&(inode->i_mutex)); | ||
| 287 | mnt_drop_write(filp->f_path.mnt); | ||
| 288 | return err; | ||
| 289 | } | ||
| 271 | 290 | ||
| 272 | default: | 291 | default: |
| 273 | return -ENOTTY; | 292 | return -ENOTTY; |
