On Thu, Dec 31, 2020 at 09:48:54PM +0100, john terragon wrote: > On Thu, Dec 31, 2020 at 8:42 PM Andrei Borzenkov wrote: > > > > > > > How exactly you create subvolume with the same content? There are many > > possible interpretations. > > > > Zygo wrote that any subvol could be used with -p. So, out of > curiosity, I did the following > > 1) btrfs sub create X > 2) I unpacked some source (linux kernel) in X > 3) btrfs sub create W > 4) I unpacked the same source in W (so X and W have the same content > but they are independent) > 5) btrfs sub snap -r X X_RO > 6) btrfs sub snap -r W W_RO > 7) btrfs send W_RO | btrfs receive /mnt/btrfs2 > 8) btrfs send -p W_RO X_RO | btrfs receive /mnt/btrfs2 > > And this is the exact output of 8) > > At subvol X_RO > At snapshot X_RO > ERROR: chown o257-1648413-0 failed: No such file or directory Yeah, I only checked that send completed without error and produced a smaller stream. I just dumped the send metadata stream from the incremental snapshot now, and it's more or less garbage at the start: # btrfs sub create A # btrfs sub create B # date > A/date # date > B/date # mkdir A/t B/u # btrfs sub snap -r A A_RO # btrfs sub snap -r B B_RO # btrfs send A_RO | btrfs receive --dump At subvol A_RO subvol ./A_RO uuid=995adde4-00ac-5e49-8c6f-f01743def072 transid=7329268 chown ./A_RO/ gid=0 uid=0 chmod ./A_RO/ mode=755 utimes ./A_RO/ atime=2020-12-31T15:51:31-0500 mtime=2020-12-31T15:51:48-0500 ctime=2020-12-31T15:51:48-0500 mkfile ./A_RO/o257-7329268-0 rename ./A_RO/o257-7329268-0 dest=./A_RO/date utimes ./A_RO/ atime=2020-12-31T15:51:31-0500 mtime=2020-12-31T15:51:48-0500 ctime=2020-12-31T15:51:48-0500 write ./A_RO/date offset=0 len=29 chown ./A_RO/date gid=0 uid=0 chmod ./A_RO/date mode=644 utimes ./A_RO/date atime=2020-12-31T15:51:38-0500 mtime=2020-12-31T15:51:38-0500 ctime=2020-12-31T15:51:38-0500 mkdir ./A_RO/o258-7329268-0 rename ./A_RO/o258-7329268-0 dest=./A_RO/t utimes ./A_RO/ atime=2020-12-31T15:51:31-0500 mtime=2020-12-31T15:51:48-0500 ctime=2020-12-31T15:51:48-0500 chown ./A_RO/t gid=0 uid=0 chmod ./A_RO/t mode=755 utimes ./A_RO/t atime=2020-12-31T15:51:48-0500 mtime=2020-12-31T15:51:48-0500 ctime=2020-12-31T15:51:48-0500 # btrfs send B_RO -p A_RO | btrfs receive --dump At subvol B_RO snapshot ./B_RO uuid=4aa7db26-b219-694e-9b3c-f8f737a46bdb transid=7329268 parent_uuid=995adde4-00ac-5e49-8c6f-f01743def072 parent_transid=7329268 utimes ./B_RO/ atime=2020-12-31T15:51:33-0500 mtime=2020-12-31T15:51:52-0500 ctime=2020-12-31T15:51:52-0500 link ./B_RO/date dest=date unlink ./B_RO/date utimes ./B_RO/ atime=2020-12-31T15:51:33-0500 mtime=2020-12-31T15:51:52-0500 ctime=2020-12-31T15:51:52-0500 write ./B_RO/date offset=0 len=29 utimes ./B_RO/date atime=2020-12-31T15:51:41-0500 mtime=2020-12-31T15:51:41-0500 ctime=2020-12-31T15:51:41-0500 rename ./B_RO/t dest=./B_RO/u utimes ./B_RO/ atime=2020-12-31T15:51:33-0500 mtime=2020-12-31T15:51:52-0500 ctime=2020-12-31T15:51:52-0500 utimes ./B_RO/u atime=2020-12-31T15:51:52-0500 mtime=2020-12-31T15:51:52-0500 ctime=2020-12-31T15:51:52-0500 # btrfs send A_RO | btrfs receive -v /tmp/test At subvol A_RO At subvol A_RO receiving subvol A_RO uuid=995adde4-00ac-5e49-8c6f-f01743def072, stransid=7329268 write date - offset=0 length=29 BTRFS_IOC_SET_RECEIVED_SUBVOL uuid=995adde4-00ac-5e49-8c6f-f01743def072, stransid=7329268 # btrfs send B_RO -p A_RO | btrfs receive -v /tmp/test At subvol B_RO At snapshot B_RO receiving snapshot B_RO uuid=4aa7db26-b219-694e-9b3c-f8f737a46bdb, ctransid=7329268 parent_uuid=995adde4-00ac-5e49-8c6f-f01743def072, parent_ctransid=7329268 ERROR: link date -> date failed: File exists The btrfs_compare_trees function can handle arbitrary tree differences, but something happens in one of the support functions and we get a bogus link command. The rest of the stream is OK though: we fill in the contents of B_RO/date, rename A_RO/t to B_RO/u, and update all the timestamps. Oh well, I didn't say send didn't have any bugs. ;)