• Filipe David Borba Manana's avatar
    Btrfs: fix send dealing with file renames and directory moves · 03cb4fb9
    Filipe David Borba Manana authored
    This fixes a case that the commit titled:
    
       Btrfs: fix infinite path build loops in incremental send
    
    didn't cover. If the parent-child relationship between 2 directories
    is inverted, both get renamed, and the former parent has a file that
    got renamed too (but remains a child of that directory), the incremental
    send operation would use the file's old path after sending an unlink
    operation for that old path, causing receive to fail on future operations
    like changing owner, permissions or utimes of the corresponding inode.
    
    This is not a regression from the commit mentioned before, as without
    that commit we would fall into the issues that commit fixed, so it's
    just one case that wasn't covered before.
    
    Simple steps to reproduce this issue are:
    
          $ mkfs.btrfs -f /dev/sdb3
          $ mount /dev/sdb3 /mnt/btrfs
          $ mkdir -p /mnt/btrfs/a/b/c/d
          $ touch /mnt/btrfs/a/b/c/d/file
          $ mkdir -p /mnt/btrfs/a/b/x
          $ btrfs subvol snapshot -r /mnt/btrfs /mnt/btrfs/snap1
          $ mv /mnt/btrfs/a/b/x /mnt/btrfs/a/b/c/x2
          $ mv /mnt/btrfs/a/b/c/d /mnt/btrfs/a/b/c/x2/d2
          $ mv /mnt/btrfs/a/b/c/x2/d2/file /mnt/btrfs/a/b/c/x2/d2/file2
          $ btrfs subvol snapshot -r /mnt/btrfs /mnt/btrfs/snap2
          $ btrfs send -p /mnt/btrfs/snap1 /mnt/btrfs/snap2 > /tmp/incremental.send
    
    A patch to update the test btrfs/030 from xfstests, so that it covers
    this case, will be submitted soon.
    Signed-off-by: default avatarFilipe David Borba Manana <fdmanana@gmail.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
    03cb4fb9
send.c 125 KB