lkml.org 
[lkml]   [2019]   [Nov]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 378/422] f2fs: fix to recover inodes project id during POR
    Date
    From: Chao Yu <yuchao0@huawei.com>

    [ Upstream commit f4474aa6e5e901ee4af21f39f1b9115aaaaec503 ]

    Testcase to reproduce this bug:
    1. mkfs.f2fs -O extra_attr -O project_quota /dev/sdd
    2. mount -t f2fs /dev/sdd /mnt/f2fs
    3. touch /mnt/f2fs/file
    4. sync
    5. chattr -p 1 /mnt/f2fs/file
    6. xfs_io -f /mnt/f2fs/file -c "fsync"
    7. godown /mnt/f2fs
    8. umount /mnt/f2fs
    9. mount -t f2fs /dev/sdd /mnt/f2fs
    10. lsattr -p /mnt/f2fs/file

    0 -----------------N- /mnt/f2fs/file

    But actually, we expect the correct result is:

    1 -----------------N- /mnt/f2fs/file

    The reason is we didn't recover inode.i_projid field during mount,
    fix it.

    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/recovery.c | 13 +++++++++++++
    1 file changed, 13 insertions(+)

    diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c
    index 2c5d2c25d37e3..01636d996ba41 100644
    --- a/fs/f2fs/recovery.c
    +++ b/fs/f2fs/recovery.c
    @@ -218,6 +218,19 @@ static void recover_inode(struct inode *inode, struct page *page)
    inode->i_mode = le16_to_cpu(raw->i_mode);
    i_uid_write(inode, le32_to_cpu(raw->i_uid));
    i_gid_write(inode, le32_to_cpu(raw->i_gid));
    +
    + if (raw->i_inline & F2FS_EXTRA_ATTR) {
    + if (f2fs_sb_has_project_quota(F2FS_I_SB(inode)->sb) &&
    + F2FS_FITS_IN_INODE(raw, le16_to_cpu(raw->i_extra_isize),
    + i_projid)) {
    + projid_t i_projid;
    +
    + i_projid = (projid_t)le32_to_cpu(raw->i_projid);
    + F2FS_I(inode)->i_projid =
    + make_kprojid(&init_user_ns, i_projid);
    + }
    + }
    +
    f2fs_i_size_write(inode, le64_to_cpu(raw->i_size));
    inode->i_atime.tv_sec = le64_to_cpu(raw->i_atime);
    inode->i_ctime.tv_sec = le64_to_cpu(raw->i_ctime);
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-11-19 06:42    [W:4.032 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site