ACK: [T][SRU][PATCH 1/1] Btrfs: send, don't send rmdir for same target multiple times
Stefan Bader
stefan.bader at canonical.com
Wed Jan 9 10:49:05 UTC 2019
On 03.01.19 12:07, Po-Hsu Lin wrote:
> From: Filipe Manana <fdmanana at gmail.com>
>
> BugLink: https://bugs.launchpad.net/bugs/1809868
>
> When doing an incremental send, if we delete a directory that has N > 1
> hardlinks for the same file and that file has the highest inode number
> inside the directory contents, an incremental send would send N times an
> rmdir operation against the directory. This made the btrfs receive command
> fail on the second rmdir instruction, as the target directory didn't exist
> anymore.
>
> Steps to reproduce the issue:
>
> $ mkfs.btrfs -f /dev/sdb3
> $ mount /dev/sdb3 /mnt/btrfs
> $ mkdir -p /mnt/btrfs/a/b/c
> $ echo 'ola mundo' > /mnt/btrfs/a/b/c/foo.txt
> $ ln /mnt/btrfs/a/b/c/foo.txt /mnt/btrfs/a/b/c/bar.txt
> $ btrfs subvolume snapshot -r /mnt/btrfs /mnt/btrfs/snap1
> $ btrfs send /mnt/btrfs/snap1 -f /tmp/base.send
> $ rm -f /mnt/btrfs/a/b/c/foo.txt
> $ rm -f /mnt/btrfs/a/b/c/bar.txt
> $ 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. No such file or directory
>
> A test case for xfstests follows.
>
> Signed-off-by: Filipe David Borba Manana <fdmanana at gmail.com>
> Signed-off-by: Josef Bacik <jbacik at fb.com>
> (backported from commit 29d6d30f5c8aa58b04f40a58442df3bcaae5a1d5)
> Signed-off-by: Po-Hsu Lin <po-hsu.lin at canonical.com>
Acked-by: Stefan Bader <stefan.bader at canonical.com>
> ---
> fs/btrfs/send.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
> index d553752..9cc2ef0 100644
> --- a/fs/btrfs/send.c
> +++ b/fs/btrfs/send.c
> @@ -2686,6 +2686,7 @@ static int process_recorded_refs(struct send_ctx *sctx)
> u64 ow_gen;
> int did_overwrite = 0;
> int is_orphan = 0;
> + u64 last_dir_ino_rm = 0;
>
> verbose_printk("btrfs: process_recorded_refs %llu\n", sctx->cur_ino);
>
> @@ -2941,7 +2942,8 @@ verbose_printk("btrfs: process_recorded_refs %llu\n", sctx->cur_ino);
> ret = send_utimes(sctx, cur->dir, cur->dir_gen);
> if (ret < 0)
> goto out;
> - } else if (ret == inode_state_did_delete) {
> + } else if (ret == inode_state_did_delete &&
> + cur->dir != last_dir_ino_rm) {
> ret = can_rmdir(sctx, cur->dir, sctx->cur_ino);
> if (ret < 0)
> goto out;
> @@ -2953,6 +2955,7 @@ verbose_printk("btrfs: process_recorded_refs %llu\n", sctx->cur_ino);
> ret = send_rmdir(sctx, valid_path);
> if (ret < 0)
> goto out;
> + last_dir_ino_rm = cur->dir;
> }
> }
> }
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20190109/68c2f937/attachment.sig>
More information about the kernel-team
mailing list