diff options
author | Petr Kulhavy <brain@jikos.cz> | 2016-09-09 10:27:15 +0200 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2016-10-01 20:04:45 -0400 |
commit | 87b8530fe24408b0ef41c9b80f38c395ccafad2c (patch) | |
tree | 31b9a33b2525b1713c542409fe4a59219ccfbd2a /disk | |
parent | ba07984068dc96a2234371545df043495dcbeadd (diff) | |
download | u-boot-87b8530fe24408b0ef41c9b80f38c395ccafad2c.tar.gz |
disk: part: implement generic function part_get_info_by_name()
So far partition search by name has been supported only on the EFI partition
table. This patch extends the search to all partition tables.
Rename part_get_info_efi_by_name() to part_get_info_by_name(), move it from
part_efi.c into part.c and make it a generic function which traverses all part
drivers and searches all partitions (in the order given by the linked list).
For this a new variable struct part_driver.max_entries is added, which limits
the number of partitions searched. For EFI this was GPT_ENTRY_NUMBERS.
Similarly the limit is defined for DOS, ISO, MAC and AMIGA partition tables.
Signed-off-by: Petr Kulhavy <brain@jikos.cz>
Reviewed-by: Tom Rini <trini@konsulko.com>
Acked-by: Steve Rae <steve.rae@raedomain.com>
Diffstat (limited to 'disk')
-rw-r--r-- | disk/part.c | 26 | ||||
-rw-r--r-- | disk/part_amiga.c | 1 | ||||
-rw-r--r-- | disk/part_dos.c | 1 | ||||
-rw-r--r-- | disk/part_efi.c | 20 | ||||
-rw-r--r-- | disk/part_iso.c | 1 | ||||
-rw-r--r-- | disk/part_mac.c | 1 |
6 files changed, 31 insertions, 19 deletions
diff --git a/disk/part.c b/disk/part.c index 6a1c02d9fa..8317e80db5 100644 --- a/disk/part.c +++ b/disk/part.c @@ -615,3 +615,29 @@ cleanup: free(dup_str); return ret; } + +int part_get_info_by_name(struct blk_desc *dev_desc, const char *name, + disk_partition_t *info) +{ + struct part_driver *first_drv = + ll_entry_start(struct part_driver, part_driver); + const int n_drvs = ll_entry_count(struct part_driver, part_driver); + struct part_driver *part_drv; + + for (part_drv = first_drv; part_drv != first_drv + n_drvs; part_drv++) { + int ret; + int i; + for (i = 1; i < part_drv->max_entries; i++) { + ret = part_drv->get_info(dev_desc, i, info); + if (ret != 0) { + /* no more entries in table */ + break; + } + if (strcmp(name, (const char *)info->name) == 0) { + /* matched */ + return 0; + } + } + } + return -1; +} diff --git a/disk/part_amiga.c b/disk/part_amiga.c index d4316b858c..25fe56ce42 100644 --- a/disk/part_amiga.c +++ b/disk/part_amiga.c @@ -381,6 +381,7 @@ static void part_print_amiga(struct blk_desc *dev_desc) U_BOOT_PART_TYPE(amiga) = { .name = "AMIGA", .part_type = PART_TYPE_AMIGA, + .max_entries = AMIGA_ENTRY_NUMBERS, .get_info = part_get_info_amiga, .print = part_print_amiga, .test = part_test_amiga, diff --git a/disk/part_dos.c b/disk/part_dos.c index 511917a444..82266012ef 100644 --- a/disk/part_dos.c +++ b/disk/part_dos.c @@ -300,6 +300,7 @@ int part_get_info_dos(struct blk_desc *dev_desc, int part, U_BOOT_PART_TYPE(dos) = { .name = "DOS", .part_type = PART_TYPE_DOS, + .max_entries = DOS_ENTRY_NUMBERS, .get_info = part_get_info_ptr(part_get_info_dos), .print = part_print_ptr(part_print_dos), .test = part_test_dos, diff --git a/disk/part_efi.c b/disk/part_efi.c index 8d67c09a43..19243380da 100644 --- a/disk/part_efi.c +++ b/disk/part_efi.c @@ -296,25 +296,6 @@ int part_get_info_efi(struct blk_desc *dev_desc, int part, return 0; } -int part_get_info_efi_by_name(struct blk_desc *dev_desc, - const char *name, disk_partition_t *info) -{ - int ret; - int i; - for (i = 1; i < GPT_ENTRY_NUMBERS; i++) { - ret = part_get_info_efi(dev_desc, i, info); - if (ret != 0) { - /* no more entries in table */ - return -1; - } - if (strcmp(name, (const char *)info->name) == 0) { - /* matched */ - return 0; - } - } - return -2; -} - static int part_test_efi(struct blk_desc *dev_desc) { ALLOC_CACHE_ALIGN_BUFFER_PAD(legacy_mbr, legacymbr, 1, dev_desc->blksz); @@ -958,6 +939,7 @@ static int is_pte_valid(gpt_entry * pte) U_BOOT_PART_TYPE(a_efi) = { .name = "EFI", .part_type = PART_TYPE_EFI, + .max_entries = GPT_ENTRY_NUMBERS, .get_info = part_get_info_ptr(part_get_info_efi), .print = part_print_ptr(part_print_efi), .test = part_test_efi, diff --git a/disk/part_iso.c b/disk/part_iso.c index f9a741d297..78fc97e4f1 100644 --- a/disk/part_iso.c +++ b/disk/part_iso.c @@ -257,6 +257,7 @@ static int part_test_iso(struct blk_desc *dev_desc) U_BOOT_PART_TYPE(iso) = { .name = "ISO", .part_type = PART_TYPE_ISO, + .max_entries = ISO_ENTRY_NUMBERS, .get_info = part_get_info_iso, .print = part_print_iso, .test = part_test_iso, diff --git a/disk/part_mac.c b/disk/part_mac.c index 3952b8d379..b6c082e7e1 100644 --- a/disk/part_mac.c +++ b/disk/part_mac.c @@ -239,6 +239,7 @@ static int part_get_info_mac(struct blk_desc *dev_desc, int part, U_BOOT_PART_TYPE(mac) = { .name = "MAC", .part_type = PART_TYPE_MAC, + .max_entries = MAC_ENTRY_NUMBERS, .get_info = part_get_info_mac, .print = part_print_mac, .test = part_test_mac, |