]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - fs/ext4/ioctl.c
Merge tag 'random_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso...
[karo-tx-linux.git] / fs / ext4 / ioctl.c
index 0c21e22acd74f37ec21f61d6d990fad33ce767db..42b3a73143cf1a3b2cadef40459a50714b6b80d5 100644 (file)
@@ -218,7 +218,7 @@ static int ext4_ioctl_setflags(struct inode *inode,
        unsigned int jflag;
 
        /* Is it quota file? Do not allow user to mess with it */
-       if (IS_NOQUOTA(inode))
+       if (ext4_is_quota_file(inode))
                goto flags_out;
 
        oldflags = ei->i_flags;
@@ -342,7 +342,7 @@ static int ext4_ioctl_setproject(struct file *filp, __u32 projid)
        err = -EPERM;
        inode_lock(inode);
        /* Is it quota file? Do not allow user to mess with it */
-       if (IS_NOQUOTA(inode))
+       if (ext4_is_quota_file(inode))
                goto out_unlock;
 
        err = ext4_get_inode_loc(inode, &iloc);
@@ -373,7 +373,13 @@ static int ext4_ioctl_setproject(struct file *filp, __u32 projid)
 
        transfer_to[PRJQUOTA] = dqget(sb, make_kqid_projid(kprojid));
        if (!IS_ERR(transfer_to[PRJQUOTA])) {
+
+               /* __dquot_transfer() calls back ext4_get_inode_usage() which
+                * counts xattr inode references.
+                */
+               down_read(&EXT4_I(inode)->xattr_sem);
                err = __dquot_transfer(inode, transfer_to);
+               up_read(&EXT4_I(inode)->xattr_sem);
                dqput(transfer_to[PRJQUOTA]);
                if (err)
                        goto out_dirty;