• Filipe Manana's avatar
    Btrfs: incremental send, don't rename a directory too soon · 84471e24
    Filipe Manana authored
    There's one more case where we can't issue a rename operation for a
    directory as soon as we process it. We used to delay directory renames
    only if they have some ancestor directory with a higher inode number
    that got renamed too, but there's another case where we need to delay
    the rename too - when a directory A is renamed to the old name of a
    directory B but that directory B has its rename delayed because it
    has now (in the send root) an ancestor with a higher inode number that
    was renamed. If we don't delay the directory rename in this case, the
    receiving end of the send stream will attempt to rename A to the old
    name of B before B got renamed to its new name, which results in a
    "directory not empty" error. So fix this by delaying directory renames
    for this case too.
    
    Steps to reproduce:
    
      $ mkfs.btrfs -f /dev/sdb
      $ mount /dev/sdb /mnt
    
      $ mkdir /mnt/a
      $ mkdir /mnt/b
      $ mkdir /mnt/c
      $ touch /mnt/a/file
    
      $ btrfs subvolume snapshot -r /mnt /mnt/snap1
    
      $ mv /mnt/c /mnt/x
      $ mv /mnt/a /mnt/x/y
      $ mv /mnt/b /mnt/a
    
      $ btrfs subvolume snapshot -r /mnt /mnt/snap2
    
      $ btrfs send /mnt/snap1 -f /tmp/1.send
      $ btrfs send -p /mnt/snap1 /mnt/snap2 -f /tmp/2.send
    
      $ mkfs.btrfs -f /dev/sdc
      $ mount /dev/sdc /mnt2
      $ btrfs receive /mnt2 -f /tmp/1.send
      $ btrfs receive /mnt2 -f /tmp/2.send
      ERROR: rename b -> a failed. Directory not empty
    
    A test case for xfstests follows soon.
    Reported-by: default avatarAmes Cornish <ames@cornishes.net>
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    84471e24
send.c 139 KB