lkml.org 
[lkml]   [2020]   [Apr]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.5 036/106] f2fs: fix to update f2fs_super_block fields under sb_lock
    Date
    From: Chao Yu <yuchao0@huawei.com>

    [ Upstream commit a4ba5dfc5c88e49bb03385abfdd28c5a0acfbb54 ]

    Fields in struct f2fs_super_block should be updated under coverage
    of sb_lock, fix to adjust update_sb_metadata() for that rule.

    Fixes: 04f0b2eaa3b3 ("f2fs: ioctl for removing a range from F2FS")
    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/gc.c | 17 +++++++++++++----
    1 file changed, 13 insertions(+), 4 deletions(-)

    diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
    index b3d3996232901..d6705ded0141a 100644
    --- a/fs/f2fs/gc.c
    +++ b/fs/f2fs/gc.c
    @@ -1432,12 +1432,19 @@ static int free_segment_range(struct f2fs_sb_info *sbi, unsigned int start,
    static void update_sb_metadata(struct f2fs_sb_info *sbi, int secs)
    {
    struct f2fs_super_block *raw_sb = F2FS_RAW_SUPER(sbi);
    - int section_count = le32_to_cpu(raw_sb->section_count);
    - int segment_count = le32_to_cpu(raw_sb->segment_count);
    - int segment_count_main = le32_to_cpu(raw_sb->segment_count_main);
    - long long block_count = le64_to_cpu(raw_sb->block_count);
    + int section_count;
    + int segment_count;
    + int segment_count_main;
    + long long block_count;
    int segs = secs * sbi->segs_per_sec;

    + down_write(&sbi->sb_lock);
    +
    + section_count = le32_to_cpu(raw_sb->section_count);
    + segment_count = le32_to_cpu(raw_sb->segment_count);
    + segment_count_main = le32_to_cpu(raw_sb->segment_count_main);
    + block_count = le64_to_cpu(raw_sb->block_count);
    +
    raw_sb->section_count = cpu_to_le32(section_count + secs);
    raw_sb->segment_count = cpu_to_le32(segment_count + segs);
    raw_sb->segment_count_main = cpu_to_le32(segment_count_main + segs);
    @@ -1451,6 +1458,8 @@ static void update_sb_metadata(struct f2fs_sb_info *sbi, int secs)
    raw_sb->devs[last_dev].total_segments =
    cpu_to_le32(dev_segs + segs);
    }
    +
    + up_write(&sbi->sb_lock);
    }

    static void update_fs_metadata(struct f2fs_sb_info *sbi, int secs)
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-04-15 14:49    [W:2.920 / U:0.640 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site