|
@@ -34,7 +34,7 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|
return put_user(flags, (int __user *) arg);
|
|
return put_user(flags, (int __user *) arg);
|
|
case EXT4_IOC_SETFLAGS: {
|
|
case EXT4_IOC_SETFLAGS: {
|
|
handle_t *handle = NULL;
|
|
handle_t *handle = NULL;
|
|
- int err;
|
|
|
|
|
|
+ int err, migrate = 0;
|
|
struct ext4_iloc iloc;
|
|
struct ext4_iloc iloc;
|
|
unsigned int oldflags;
|
|
unsigned int oldflags;
|
|
unsigned int jflag;
|
|
unsigned int jflag;
|
|
@@ -82,6 +82,17 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|
if (!capable(CAP_SYS_RESOURCE))
|
|
if (!capable(CAP_SYS_RESOURCE))
|
|
goto flags_out;
|
|
goto flags_out;
|
|
}
|
|
}
|
|
|
|
+ if (oldflags & EXT4_EXTENTS_FL) {
|
|
|
|
+ /* We don't support clearning extent flags */
|
|
|
|
+ if (!(flags & EXT4_EXTENTS_FL)) {
|
|
|
|
+ err = -EOPNOTSUPP;
|
|
|
|
+ goto flags_out;
|
|
|
|
+ }
|
|
|
|
+ } else if (flags & EXT4_EXTENTS_FL) {
|
|
|
|
+ /* migrate the file */
|
|
|
|
+ migrate = 1;
|
|
|
|
+ flags &= ~EXT4_EXTENTS_FL;
|
|
|
|
+ }
|
|
|
|
|
|
handle = ext4_journal_start(inode, 1);
|
|
handle = ext4_journal_start(inode, 1);
|
|
if (IS_ERR(handle)) {
|
|
if (IS_ERR(handle)) {
|
|
@@ -109,6 +120,10 @@ flags_err:
|
|
|
|
|
|
if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL))
|
|
if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL))
|
|
err = ext4_change_inode_journal_flag(inode, jflag);
|
|
err = ext4_change_inode_journal_flag(inode, jflag);
|
|
|
|
+ if (err)
|
|
|
|
+ goto flags_out;
|
|
|
|
+ if (migrate)
|
|
|
|
+ err = ext4_ext_migrate(inode);
|
|
flags_out:
|
|
flags_out:
|
|
mutex_unlock(&inode->i_mutex);
|
|
mutex_unlock(&inode->i_mutex);
|
|
mnt_drop_write(filp->f_path.mnt);
|
|
mnt_drop_write(filp->f_path.mnt);
|