ext4: fix incorrect quotaoff if the quota feature is enabled
Current ext4 quota should always "usage enabled" if the quota feautre is enabled. But in ext4_orphan_cleanup(), it turn quotas off directly (used for the older journaled quota), so we cannot turn it on again via "quotaon" unless umount and remount ext4. Simple reproduce: mkfs.ext4 -O project,quota /dev/vdb1 mount -o prjquota /dev/vdb1 /mnt chattr -p 123 /mnt chattr +P /mnt touch /mnt/aa /mnt/bb exec 100<>/mnt/aa rm -f /mnt/aa sync echo c > /proc/sysrq-trigger #reboot and mount mount -o prjquota /dev/vdb1 /mnt #query status quotaon -Ppv /dev/vdb1 #output quotaon: Cannot find mountpoint for device /dev/vdb1 quotaon: No correct mountpoint specified. This patch add check for journaled quotas to avoid incorrect quotaoff when ext4 has quota feautre. Signed-off-by: zhangyi (F) <yi.zhang@huawei.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu> Reviewed-by: Jan Kara <jack@suse.cz> Cc: stable@vger.kernel.org # 3.18
This commit is contained in:
Родитель
918dc9d0ab
Коммит
b0a5a9589d
|
@ -2442,7 +2442,7 @@ static void ext4_orphan_cleanup(struct super_block *sb,
|
||||||
#ifdef CONFIG_QUOTA
|
#ifdef CONFIG_QUOTA
|
||||||
/* Needed for iput() to work correctly and not trash data */
|
/* Needed for iput() to work correctly and not trash data */
|
||||||
sb->s_flags |= MS_ACTIVE;
|
sb->s_flags |= MS_ACTIVE;
|
||||||
/* Turn on quotas so that they are updated correctly */
|
/* Turn on journaled quotas so that they are updated correctly */
|
||||||
for (i = 0; i < EXT4_MAXQUOTAS; i++) {
|
for (i = 0; i < EXT4_MAXQUOTAS; i++) {
|
||||||
if (EXT4_SB(sb)->s_qf_names[i]) {
|
if (EXT4_SB(sb)->s_qf_names[i]) {
|
||||||
int ret = ext4_quota_on_mount(sb, i);
|
int ret = ext4_quota_on_mount(sb, i);
|
||||||
|
@ -2510,9 +2510,9 @@ static void ext4_orphan_cleanup(struct super_block *sb,
|
||||||
ext4_msg(sb, KERN_INFO, "%d truncate%s cleaned up",
|
ext4_msg(sb, KERN_INFO, "%d truncate%s cleaned up",
|
||||||
PLURAL(nr_truncates));
|
PLURAL(nr_truncates));
|
||||||
#ifdef CONFIG_QUOTA
|
#ifdef CONFIG_QUOTA
|
||||||
/* Turn quotas off */
|
/* Turn off journaled quotas if they were enabled for orphan cleanup */
|
||||||
for (i = 0; i < EXT4_MAXQUOTAS; i++) {
|
for (i = 0; i < EXT4_MAXQUOTAS; i++) {
|
||||||
if (sb_dqopt(sb)->files[i])
|
if (EXT4_SB(sb)->s_qf_names[i] && sb_dqopt(sb)->files[i])
|
||||||
dquot_quota_off(sb, i);
|
dquot_quota_off(sb, i);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Загрузка…
Ссылка в новой задаче