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

Sean Anderson sean.anderson at seco.com
Mon Feb 1 17:38:02 CET 2021


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 at seco.com>
Reviewed-by: Simon Glass <sjg at 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.29.2



More information about the U-Boot mailing list