diff options
author | Wang Shilong <wshilong@ddn.com> | 2016-07-06 03:33:52 +0200 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2016-07-06 03:33:52 +0200 |
commit | 079788d01e7ba9d7366d7bd2a0db9cab5944e85b (patch) | |
tree | edadef9bd88b7f49d8304bf23ce705feacd14409 | |
parent | ext4: validate s_reserved_gdt_blocks on mount (diff) | |
download | linux-079788d01e7ba9d7366d7bd2a0db9cab5944e85b.tar.xz linux-079788d01e7ba9d7366d7bd2a0db9cab5944e85b.zip |
ext4: fix project quota accounting without quota limits enabled
We should always transfer quota accounting, regardless of whether
quota limits are enabled.
Steps to reproduce:
# mkfs.ext4 /dev/sda4 -O quota,project
# mount /dev/sda4 /mnt/test
# cp /bin/bash /mnt/test
# chattr -p 123 /mnt/test/bash
# quota -v -P 123
Signed-off-by: Wang Shilong <wshilong@ddn.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
-rw-r--r-- | fs/ext4/ioctl.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c index 28cc412852af..b5a39b00265e 100644 --- a/fs/ext4/ioctl.c +++ b/fs/ext4/ioctl.c @@ -308,6 +308,7 @@ static int ext4_ioctl_setproject(struct file *filp, __u32 projid) kprojid_t kprojid; struct ext4_iloc iloc; struct ext4_inode *raw_inode; + struct dquot *transfer_to[MAXQUOTAS] = { }; if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_PROJECT)) { @@ -361,17 +362,14 @@ static int ext4_ioctl_setproject(struct file *filp, __u32 projid) if (err) goto out_stop; - if (sb_has_quota_limits_enabled(sb, PRJQUOTA)) { - struct dquot *transfer_to[MAXQUOTAS] = { }; - - transfer_to[PRJQUOTA] = dqget(sb, make_kqid_projid(kprojid)); - if (!IS_ERR(transfer_to[PRJQUOTA])) { - err = __dquot_transfer(inode, transfer_to); - dqput(transfer_to[PRJQUOTA]); - if (err) - goto out_dirty; - } + transfer_to[PRJQUOTA] = dqget(sb, make_kqid_projid(kprojid)); + if (!IS_ERR(transfer_to[PRJQUOTA])) { + err = __dquot_transfer(inode, transfer_to); + dqput(transfer_to[PRJQUOTA]); + if (err) + goto out_dirty; } + EXT4_I(inode)->i_projid = kprojid; inode->i_ctime = ext4_current_time(inode); out_dirty: |