• Miao Xie's avatar
    Btrfs: fix deadlock when mounting a degraded fs · c55f1396
    Miao Xie authored
    The deadlock happened when we mount degraded filesystem, the reproduced
    steps are following:
     # mkfs.btrfs -f -m raid1 -d raid1 <dev0> <dev1>
     # echo 1 > /sys/block/`basename <dev0>`/device/delete
     # mount -o degraded <dev1> <mnt>
    
    The reason was that the counter -- bi_remaining was wrong. If the missing
    or unwriteable device was the last device in the mapping array, we would
    not submit the original bio, so we shouldn't increase bi_remaining of it
    in btrfs_end_bio(), or we would skip the final endio handle.
    
    Fix this problem by adding a flag into btrfs bio structure. If we submit
    the original bio, we will set the flag, and we increase bi_remaining counter,
    or we don't.
    
    Though there is another way to fix it -- decrease bi_remaining counter of the
    original bio when we make sure the original bio is not submitted, this method
    need add more check and is easy to make mistake.
    Signed-off-by: default avatarMiao Xie <miaox@cn.fujitsu.com>
    Reviewed-by: default avatarLiu Bo <bo.li.liu@oracle.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    c55f1396
volumes.h 11.6 KB