• Filipe Manana's avatar
    Btrfs: incremental send, fix invalid path after dir rename · 2b863a13
    Filipe Manana authored
    This fixes yet one more case not caught by the commit titled:
    
       Btrfs: fix infinite path build loops in incremental send
    
    In this case, even before the initial full send, we have a directory
    which is a child of a directory with a higher inode number. Then we
    perform the initial send, and after we rename both the child and the
    parent, without moving them around. After doing these 2 renames, an
    incremental send sent a rename instruction for the child directory
    which contained an invalid "from" path (referenced the parent's old
    name, not the new one), which made the btrfs receive command fail.
    
    Steps to reproduce:
    
        $ mkfs.btrfs -f /dev/sdb3
        $ mount /dev/sdb3 /mnt/btrfs
        $ mkdir -p /mnt/btrfs/a/b
        $ mkdir /mnt/btrfs/d
        $ mkdir /mnt/btrfs/a/b/c
        $ mv /mnt/btrfs/d /mnt/btrfs/a/b/c
        $ btrfs subvolume snapshot -r /mnt/btrfs /mnt/btrfs/snap1
        $ btrfs send /mnt/btrfs/snap1 -f /tmp/base.send
        $ mv /mnt/btrfs/a/b/c /mnt/btrfs/a/b/x
        $ mv /mnt/btrfs/a/b/x/d /mnt/btrfs/a/b/x/y
        $ btrfs subvolume snapshot -r /mnt/btrfs /mnt/btrfs/snap2
        $ btrfs send -p /mnt/btrfs/snap1 /mnt/btrfs/snap2 -f /tmp/incremental.send
    
        $ umout /mnt/btrfs
        $ mkfs.btrfs -f /dev/sdb3
        $ mount /dev/sdb3 /mnt/btrfs
        $ btrfs receive /mnt/btrfs -f /tmp/base.send
        $ btrfs receive /mnt/btrfs -f /tmp/incremental.send
    
    The second btrfs receive command failed with:
      "ERROR: rename a/b/c/d -> a/b/x/y failed. No such file or directory"
    
    A test case for xfstests follows.
    Signed-off-by: default avatarFilipe David Borba Manana <fdmanana@gmail.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
    2b863a13
send.c 126 KB