summaryrefslogtreecommitdiff
path: root/cmds-replace.c
diff options
context:
space:
mode:
authorGoffredo Baroncelli <kreijack@gmail.com>2015-08-20 07:24:23 +0200
committerDavid Sterba <dsterba@suse.com>2015-08-31 19:25:12 +0200
commitd7748770a78a4a44f39f4f0e629885a255d24d90 (patch)
treeab3f0170569b9adcf2d4a9fb237c2b444ceb8057 /cmds-replace.c
parentb651b8ca7eb70bf82ebdb0d199c64be0109ff2b1 (diff)
downloadbtrfs-progs-d7748770a78a4a44f39f4f0e629885a255d24d90.tar.gz
btrfs-progs: Add further checks to btrfs replace start command
Add further checks to btrfs replace start command. The following tests where added in user space before calling the ioctl(): 1) check if the new disk is greather or equal to the old one 2) check if the source device is or a block device or a numerical dev-id These checks are already performed in kernel space; however when "btrfs replace start" is ran in background is not possible to show any error returned by the ioctl(), so in case of fail the user had to check dmesg to understand the what happened. Signed-off-by: Goffredo Baroncelli <kreijack@inwind.it> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'cmds-replace.c')
-rw-r--r--cmds-replace.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/cmds-replace.c b/cmds-replace.c
index 2f123cb..47a8e1c 100644
--- a/cmds-replace.c
+++ b/cmds-replace.c
@@ -142,6 +142,8 @@ static int cmd_replace_start(int argc, char **argv)
int do_not_background = 0;
int mixed = 0;
DIR *dirstream = NULL;
+ u64 srcdev_size;
+ u64 dstdev_size;
while ((c = getopt(argc, argv, "Brf")) != -1) {
switch (c) {
@@ -249,16 +251,28 @@ static int cmd_replace_start(int argc, char **argv)
srcdev, path);
goto leave_with_error;
}
- } else if (is_block_device(srcdev)) {
+ srcdev_size = di_args[i].total_bytes;
+ } else if (is_block_device(srcdev) > 0) {
strncpy((char *)start_args.start.srcdev_name, srcdev,
BTRFS_DEVICE_PATH_NAME_MAX);
start_args.start.srcdevid = 0;
+ srcdev_size = get_partition_size(srcdev);
+ } else {
+ fprintf(stderr, "ERROR: source device must be a block device or a devid\n");
+ goto leave_with_error;
}
ret = test_dev_for_mkfs(dstdev, force_using_targetdev);
if (ret)
goto leave_with_error;
+ dstdev_size = get_partition_size(dstdev);
+ if (srcdev_size > dstdev_size) {
+ fprintf(stderr, "ERROR: target device smaller than source device (required %llu bytes)\n",
+ srcdev_size);
+ goto leave_with_error;
+ }
+
fddstdev = open(dstdev, O_RDWR);
if (fddstdev < 0) {
fprintf(stderr, "Unable to open %s\n", dstdev);