• Jaegeuk Kim's avatar
    f2fs: fix double lock for inode page during roll-foward recovery · 60979115
    Jaegeuk Kim authored
    If the inode is same and its data index are needed to truncate, we can fall into
    double lock for its inode page via get_dnode_of_data.
    
    Error case is like this.
    
    1. write data 1, 2, 3, 4, 5 in inode #4.
    2. write data 100, 102, 103, 104, 105 in dnode #6 of inode #4.
    3. sync
    4. update data 100->106 in dnode #6.
    5. fsync inode #4.
    6. power-cut
    
    -> Then,
    1. go back to #3's checkpoint
    2. in do_recover_data, get_dnode_of_data() gets inode #4.
    3. detect 100->106 in dnode #6.
    4. check_index_in_prev_nodes tries to truncate 100 in dnode #6.
    5. to trigger truncate_hole, get_dnode_of_data should grab inode #4.
    6. detect *kernel hang*
    
    This patch should resolve that bug.
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    60979115
recovery.c 12.1 KB