Commit 6eccd1f740601f39796bace54c40cd785408e74e

Authored by Ruslan Trofymenko
Committed by Tom Rini
1 parent 37f1811a0b

disk: part: Extend API to get partition info

This patch adds part_get_info_by_dev_and_name_or_num() function which
allows us to get partition info from its number or name. Partition of
interest is specified by string like "device_num:partition_number" or
"device_num#partition_name".

The patch was extracted from [1].

[1] https://android-review.googlesource.com/c/platform/external/u-boot/+/729880/2

Signed-off-by: Ruslan Trofymenko <ruslan.trofymenko@linaro.org>
Signed-off-by: Igor Opaniuk <igor.opaniuk@gmail.com>
Reviewed-by: Alistair Strachan <astrachan@google.com>
Reviewed-by: Sam Protsenko <semen.protsenko@linaro.org>
Reviewed-by: Simon Glass <sjg@chromium.org>

Showing 2 changed files with 89 additions and 0 deletions Side-by-side Diff

... ... @@ -674,6 +674,74 @@
674 674 return part_get_info_by_name_type(dev_desc, name, info, PART_TYPE_ALL);
675 675 }
676 676  
  677 +/**
  678 + * Get partition info from device number and partition name.
  679 + *
  680 + * Parse a device number and partition name string in the form of
  681 + * "device_num#partition_name", for example "0#misc". If the partition
  682 + * is found, sets dev_desc and part_info accordingly with the information
  683 + * of the partition with the given partition_name.
  684 + *
  685 + * @param[in] dev_iface Device interface
  686 + * @param[in] dev_part_str Input string argument, like "0#misc"
  687 + * @param[out] dev_desc Place to store the device description pointer
  688 + * @param[out] part_info Place to store the partition information
  689 + * @return 0 on success, or a negative on error
  690 + */
  691 +static int part_get_info_by_dev_and_name(const char *dev_iface,
  692 + const char *dev_part_str,
  693 + struct blk_desc **dev_desc,
  694 + disk_partition_t *part_info)
  695 +{
  696 + char *ep;
  697 + const char *part_str;
  698 + int dev_num;
  699 +
  700 + part_str = strchr(dev_part_str, '#');
  701 + if (!part_str || part_str == dev_part_str)
  702 + return -EINVAL;
  703 +
  704 + dev_num = simple_strtoul(dev_part_str, &ep, 16);
  705 + if (ep != part_str) {
  706 + /* Not all the first part before the # was parsed. */
  707 + return -EINVAL;
  708 + }
  709 + part_str++;
  710 +
  711 + *dev_desc = blk_get_dev(dev_iface, dev_num);
  712 + if (!*dev_desc) {
  713 + printf("Could not find %s %d\n", dev_iface, dev_num);
  714 + return -EINVAL;
  715 + }
  716 + if (part_get_info_by_name(*dev_desc, part_str, part_info) < 0) {
  717 + printf("Could not find \"%s\" partition\n", part_str);
  718 + return -EINVAL;
  719 + }
  720 + return 0;
  721 +}
  722 +
  723 +int part_get_info_by_dev_and_name_or_num(const char *dev_iface,
  724 + const char *dev_part_str,
  725 + struct blk_desc **dev_desc,
  726 + disk_partition_t *part_info)
  727 +{
  728 + /* Split the part_name if passed as "$dev_num#part_name". */
  729 + if (!part_get_info_by_dev_and_name(dev_iface, dev_part_str,
  730 + dev_desc, part_info))
  731 + return 0;
  732 + /*
  733 + * Couldn't lookup by name, try looking up the partition description
  734 + * directly.
  735 + */
  736 + if (blk_get_device_part_str(dev_iface, dev_part_str,
  737 + dev_desc, part_info, 1) < 0) {
  738 + printf("Couldn't find partition %s %s\n",
  739 + dev_iface, dev_part_str);
  740 + return -EINVAL;
  741 + }
  742 + return 0;
  743 +}
  744 +
677 745 void part_set_generic_name(const struct blk_desc *dev_desc,
678 746 int part_num, char *name)
679 747 {
... ... @@ -202,6 +202,27 @@
202 202 const char *name, disk_partition_t *info);
203 203  
204 204 /**
  205 + * Get partition info from dev number + part name, or dev number + part number.
  206 + *
  207 + * Parse a device number and partition description (either name or number)
  208 + * in the form of device number plus partition name separated by a "#"
  209 + * (like "device_num#partition_name") or a device number plus a partition number
  210 + * separated by a ":". For example both "0#misc" and "0:1" can be valid
  211 + * partition descriptions for a given interface. If the partition is found, sets
  212 + * dev_desc and part_info accordingly with the information of the partition.
  213 + *
  214 + * @param[in] dev_iface Device interface
  215 + * @param[in] dev_part_str Input partition description, like "0#misc" or "0:1"
  216 + * @param[out] dev_desc Place to store the device description pointer
  217 + * @param[out] part_info Place to store the partition information
  218 + * @return 0 on success, or a negative on error
  219 + */
  220 +int part_get_info_by_dev_and_name_or_num(const char *dev_iface,
  221 + const char *dev_part_str,
  222 + struct blk_desc **dev_desc,
  223 + disk_partition_t *part_info);
  224 +
  225 +/**
205 226 * part_set_generic_name() - create generic partition like hda1 or sdb2
206 227 *
207 228 * Helper function for partition tables, which don't hold partition names