• F
    Btrfs: fix send attempting to rmdir non-empty directories · 9dc44214
    Filipe Manana 提交于
    The incremental send algorithm assumed that it was possible to issue
    a directory remove (rmdir) if the the inode number it was currently
    processing was greater than (or equal) to any inode that referenced
    the directory's inode. This wasn't a valid assumption because any such
    inode might be a child directory that is pending a move/rename operation,
    because it was moved into a directory that has a higher inode number and
    was moved/renamed too - in other words, the case the following commit
    addressed:
    
        9f03740a
        (Btrfs: fix infinite path build loops in incremental send)
    
    This made an incremental send issue an rmdir operation before the
    target directory was actually empty, which made btrfs receive fail.
    Therefore it needs to wait for all pending child directory inodes to
    be moved/renamed before sending an rmdir operation.
    
    Simple steps to reproduce this issue:
    
        $ mkfs.btrfs -f /dev/sdb3
        $ mount /dev/sdb3 /mnt/btrfs
        $ mkdir -p /mnt/btrfs/a/b/c/x
        $ mkdir /mnt/btrfs/a/b/y
        $ btrfs subvolume snapshot -r /mnt/btrfs /mnt/btrfs/snap1
        $ btrfs send /mnt/btrfs/snap1 -f /tmp/base.send
        $ mv /mnt/btrfs/a/b/y /mnt/btrfs/a/b/YY
        $ mv /mnt/btrfs/a/b/c/x /mnt/btrfs/a/b/YY
        $ rmdir /mnt/btrfs/a/b/c
        $ btrfs subvolume snapshot -r /mnt/btrfs /mnt/btrfs/snap2
        $ btrfs send -p /mnt/btrfs/snap1 /mnt/btrfs/snap2 -f /tmp/incremental.send
    
        $ umount /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: rmdir o259-6-0 failed. Directory not empty
    
    A test case for xfstests follows.
    Signed-off-by: NFilipe David Borba Manana <fdmanana@gmail.com>
    Signed-off-by: NJosef Bacik <jbacik@fb.com>
    9dc44214
send.c 131.2 KB