[T][SRU][PATCH 0/1] Btrfs: send, don't send rmdir for same target multiple times
Po-Hsu Lin
po-hsu.lin at canonical.com
Thu Jan 3 11:07:26 UTC 2019
BugLink: https://bugs.launchpad.net/bugs/1809868
== Justification ==
When doing an incremental send on a Btrfs filesystem, 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
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.
This issue can be triggered with 29d6d30f5c8aa58b04f40a58442df3bcaae5a1d5
test in ubuntu_btrfs_kernel_fixes test suite.
The test will fail with:
"ERROR: rmdir o259-6-0 failed. No such file or directory" with Trusty kernel.
Performing full device TRIM (1.00GiB) ...
Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
WARNING! - Btrfs v3.12 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using
fs created label (null) on /dev/loop0
nodesize 16384 leafsize 16384 sectorsize 4096 size 1.00GiB
Btrfs v3.12
Create a readonly snapshot of '/tmp/mnt-29d6d30f5c8aa58b04f40a58442df3bcaae5a1d5' in '/tmp/mnt-29d6d30f5c8aa58b04f40a58442df3bcaae5a1d5/snap1'
At subvol /tmp/mnt-29d6d30f5c8aa58b04f40a58442df3bcaae5a1d5/snap1
Create a readonly snapshot of '/tmp/mnt-29d6d30f5c8aa58b04f40a58442df3bcaae5a1d5' in '/tmp/mnt-29d6d30f5c8aa58b04f40a58442df3bcaae5a1d5/snap2'
At subvol /tmp/mnt-29d6d30f5c8aa58b04f40a58442df3bcaae5a1d5/snap2
Performing full device TRIM (1.00GiB) ...
Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
WARNING! - Btrfs v3.12 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using
fs created label (null) on /dev/loop0
nodesize 16384 leafsize 16384 sectorsize 4096 size 1.00GiB
Btrfs v3.12
At subvol snap1
At snapshot snap2
ERROR: rmdir o259-6-0 failed. No such file or directory
incremental receive failed
== Fix ==
29d6d30f5 (Btrfs: send, don't send rmdir for same target multiple times)
This patch needs to be backported for a variable difference in the
process_recorded_refs function.
In the Trusty tree:
static int process_recorded_refs(struct send_ctx *sctx)
In the patch:
static int process_recorded_refs(struct send_ctx *sctx, int *pending_move)
As the new *pending_move is unrelated here, we can just backport the patch with
the same logic in this function.
A test kernel could be found here:
http://people.canonical.com/~phlin/kernel/lp-1809868-btrfs-2nd-rmdir/
The 29d6d30f5c8aa58b04f40a58442df3bcaae5a1d5 test will pass with this kernel.
== Regression potential ==
Low,
this patch just adds an extra check to skip unnecessary rmdir operations.
Filipe Manana (1):
Btrfs: send, don't send rmdir for same target multiple times
fs/btrfs/send.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
--
2.7.4
More information about the kernel-team
mailing list