diff options
author | David Sterba <dsterba@suse.com> | 2016-08-26 12:53:31 +0200 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2016-09-21 14:12:10 +0200 |
commit | 7febbc9efe9364aeabb7e9430421c70736a5f1f5 (patch) | |
tree | 81a6c086efb2c0e67f8ac423725fe01617ba2552 | |
parent | 5b160549582fe3cd852ce501570232a1cc227338 (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.c | 20 |
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, |