• Filipe Manana's avatar
    btrfs: fix hang on snapshot creation after RWF_NOWAIT write · f2cb2f39
    Filipe Manana authored
    If we do a successful RWF_NOWAIT write we end up locking the snapshot lock
    of the inode, through a call to check_can_nocow(), but we never unlock it.
    
    This means the next attempt to create a snapshot on the subvolume will
    hang forever.
    
    Trivial reproducer:
    
      $ mkfs.btrfs -f /dev/sdb
      $ mount /dev/sdb /mnt
    
      $ touch /mnt/foobar
      $ chattr +C /mnt/foobar
      $ xfs_io -d -c "pwrite -S 0xab 0 64K" /mnt/foobar
      $ xfs_io -d -c "pwrite -N -V 1 -S 0xfe 0 64K" /mnt/foobar
    
      $ btrfs subvolume snapshot -r /mnt /mnt/snap
        --> hangs
    
    Fix this by unlocking the snapshot lock if check_can_nocow() returned
    success.
    
    Fixes: edf064e7 ("btrfs: nowait aio support")
    CC: stable@vger.kernel.org # 4.14+
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    f2cb2f39
file.c 93.5 KB