Btrfs: more send support for parent/child dir relationship inversion
diff mbox

Message ID 1391220136-22034-1-git-send-email-fdmanana@gmail.com
State Accepted
Headers show

Commit Message

Filipe Manana Feb. 1, 2014, 2:02 a.m. UTC
The commit titled "Btrfs: fix infinite path build loops in incremental send"
didn't cover a particular case where the parent-child relationship inversion
of directories doesn't imply a rename of the new parent directory. This was
due to a simple logic mistake, a logical and instead of a logical or.

Steps to reproduce:

  $ mkfs.btrfs -f /dev/sdb3
  $ mount /dev/sdb3 /mnt/btrfs
  $ mkdir -p /mnt/btrfs/a/b/bar1/bar2/bar3/bar4
  $ btrfs subvol snapshot -r /mnt/btrfs /mnt/btrfs/snap1
  $ mv /mnt/btrfs/a/b/bar1/bar2/bar3/bar4 /mnt/btrfs/a/b/k44
  $ mv /mnt/btrfs/a/b/bar1/bar2/bar3 /mnt/btrfs/a/b/k44
  $ mv /mnt/btrfs/a/b/bar1/bar2 /mnt/btrfs/a/b/k44/bar3
  $ mv /mnt/btrfs/a/b/bar1 /mnt/btrfs/a/b/k44/bar3/bar2/k11
  $ 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: Filipe David Borba Manana <fdmanana@gmail.com>
---
 fs/btrfs/send.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Filipe Manana Feb. 15, 2014, 6:26 p.m. UTC | #1
On Sat, Feb 1, 2014 at 2:02 AM, Filipe David Borba Manana
<fdmanana@gmail.com> wrote:
> The commit titled "Btrfs: fix infinite path build loops in incremental send"
> didn't cover a particular case where the parent-child relationship inversion
> of directories doesn't imply a rename of the new parent directory. This was
> due to a simple logic mistake, a logical and instead of a logical or.
>
> Steps to reproduce:
>
>   $ mkfs.btrfs -f /dev/sdb3
>   $ mount /dev/sdb3 /mnt/btrfs
>   $ mkdir -p /mnt/btrfs/a/b/bar1/bar2/bar3/bar4
>   $ btrfs subvol snapshot -r /mnt/btrfs /mnt/btrfs/snap1
>   $ mv /mnt/btrfs/a/b/bar1/bar2/bar3/bar4 /mnt/btrfs/a/b/k44
>   $ mv /mnt/btrfs/a/b/bar1/bar2/bar3 /mnt/btrfs/a/b/k44
>   $ mv /mnt/btrfs/a/b/bar1/bar2 /mnt/btrfs/a/b/k44/bar3
>   $ mv /mnt/btrfs/a/b/bar1 /mnt/btrfs/a/b/k44/bar3/bar2/k11
>   $ 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: Filipe David Borba Manana <fdmanana@gmail.com>
> ---

Hi,

Should this go to 3.14 too? It is covered by the test case btrfs/030
for xfstests.

thanks

>  fs/btrfs/send.c |    4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
> index e0b49f6..c47fcef 100644
> --- a/fs/btrfs/send.c
> +++ b/fs/btrfs/send.c
> @@ -3041,8 +3041,8 @@ static int wait_for_parent_move(struct send_ctx *sctx,
>
>         len1 = fs_path_len(path_before);
>         len2 = fs_path_len(path_after);
> -       if ((parent_ino_before != parent_ino_after) && (len1 != len2 ||
> -            memcmp(path_before->start, path_after->start, len1))) {
> +       if (parent_ino_before != parent_ino_after || len1 != len2 ||
> +            memcmp(path_before->start, path_after->start, len1)) {
>                 ret = 1;
>                 goto out;
>         }
> --
> 1.7.9.5
>

Patch
diff mbox

diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
index e0b49f6..c47fcef 100644
--- a/fs/btrfs/send.c
+++ b/fs/btrfs/send.c
@@ -3041,8 +3041,8 @@  static int wait_for_parent_move(struct send_ctx *sctx,
 
 	len1 = fs_path_len(path_before);
 	len2 = fs_path_len(path_after);
-	if ((parent_ino_before != parent_ino_after) && (len1 != len2 ||
-	     memcmp(path_before->start, path_after->start, len1))) {
+	if (parent_ino_before != parent_ino_after || len1 != len2 ||
+	     memcmp(path_before->start, path_after->start, len1)) {
 		ret = 1;
 		goto out;
 	}