Skip to content

Commit

Permalink
f2fs: report error if quota off error during umount
Browse files Browse the repository at this point in the history
Now, we depend on fsck to ensure quota file data is ok,
so we scan whole partition if checkpoint without umount
flag. It's same for quota off error case, which may make
quota file data inconsistent.

generic/019 reports below error:

 __quota_error: 1160 callbacks suppressed
 Quota error (device zram1): write_blk: dquota write failed
 Quota error (device zram1): qtree_write_dquot: Error -28 occurred while creating quota
 Quota error (device zram1): write_blk: dquota write failed
 Quota error (device zram1): qtree_write_dquot: Error -28 occurred while creating quota
 Quota error (device zram1): write_blk: dquota write failed
 Quota error (device zram1): qtree_write_dquot: Error -28 occurred while creating quota
 Quota error (device zram1): write_blk: dquota write failed
 Quota error (device zram1): qtree_write_dquot: Error -28 occurred while creating quota
 Quota error (device zram1): write_blk: dquota write failed
 Quota error (device zram1): qtree_write_dquot: Error -28 occurred while creating quota
 VFS: Busy inodes after unmount of zram1. Self-destruct in 5 seconds.  Have a nice day...

If we failed in below path due to fail to write dquot block, we will miss
to release quota inode, fix it.

- f2fs_put_super
 - f2fs_quota_off_umount
  - f2fs_quota_off
   - f2fs_quota_sync   <-- failed
   - dquot_quota_off   <-- missed to call

Signed-off-by: Yunlei He <[email protected]>
Signed-off-by: Chao Yu <[email protected]>
Signed-off-by: Jaegeuk Kim <[email protected]>
  • Loading branch information
Yunlei He authored and Jaegeuk Kim committed Oct 31, 2018
1 parent 1603362 commit 781ad02
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions fs/f2fs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -1873,7 +1873,9 @@ static int f2fs_quota_off(struct super_block *sb, int type)
if (!inode || !igrab(inode))
return dquot_quota_off(sb, type);

f2fs_quota_sync(sb, type);
err = f2fs_quota_sync(sb, type);
if (err)
goto out_put;

err = dquot_quota_off(sb, type);
if (err || f2fs_sb_has_quota_ino(sb))
Expand Down Expand Up @@ -1904,9 +1906,20 @@ static int f2fs_quota_off_sysfile(struct super_block *sb, int type)
void f2fs_quota_off_umount(struct super_block *sb)
{
int type;
int err;

for (type = 0; type < F2FS_MAXQUOTAS; type++)
f2fs_quota_off(sb, type);
for (type = 0; type < F2FS_MAXQUOTAS; type++) {
err = f2fs_quota_off(sb, type);
if (err) {
int ret = dquot_quota_off(sb, type);

f2fs_msg(sb, KERN_ERR,
"Fail to turn off disk quota "
"(type: %d, err: %d, ret:%d), Please "
"run fsck to fix it.", type, err, ret);
set_sbi_flag(F2FS_SB(sb), SBI_NEED_FSCK);
}
}
}

#if 0 /* not support */
Expand Down

0 comments on commit 781ad02

Please sign in to comment.