On 11/20/19 8:05 AM, Zygo Blaxell wrote:
On Wed, Nov 20, 2019 at 08:02:43AM +0800, Qu Wenruo wrote:
On 2019/11/19 下午10:38, David Sterba wrote:
On Mon, Nov 18, 2019 at 03:08:00PM +0800, Qu Wenruo wrote:
On 2019/11/18 下午1:32, Qu Wenruo wrote:
On 2019/11/18 上午10:09, Nathan Dehnel wrote:
I have a 10-disk raid10 with a missing device I'm trying to replace. I
get this error when doing it though:
btrfs replace start 1 /dev/bcache0 /mnt
ERROR: target device smaller than source device (required 1000203091968 bytes)
I see that people recommend resizing a disk before replacing it, which
isn't an option for me because it's gone.
Oh, that's indeed a problem.
We should allow to change missing device's size.
I have CCed you with a patch to allow user to *shrink* the missing device.
You can also get the patch from patchwork:
https://patchwork.kernel.org/patch/11249009/
Please give a try, since the device size is pretty small, I believe with
that patch, we can go quick shrink, that means "btrfs fi resize" command
should return immediately.
So it can be recteated eg. on loop devices, where some of them are
slightly smaller, then go missing and replace is started, right?
Replace will still be rejected, but we can do resize of that missing
dev, then replace, as a workaround.
I haven't do the auto-resize for replace yet, since I'm not sure if that
could make cases like replacing 1T device with 10G driver happening.
That case would be much more tolerable if device replace/resize/delete would
stop to check for fatal signals at least between block groups, if not more
often. Currently if you pick the wrong size, the only way to make it stop
is to reboot.
I agree. IMO too
btrfs replace --<option to skip-check|auto-resize>
is better as commented in the patch thread.
Already if you comment out the size checks[1], the replace with
a smaller device works fine. But But you have to manually estimate
the disk size for the actual consumption. So the effort here should
be auto pre-check.
[1]
diff --git a/cmds/replace.c b/cmds/replace.c
index 2321aa156fe2..1a4155d360d6 100644
--- a/cmds/replace.c
+++ b/cmds/replace.c
@@ -246,11 +246,13 @@ static int cmd_replace_start(const struct
cmd_struct *cmd,
goto leave_with_error;
dstdev_size = get_partition_size(dstdev);
+/*
if (srcdev_size > dstdev_size) {
error("target device smaller than source device
(required %llu bytes)",
srcdev_size);
goto leave_with_error;
}
+*/
fddstdev = open(dstdev, O_RDWR);
if (fddstdev < 0) {
diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c
index 9a29d6de9017..86fc0f8653be 100644
--- a/fs/btrfs/dev-replace.c
+++ b/fs/btrfs/dev-replace.c
@@ -214,7 +214,7 @@ static int btrfs_init_dev_replace_tgtdev(struct
btrfs_fs_info *fs_info,
}
}
-
+/*
if (i_size_read(bdev->bd_inode) <
btrfs_device_get_total_bytes(srcdev)) {
btrfs_err(fs_info,
@@ -222,7 +222,7 @@ static int btrfs_init_dev_replace_tgtdev(struct
btrfs_fs_info *fs_info,
ret = -EINVAL;
goto error;
}
-
+*/
device = btrfs_alloc_device(NULL, &devid, NULL);
if (IS_ERR(device)) {
Thanks,
Qu