| From c548a3559b914fca750439e089e0fe0c74a17c1d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 25 Sep 2018 15:35:58 +0800 |
| Subject: f2fs: fix to recover inode's project id during POR |
| |
| 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 |
| |