• Larry Chen's avatar
    ocfs2: fix deadlock caused by ocfs2_defrag_extent() · e21e5744
    Larry Chen authored
    ocfs2_defrag_extent may fall into deadlock.
    
    ocfs2_ioctl_move_extents
        ocfs2_ioctl_move_extents
          ocfs2_move_extents
            ocfs2_defrag_extent
              ocfs2_lock_allocators_move_extents
    
                ocfs2_reserve_clusters
                  inode_lock GLOBAL_BITMAP_SYSTEM_INODE
    
    	  __ocfs2_flush_truncate_log
                  inode_lock GLOBAL_BITMAP_SYSTEM_INODE
    
    As backtrace shows above, ocfs2_reserve_clusters() will call inode_lock
    against the global bitmap if local allocator has not sufficient cluters.
    Once global bitmap could meet the demand, ocfs2_reserve_cluster will
    return success with global bitmap locked.
    
    After ocfs2_reserve_cluster(), if truncate log is full,
    __ocfs2_flush_truncate_log() will definitely fall into deadlock because
    it needs to inode_lock global bitmap, which has already been locked.
    
    To fix this bug, we could remove from
    ocfs2_lock_allocators_move_extents() the code which intends to lock
    global allocator, and put the removed code after
    __ocfs2_flush_truncate_log().
    
    ocfs2_lock_allocators_move_extents() is referred by 2 places, one is
    here, the other does not need the data allocator context, which means
    this patch does not affect the caller so far.
    
    Link: http://lkml.kernel.org/r/20181101071422.14470-1-lchen@suse.comSigned-off-by: default avatarLarry Chen <lchen@suse.com>
    Reviewed-by: default avatarChangwei Ge <ge.changwei@h3c.com>
    Cc: Mark Fasheh <mark@fasheh.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Junxiao Bi <junxiao.bi@oracle.com>
    Cc: Joseph Qi <jiangqi903@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    e21e5744
move_extents.c 25.6 KB