On Wed, Sep 30, 2015 at 8:23 PM, Robin Ruede <r.ru...@gmail.com> wrote: > This fixes a regression introduced by 37b8d27d between v4.1 and v4.2. > > When a snapshot is received, its received_uuid is set to the original > uuid of the subvolume. When that snapshot is then resent to a third > filesystem, it's received_uuid is set to the second uuid > instead of the original one. The same was true for the parent_uuid. > This behaviour was partially changed in 37b8d27d, but in that patch > only the parent_uuid was taken from the real original, > not the uuid itself, causing the search for the parent to fail in > the case below. > > This happens for example when trying to send a series of linked > snapshots (e.g. created by snapper) from the backup file system back to the > original one. > > The following commands reproduce the issue in v4.2.1 > (no error in 4.1.6) > > # setup three test file systems > for i in 1 2 3; do > truncate -s 50M fs$i > mkfs.btrfs fs$i > mkdir $i > mount fs$i $i > done > echo "content" > 1/testfile > btrfs su snapshot -r 1/ 1/snap1 > echo "changed content" > 1/testfile > btrfs su snapshot -r 1/ 1/snap2 > > # works fine: > btrfs send 1/snap1 | btrfs receive 2/ > btrfs send -p 1/snap1 1/snap2 | btrfs receive 2/ > > # ERROR: could not find parent subvolume > btrfs send 2/snap1 | btrfs receive 3/ > btrfs send -p 2/snap1 2/snap2 | btrfs receive 3/ > > Signed-off-by: Robin Ruede <rruede+...@gmail.com> Reviewed-by: Filipe Manana <fdman...@suse.com>
Thanks for fixing this. I've added this to my integration branch [1] and will send soon a pull request to Chris for 4.4, including this fix plus a few others for send/receive, after some more testing. I've also made an xfstest for it [1, 2] [1] http://git.kernel.org/cgit/linux/kernel/git/fdmanana/linux.git/log/?h=integration-4.3 [2] https://patchwork.kernel.org/patch/7363681/ [3] https://patchwork.kernel.org/patch/7363661/ > --- > fs/btrfs/send.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c > index aa72bfd..890933b 100644 > --- a/fs/btrfs/send.c > +++ b/fs/btrfs/send.c > @@ -2351,8 +2351,14 @@ static int send_subvol_begin(struct send_ctx *sctx) > } > > TLV_PUT_STRING(sctx, BTRFS_SEND_A_PATH, name, namelen); > - TLV_PUT_UUID(sctx, BTRFS_SEND_A_UUID, > - sctx->send_root->root_item.uuid); > + > + if (!btrfs_is_empty_uuid(sctx->send_root->root_item.received_uuid)) > + TLV_PUT_UUID(sctx, BTRFS_SEND_A_UUID, > + sctx->send_root->root_item.received_uuid); > + else > + TLV_PUT_UUID(sctx, BTRFS_SEND_A_UUID, > + sctx->send_root->root_item.uuid); > + > TLV_PUT_U64(sctx, BTRFS_SEND_A_CTRANSID, > le64_to_cpu(sctx->send_root->root_item.ctransid)); > if (parent_root) { > -- > 2.6.0 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Filipe David Manana, "Reasonable men adapt themselves to the world. Unreasonable men adapt the world to themselves. That's why all progress depends on unreasonable men." -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html