lkml.org 
[lkml]   [2018]   [Nov]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.19 140/146] f2fs: report error if quota off error during umount
    Date
    From: Yunlei He <heyunlei@huawei.com>

    [ Upstream commit cda9cc595f0bb6ffa51a4efc4b6533dfa4039b4c ]

    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 <heyunlei@huawei.com>
    Signed-off-by: Chao Yu <yuchao0@huawei.com>
    Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/f2fs/super.c | 19 ++++++++++++++++---
    1 file changed, 16 insertions(+), 3 deletions(-)

    diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
    index 896b885f504e..d0d016f21307 100644
    --- a/fs/f2fs/super.c
    +++ b/fs/f2fs/super.c
    @@ -1852,7 +1852,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))
    @@ -1871,9 +1873,20 @@ 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++) {
    + err = f2fs_quota_off(sb, type);
    + if (err) {
    + int ret = dquot_quota_off(sb, type);

    - for (type = 0; type < MAXQUOTAS; type++)
    - f2fs_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);
    + }
    + }
    }

    static int f2fs_get_projid(struct inode *inode, kprojid_t *projid)
    --
    2.17.1
    \
     
     \ /
      Last update: 2018-11-01 00:43    [W:4.080 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site