Commit 6eccd1f740601f39796bace54c40cd785408e74e
Committed by
Tom Rini
1 parent
37f1811a0b
Exists in
smarc_8mq_lf_v2020.04
and in
11 other branches
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
disk/part.c
... | ... | @@ -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 | { |
include/part.h
... | ... | @@ -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 |