• Sunmin Jeong's avatar
    f2fs: use meta inode for GC of atomic file · b40a2b00
    Sunmin Jeong authored
    The page cache of the atomic file keeps new data pages which will be
    stored in the COW file. It can also keep old data pages when GCing the
    atomic file. In this case, new data can be overwritten by old data if a
    GC thread sets the old data page as dirty after new data page was
    evicted.
    
    Also, since all writes to the atomic file are redirected to COW inodes,
    GC for the atomic file is not working well as below.
    
    f2fs_gc(gc_type=FG_GC)
      - select A as a victim segment
      do_garbage_collect
        - iget atomic file's inode for block B
        move_data_page
          f2fs_do_write_data_page
            - use dn of cow inode
            - set fio->old_blkaddr from cow inode
        - seg_freed is 0 since block B is still valid
      - goto gc_more and A is selected as victim again
    
    To solve the problem, let's separate GC writes and updates in the atomic
    file by using the meta inode for GC writes.
    
    Fixes: 3db1de0e ("f2fs: change the current atomic write way")
    Cc: stable@vger.kernel.org #v5.19+
    Reviewed-by: default avatarSungjong Seo <sj1557.seo@samsung.com>
    Reviewed-by: default avatarYeongjin Gil <youngjin.gil@samsung.com>
    Signed-off-by: default avatarSunmin Jeong <s_min.jeong@samsung.com>
    Reviewed-by: default avatarChao Yu <chao@kernel.org>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    b40a2b00
gc.c 56.3 KB