From 0eec6d647c67ffda03b768c8686fedcf218dae1e Mon Sep 17 00:00:00 2001 From: Toomas Soome Date: Wed, 8 Mar 2017 10:37:54 +0200 Subject: [PATCH] 7951 loader: disk_print should open nested partition with disk_open Reviewed by: Marcel Telka Reviewed by: Jason King Approved by: Robert Mustacchi --- usr/src/boot/Makefile.version | 2 +- usr/src/boot/sys/boot/common/disk.c | 30 ++++++++++++++++++----------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/usr/src/boot/Makefile.version b/usr/src/boot/Makefile.version index afc22202b380..a07ad75939f8 100644 --- a/usr/src/boot/Makefile.version +++ b/usr/src/boot/Makefile.version @@ -33,4 +33,4 @@ LOADER_VERSION = 1.1 # Use date like formatting here, YYYY.MM.DD.XX, without leading zeroes. # The version is processed from left to right, the version number can only # be increased. -BOOT_VERSION = $(LOADER_VERSION)-2017.3.15.1 +BOOT_VERSION = $(LOADER_VERSION)-2017.3.16.1 diff --git a/usr/src/boot/sys/boot/common/disk.c b/usr/src/boot/sys/boot/common/disk.c index 0c9bf0e0db78..c70b6e16aa1f 100644 --- a/usr/src/boot/sys/boot/common/disk.c +++ b/usr/src/boot/sys/boot/common/disk.c @@ -93,6 +93,7 @@ ptblread(void *d, void *buf, size_t blocks, uint64_t offset) static int ptable_print(void *arg, const char *pname, const struct ptable_entry *part) { + struct disk_devdesc dev; struct print_args *pa, bsd; struct open_disk *od; struct ptable *table; @@ -113,17 +114,24 @@ ptable_print(void *arg, const char *pname, const struct ptable_entry *part) return (ret); if (part->type == PART_FREEBSD || part->type == PART_SOLARIS2) { /* Open slice with BSD or VTOC label */ - pa->dev->d_offset = part->start; - table = ptable_open(pa->dev, part->end - part->start + 1, - od->sectorsize, ptblread); - if (table == NULL) - return (ret); - sprintf(line, " %s%s", pa->prefix, pname); - bsd.dev = pa->dev; - bsd.prefix = line; - bsd.verbose = pa->verbose; - ret = ptable_iterate(table, &bsd, ptable_print); - ptable_close(table); + dev.d_dev = pa->dev->d_dev; + dev.d_unit = pa->dev->d_unit; + dev.d_slice = part->index; + dev.d_partition = -1; + if (disk_open(&dev, part->end - part->start + 1, + od->sectorsize) == 0) { + table = ptable_open(&dev, part->end - part->start + 1, + od->sectorsize, ptblread); + if (table != NULL) { + sprintf(line, " %s%s", pa->prefix, pname); + bsd.dev = &dev; + bsd.prefix = line; + bsd.verbose = pa->verbose; + ret = ptable_iterate(table, &bsd, ptable_print); + ptable_close(table); + } + disk_close(&dev); + } } return (ret); }