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>
This commit is contained in:
parent
37f1811a0b
commit
6eccd1f740
68
disk/part.c
68
disk/part.c
@ -674,6 +674,74 @@ int part_get_info_by_name(struct blk_desc *dev_desc, const char *name,
|
||||
return part_get_info_by_name_type(dev_desc, name, info, PART_TYPE_ALL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get partition info from device number and partition name.
|
||||
*
|
||||
* Parse a device number and partition name string in the form of
|
||||
* "device_num#partition_name", for example "0#misc". If the partition
|
||||
* is found, sets dev_desc and part_info accordingly with the information
|
||||
* of the partition with the given partition_name.
|
||||
*
|
||||
* @param[in] dev_iface Device interface
|
||||
* @param[in] dev_part_str Input string argument, like "0#misc"
|
||||
* @param[out] dev_desc Place to store the device description pointer
|
||||
* @param[out] part_info Place to store the partition information
|
||||
* @return 0 on success, or a negative on error
|
||||
*/
|
||||
static int part_get_info_by_dev_and_name(const char *dev_iface,
|
||||
const char *dev_part_str,
|
||||
struct blk_desc **dev_desc,
|
||||
disk_partition_t *part_info)
|
||||
{
|
||||
char *ep;
|
||||
const char *part_str;
|
||||
int dev_num;
|
||||
|
||||
part_str = strchr(dev_part_str, '#');
|
||||
if (!part_str || part_str == dev_part_str)
|
||||
return -EINVAL;
|
||||
|
||||
dev_num = simple_strtoul(dev_part_str, &ep, 16);
|
||||
if (ep != part_str) {
|
||||
/* Not all the first part before the # was parsed. */
|
||||
return -EINVAL;
|
||||
}
|
||||
part_str++;
|
||||
|
||||
*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;
|
||||
}
|
||||
if (part_get_info_by_name(*dev_desc, part_str, part_info) < 0) {
|
||||
printf("Could not find \"%s\" partition\n", part_str);
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int part_get_info_by_dev_and_name_or_num(const char *dev_iface,
|
||||
const char *dev_part_str,
|
||||
struct blk_desc **dev_desc,
|
||||
disk_partition_t *part_info)
|
||||
{
|
||||
/* 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;
|
||||
/*
|
||||
* 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) {
|
||||
printf("Couldn't find partition %s %s\n",
|
||||
dev_iface, dev_part_str);
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void part_set_generic_name(const struct blk_desc *dev_desc,
|
||||
int part_num, char *name)
|
||||
{
|
||||
|
@ -201,6 +201,27 @@ int part_get_info_by_name_type(struct blk_desc *dev_desc, const char *name,
|
||||
int part_get_info_by_name(struct blk_desc *dev_desc,
|
||||
const char *name, disk_partition_t *info);
|
||||
|
||||
/**
|
||||
* Get partition info from dev number + part name, or dev number + part number.
|
||||
*
|
||||
* Parse a device number and partition description (either name or number)
|
||||
* in the form of device number plus partition name separated by a "#"
|
||||
* (like "device_num#partition_name") or a device number plus a partition number
|
||||
* separated by a ":". For example both "0#misc" and "0:1" can be valid
|
||||
* partition descriptions for a given interface. If the partition is found, sets
|
||||
* dev_desc and part_info accordingly with the information of the partition.
|
||||
*
|
||||
* @param[in] dev_iface Device interface
|
||||
* @param[in] dev_part_str Input partition description, like "0#misc" or "0:1"
|
||||
* @param[out] dev_desc Place to store the device description pointer
|
||||
* @param[out] part_info Place to store the partition information
|
||||
* @return 0 on success, or a negative on error
|
||||
*/
|
||||
int part_get_info_by_dev_and_name_or_num(const char *dev_iface,
|
||||
const char *dev_part_str,
|
||||
struct blk_desc **dev_desc,
|
||||
disk_partition_t *part_info);
|
||||
|
||||
/**
|
||||
* part_set_generic_name() - create generic partition like hda1 or sdb2
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user