• Zhaolei's avatar
    btrfs: abort transaction on btrfs_reloc_cow_block() · 93314e3b
    Zhaolei authored
    When btrfs_reloc_cow_block() failed in __btrfs_cow_block(), current
    code just return a err-value to caller, but leave new_created extent
    buffer exist and locked.
    
    Then subsequent code (in relocate) try to lock above eb again,
    and caused deadlock without any dmesg.
    (eb lock use wait_event(), so no lockdep message)
    
    It is hard to do recover work in __btrfs_cow_block() at this error
    point, but we can abort transaction to avoid deadlock and operate on
    unstable state.a
    
    It also helps developer to find wrong place quickly.
    (better than a frozen fs without any dmesg before patch)
    Signed-off-by: default avatarZhao Lei <zhaolei@cn.fujitsu.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    93314e3b
ctree.c 152 KB