• Z
    btrfs: Continue write in case of can_not_nocow · 4da2e26a
    Zhao Lei 提交于
    btrfs failed in xfstests btrfs/080 with -o nodatacow.
    
    Can be reproduced by following script:
      DEV=/dev/vdg
      MNT=/mnt/tmp
    
      umount $DEV &>/dev/null
      mkfs.btrfs -f $DEV
      mount -o nodatacow $DEV $MNT
    
      dd if=/dev/zero of=$MNT/test bs=1 count=2048 &
      btrfs subvolume snapshot -r $MNT $MNT/test_snap &
      wait
      --
      We can see dd failed on NO_SPACE.
    
    Reason:
      __btrfs_buffered_write should run cow write when no_cow impossible,
      and current code is designed with above logic.
      But check_can_nocow() have 2 type of return value(0 and <0) on
      can_not_no_cow, and current code only continue write on first case,
      the second case happened in doing subvolume.
    
    Fix:
      Continue write when check_can_nocow() return 0 and <0.
    Reviewed-by: NFilipe Manana <fdmanana@suse.com>
    Signed-off-by: NZhao Lei <zhaolei@cn.fujitsu.com>
    4da2e26a
file.c 79.3 KB