Btrfs-progs: receive: fix the case that we can not find the subvolume

If we change our default subvolume, btrfs receive will fail to find
subvolume. To fix this problem, we have three ideas:

 1.make btrfs snapshot ioctl support passing source subvolume's objectid.
 2.when we want to using interval subvolume path, we mount it other place
 that use subvolume 5 as its default subvolume.
 3.tell the user to mount the toplevel subvol by himself and run
 receive

We's better use the third approach because first patch will bother kernel
change and the second approach is not very good for power users. So give this
option to users.

Reported-by: Michael Welsh Duggan <mwd@md5i.com>
Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com>
Signed-off-by: Miao Xie <miaox@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
Wang Shilong 2013-12-18 17:56:33 +08:00 committed by Chris Mason
parent f1bb766b3b
commit b5a09775c6
2 changed files with 19 additions and 7 deletions

View File

@ -257,8 +257,15 @@ static int process_snapshot(const char *path, const u8 *uuid, u64 ctransid,
O_RDONLY | O_NOATIME); O_RDONLY | O_NOATIME);
if (args_v2.fd < 0) { if (args_v2.fd < 0) {
ret = -errno; ret = -errno;
if (errno != ENOENT)
fprintf(stderr, "ERROR: open %s failed. %s\n", fprintf(stderr, "ERROR: open %s failed. %s\n",
parent_subvol->path, strerror(-ret)); parent_subvol->path, strerror(-ret));
else
fprintf(stderr,
"It seems that you have changed your default "
"subvolume or you specify other subvolume to\n"
"mount btrfs, try to remount this btrfs filesystem "
"with fs tree, and run btrfs receive again!\n");
goto out; goto out;
} }

View File

@ -660,11 +660,16 @@ Receive subvolumes from stdin.
Receives one or more subvolumes that were previously Receives one or more subvolumes that were previously
sent with btrfs send. The received subvolumes are stored sent with btrfs send. The received subvolumes are stored
into \fI<mount>\fP. into \fI<mount>\fP.
btrfs receive will fail in case a receiving subvolume btrfs receive will fail with the following case:
already exists. It will also fail in case a previously
received subvolume was changed after it was received. 1.a receiving subvolume already exists.
After receiving a subvolume, it is immediately set to
read only. 2.a previously received subvolume was changed after it was received.
3.default subvolume is changed or you don't mount btrfs filesystem with
fs tree.
After receiving a subvolume, it is immediately set to read only.
.RS .RS
\fIOptions\fR \fIOptions\fR