summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.com>2016-08-26 12:53:31 +0200
committerDavid Sterba <dsterba@suse.com>2016-09-21 14:12:10 +0200
commit7febbc9efe9364aeabb7e9430421c70736a5f1f5 (patch)
tree81a6c086efb2c0e67f8ac423725fe01617ba2552
parent5b160549582fe3cd852ce501570232a1cc227338 (diff)
btrfs-progs: fi usage: improved error handling in load_device_info
Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r--cmds-fi-usage.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/cmds-fi-usage.c b/cmds-fi-usage.c
index 04d68b18..8764fef6 100644
--- a/cmds-fi-usage.c
+++ b/cmds-fi-usage.c
@@ -535,7 +535,11 @@ static int load_device_info(int fd, struct device_info **device_info_ptr,
}
for (i = 0, ndevs = 0 ; i <= fi_args.max_id ; i++) {
- BUG_ON(ndevs >= fi_args.num_devices);
+ if (ndevs >= fi_args.num_devices) {
+ error("unexpected number of devices: %d >= %llu", ndevs,
+ (unsigned long long)fi_args.num_devices);
+ goto out;
+ }
memset(&dev_info, 0, sizeof(dev_info));
ret = get_device_info(fd, i, &dev_info);
@@ -543,8 +547,7 @@ static int load_device_info(int fd, struct device_info **device_info_ptr,
continue;
if (ret) {
error("cannot get info about device devid=%d", i);
- free(info);
- return ret;
+ goto out;
}
info[ndevs].devid = dev_info.devid;
@@ -559,7 +562,12 @@ static int load_device_info(int fd, struct device_info **device_info_ptr,
++ndevs;
}
- BUG_ON(ndevs != fi_args.num_devices);
+ if (ndevs != fi_args.num_devices) {
+ error("unexpected number of devices: %d != %llu", ndevs,
+ (unsigned long long)fi_args.num_devices);
+ goto out;
+ }
+
qsort(info, fi_args.num_devices,
sizeof(struct device_info), cmp_device_info);
@@ -567,6 +575,10 @@ static int load_device_info(int fd, struct device_info **device_info_ptr,
*device_info_ptr = info;
return 0;
+
+out:
+ free(info);
+ return ret;
}
int load_chunk_and_device_info(int fd, struct chunk_info **chunkinfo,