btrfs-progs: handle error in the btrfs_prepare_device
authorAnand Jain <anand.jain@oracle.com>
Wed, 18 Dec 2013 04:07:55 +0000 (12:07 +0800)
committerChris Mason <clm@fb.com>
Fri, 31 Jan 2014 16:22:21 +0000 (08:22 -0800)
this patch will handle the strerror reporting of the error instead of
printing errno,  and also replaced the BUG_ON with the error handling

Signed-off-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Chris Mason <clm@fb.com>
cmds-device.c
cmds-replace.c
mkfs.c
utils.c

index ea20919..5be8330 100644 (file)
@@ -111,13 +111,11 @@ static int cmd_add_dev(int argc, char **argv)
 
                res = btrfs_prepare_device(devfd, argv[i], 1, &dev_block_count,
                                           0, &mixed, discard);
+               close(devfd);
                if (res) {
-                       fprintf(stderr, "ERROR: Unable to init '%s'\n", argv[i]);
-                       close(devfd);
                        ret++;
-                       continue;
+                       goto error_out;
                }
-               close(devfd);
 
                strncpy_null(ioctl_args.name, argv[i]);
                res = ioctl(fdmnt, BTRFS_IOC_ADD_DEV, &ioctl_args);
@@ -130,6 +128,7 @@ static int cmd_add_dev(int argc, char **argv)
 
        }
 
+error_out:
        close_file_or_dir(fdmnt, dirstream);
        return !!ret;
 }
index d9b0940..c683d6c 100644 (file)
@@ -276,12 +276,11 @@ static int cmd_start_replace(int argc, char **argv)
        }
        strncpy((char *)start_args.start.tgtdev_name, dstdev,
                BTRFS_DEVICE_PATH_NAME_MAX);
-       if (btrfs_prepare_device(fddstdev, dstdev, 1, &dstdev_block_count, 0,
-                                &mixed, 0)) {
-               fprintf(stderr, "Error: Failed to prepare device '%s'\n",
-                       dstdev);
+       ret = btrfs_prepare_device(fddstdev, dstdev, 1, &dstdev_block_count, 0,
+                                &mixed, 0);
+       if (ret)
                goto leave_with_error;
-       }
+
        close(fddstdev);
        fddstdev = -1;
 
diff --git a/mkfs.c b/mkfs.c
index 80977ad..aaea368 100644 (file)
--- a/mkfs.c
+++ b/mkfs.c
@@ -1445,6 +1445,10 @@ int main(int ac, char **av)
                first_file = file;
                ret = btrfs_prepare_device(fd, file, zero_end, &dev_block_count,
                                           block_count, &mixed, discard);
+               if (ret) {
+                       close(fd);
+                       exit(1);
+               }
                if (block_count && block_count > dev_block_count) {
                        fprintf(stderr, "%s is smaller than requested size\n", file);
                        exit(1);
@@ -1552,8 +1556,11 @@ int main(int ac, char **av)
                }
                ret = btrfs_prepare_device(fd, file, zero_end, &dev_block_count,
                                           block_count, &mixed, discard);
+               if (ret) {
+                       close(fd);
+                       exit(1);
+               }
                mixed = old_mixed;
-               BUG_ON(ret);
 
                ret = btrfs_add_to_fsid(trans, root, fd, file, dev_block_count,
                                        sectorsize, sectorsize, sectorsize);
diff --git a/utils.c b/utils.c
index 9fd8710..ad78a7f 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -581,13 +581,13 @@ int btrfs_prepare_device(int fd, char *file, int zero_end, u64 *block_count_ret,
        ret = fstat(fd, &st);
        if (ret < 0) {
                fprintf(stderr, "unable to stat %s\n", file);
-               exit(1);
+               return 1;
        }
 
        block_count = btrfs_device_size(fd, &st);
        if (block_count == 0) {
                fprintf(stderr, "unable to find %s size\n", file);
-               exit(1);
+               return 1;
        }
        if (max_block_count)
                block_count = min(block_count, max_block_count);
@@ -612,26 +612,35 @@ int btrfs_prepare_device(int fd, char *file, int zero_end, u64 *block_count_ret,
        }
 
        ret = zero_dev_start(fd);
-       if (ret) {
-               fprintf(stderr, "failed to zero device start %d\n", ret);
-               exit(1);
-       }
+       if (ret)
+               goto zero_dev_error;
 
        for (i = 0 ; i < BTRFS_SUPER_MIRROR_MAX; i++) {
                bytenr = btrfs_sb_offset(i);
                if (bytenr >= block_count)
                        break;
-               zero_blocks(fd, bytenr, BTRFS_SUPER_INFO_SIZE);
+               ret = zero_blocks(fd, bytenr, BTRFS_SUPER_INFO_SIZE);
+               if (ret)
+                       goto zero_dev_error;
        }
 
        if (zero_end) {
                ret = zero_dev_end(fd, block_count);
-               if (ret) {
-                       fprintf(stderr, "failed to zero device end %d\n", ret);
-                       exit(1);
-               }
+               if (ret)
+                       goto zero_dev_error;
        }
        *block_count_ret = block_count;
+
+zero_dev_error:
+       if (ret < 0) {
+               fprintf(stderr, "ERROR: failed to zero device '%s' - %s\n",
+                       file, strerror(-ret));
+               return 1;
+       } else if (ret > 0) {
+               fprintf(stderr, "ERROR: failed to zero device '%s' - %d\n",
+                       file, ret);
+               return 1;
+       }
        return 0;
 }