Message ID | 20180906124436.89193-1-yuchao0@huawei.com |
---|---|
State | New |
Headers | show |
Series | [1/2] f2fs: report error if quota off error during umount | expand |
I merged as one. Please check dev. :) On 09/06, Chao Yu wrote: > 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: Chao Yu <yuchao0@huawei.com> > --- > fs/f2fs/super.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c > index c026aaccf218..328f58647f4c 100644 > --- a/fs/f2fs/super.c > +++ b/fs/f2fs/super.c > @@ -1900,10 +1900,12 @@ void f2fs_quota_off_umount(struct super_block *sb) > for (type = 0; type < 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), Please " > - "run fsck to fix it.", type, err); > + "(type: %d, err: %d, ret:%d), Please " > + "run fsck to fix it.", type, err, ret); > set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR); > } > } > -- > 2.18.0.rc1
I can see it in dev, thanks for merging. ;) On 2018/9/8 6:38, Jaegeuk Kim wrote: > I merged as one. Please check dev. :) > > On 09/06, Chao Yu wrote: >> 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: Chao Yu <yuchao0@huawei.com> >> --- >> fs/f2fs/super.c | 6 ++++-- >> 1 file changed, 4 insertions(+), 2 deletions(-) >> >> diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c >> index c026aaccf218..328f58647f4c 100644 >> --- a/fs/f2fs/super.c >> +++ b/fs/f2fs/super.c >> @@ -1900,10 +1900,12 @@ void f2fs_quota_off_umount(struct super_block *sb) >> for (type = 0; type < 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), Please " >> - "run fsck to fix it.", type, err); >> + "(type: %d, err: %d, ret:%d), Please " >> + "run fsck to fix it.", type, err, ret); >> set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR); >> } >> } >> -- >> 2.18.0.rc1
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 8f026ba226fb..c026aaccf218 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -1874,7 +1874,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)) @@ -1893,9 +1895,18 @@ static int f2fs_quota_off(struct super_block *sb, int type) void f2fs_quota_off_umount(struct super_block *sb) { int type; + int err; - for (type = 0; type < MAXQUOTAS; type++) - f2fs_quota_off(sb, type); + for (type = 0; type < MAXQUOTAS; type++) { + err = f2fs_quota_off(sb, type); + if (err) { + f2fs_msg(sb, KERN_ERR, + "Fail to turn off disk quota " + "(type: %d, err: %d), Please " + "run fsck to fix it.", type, err); + set_sbi_flag(F2FS_SB(sb), SBI_QUOTA_NEED_REPAIR); + } + } } static int f2fs_dquot_commit(struct dquot *dquot)