]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/ext4/ioctl.c
ext4: elevate write count for migrate ioctl
[linux-2.6-omap-h63xx.git] / fs / ext4 / ioctl.c
index ca09dd1039ec71d3adc983a5bef5f3d6d2647886..9f3044ac6994a52e7be4211f185f8c81665e296b 100644 (file)
@@ -267,7 +267,26 @@ setversion_out:
        }
 
        case EXT4_IOC_MIGRATE:
-               return ext4_ext_migrate(inode, filp, cmd, arg);
+       {
+               int err;
+               if (!is_owner_or_cap(inode))
+                       return -EACCES;
+
+               err = mnt_want_write(filp->f_path.mnt);
+               if (err)
+                       return err;
+               /*
+                * inode_mutex prevent write and truncate on the file.
+                * Read still goes through. We take i_data_sem in
+                * ext4_ext_swap_inode_data before we switch the
+                * inode format to prevent read.
+                */
+               mutex_lock(&(inode->i_mutex));
+               err = ext4_ext_migrate(inode);
+               mutex_unlock(&(inode->i_mutex));
+               mnt_drop_write(filp->f_path.mnt);
+               return err;
+       }
 
        default:
                return -ENOTTY;