[PATCH v2 3/9] part: Give several functions more useful return values

Sean Anderson
2021-01-07T15:20:57Z

Several functions in disk/part.c just return -1 on error. This makes them
return different errnos for different failures. This helps callers
differentiate between failures, even if they cannot read stdout.

Signed-off-by: Sean Anderson <sean.anderson@seco.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
---

(no changes since v1)

disk/part.c | 50 ++++++++++++++++++++++++++++----------------------
1 file changed, 28 insertions(+), 22 deletions(-)

diff --git a/disk/part.c b/disk/part.c
index b69fd345f3..5e354e256f 100644
--- a/disk/part.c
+++ b/disk/part.c
@@ -354,7 +354,7 @@ int part_get_info(struct blk_desc *dev_desc, int part,
}
#endif /* CONFIG_HAVE_BLOCK_DEVICE */

- return -1;
+ return -ENOENT;
}

int part_get_info_whole_disk(struct blk_desc *dev_desc,
@@ -416,7 +416,7 @@ int blk_get_device_by_str(const char *ifname, const char *dev_hwpart_str,
*dev_desc = get_dev_hwpart(ifname, dev, hwpart);
if (!(*dev_desc) || ((*dev_desc)->type == DEV_TYPE_UNKNOWN)) {
debug("** Bad device %s %s **\n", ifname, dev_hwpart_str);
- dev = -ENOENT;
+ dev = -ENODEV;
goto cleanup;
}

@@ -440,7 +440,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
struct blk_desc **dev_desc,
struct disk_partition *info, int allow_whole_dev)
{
- int ret = -1;
+ int ret;
const char *part_str;
char *dup_str = NULL;
const char *dev_str;
@@ -482,7 +482,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
if (0 == strcmp(ifname, "ubi")) {
if (!ubifs_is_mounted()) {
printf("UBIFS not mounted, use ubifsmount to mount volume first!\n");
- return -1;
+ return -EINVAL;
}

*dev_desc = NULL;
@@ -504,6 +504,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
/* If still no dev_part_str, it's an error */
if (!dev_part_str) {
printf("** No device specified **\n");
+ ret = -ENODEV;
goto cleanup;
}

@@ -520,8 +521,10 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,

/* Look up the device */
dev = blk_get_device_by_str(ifname, dev_str, dev_desc);
- if (dev < 0)
+ if (dev < 0) {
+ ret = dev;
goto cleanup;
+ }

/* Convert partition ID string to number */
if (!part_str || !*part_str) {
@@ -538,6 +541,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
if (*ep || (part == 0 && !allow_whole_dev)) {
printf("** Bad partition specification %s %s **\n",
ifname, dev_part_str);
+ ret = -ENOENT;
goto cleanup;
}
}
@@ -551,6 +555,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
if (!(*dev_desc)->lba) {
printf("** Bad device size - %s %s **\n", ifname,
dev_str);
+ ret = -EINVAL;
goto cleanup;
}

@@ -562,6 +567,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
if ((part > 0) || (!allow_whole_dev)) {
printf("** No partition table - %s %s **\n", ifname,
dev_str);
+ ret = -EPROTONOSUPPORT;
goto cleanup;
}

@@ -630,7 +636,6 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
*info = tmpinfo;
} else {
printf("** No valid partitions found **\n");
- ret = -1;
goto cleanup;
}
}
@@ -638,7 +643,7 @@ int blk_get_device_part_str(const char *ifname, const char *dev_part_str,
printf("** Invalid partition type \"%.32s\""
" (expect \"" BOOT_PART_TYPE "\")\n",
info->type);
- ret = -1;
+ ret = -EINVAL;
goto cleanup;
}

@@ -674,7 +679,7 @@ int part_get_info_by_name_type(struct blk_desc *dev_desc, const char *name,
}
}

- return -1;
+ return -ENOENT;
}

int part_get_info_by_name(struct blk_desc *dev_desc, const char *name,
@@ -704,7 +709,7 @@ static int part_get_info_by_dev_and_name(const char *dev_iface,
{
char *ep;
const char *part_str;
- int dev_num;
+ int dev_num, ret;

part_str = strchr(dev_part_str, '#');
if (!part_str || part_str == dev_part_str)
@@ -720,13 +725,12 @@ static int part_get_info_by_dev_and_name(const char *dev_iface,
*dev_desc = blk_get_dev(dev_iface, dev_num);
if (!*dev_desc) {
printf("Could not find %s %d\n", dev_iface, dev_num);
- return -EINVAL;
+ return -ENODEV;
}
- if (part_get_info_by_name(*dev_desc, part_str, part_info) < 0) {
+ ret = part_get_info_by_name(*dev_desc, part_str, part_info);
+ if (ret < 0)
printf("Could not find \"%s\" partition\n", part_str);
- return -EINVAL;
- }
- return 0;
+ return ret;
}

int part_get_info_by_dev_and_name_or_num(const char *dev_iface,
@@ -734,21 +738,23 @@ int part_get_info_by_dev_and_name_or_num(const char *dev_iface,
struct blk_desc **dev_desc,
struct disk_partition *part_info)
{
+ int ret;
+
/* Split the part_name if passed as "$dev_num#part_name". */
- if (!part_get_info_by_dev_and_name(dev_iface, dev_part_str,
- dev_desc, part_info))
- return 0;
+ ret = part_get_info_by_dev_and_name(dev_iface, dev_part_str,
+ dev_desc, part_info);
+ if (ret >= 0)
+ return ret;
/*
* Couldn't lookup by name, try looking up the partition description
* directly.
*/
- if (blk_get_device_part_str(dev_iface, dev_part_str,
- dev_desc, part_info, 1) < 0) {
+ ret = blk_get_device_part_str(dev_iface, dev_part_str,
+ dev_desc, part_info, 1);
+ if (ret < 0)
printf("Couldn't find partition %s %s\n",
dev_iface, dev_part_str);
- return -EINVAL;
- }
- return 0;
+ return ret;
}

void part_set_generic_name(const struct blk_desc *dev_desc,
--
2.25.1