aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey V. Elsukov <ae@FreeBSD.org>2012-08-15 10:11:29 +0000
committerAndrey V. Elsukov <ae@FreeBSD.org>2012-08-15 10:11:29 +0000
commitdeafa47873beabf9e18f53c3257d138a0585a744 (patch)
tree743339f2d08ec0760ac3c1b4379649ba3312e3d0
parenta188e43ef3ea44824aedd96167ca2d0231200c33 (diff)
Notes
-rw-r--r--sys/boot/common/disk.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/sys/boot/common/disk.c b/sys/boot/common/disk.c
index 9e4c78fa1d45..c7716d3ac1ed 100644
--- a/sys/boot/common/disk.c
+++ b/sys/boot/common/disk.c
@@ -187,16 +187,14 @@ disk_open(struct disk_devdesc *dev, off_t mediasize, u_int sectorsize)
dev->d_offset = part.start;
if (dev->d_partition == 255)
goto out; /* Nothing more to do */
- if (dev->d_partition == -1) {
- /*
- * If we are looking at a BSD slice, and the
- * partition is < 0, assume the 'a' partition.
- */
- if (part.type == PART_FREEBSD)
- dev->d_partition = 0;
- else
- goto out;
- }
+ /*
+ * If d_partition < 0 and we are looking at a BSD slice,
+ * then try to read BSD label, otherwise return the
+ * whole MBR slice.
+ */
+ if (dev->d_partition == -1 &&
+ part.type != PART_FREEBSD)
+ goto out;
/* Try to read BSD label */
table = ptable_open(dev, part.end - part.start + 1,
od->sectorsize, ptblread);
@@ -205,6 +203,16 @@ disk_open(struct disk_devdesc *dev, off_t mediasize, u_int sectorsize)
rc = ENXIO;
goto out;
}
+ /*
+ * If slice contains BSD label and d_partition < 0, then
+ * assume the 'a' partition. Otherwise just return the
+ * whole MBR slice, because it can contain ZFS.
+ */
+ if (dev->d_partition < 0) {
+ if (ptable_gettype(table) != PTABLE_BSD)
+ goto out;
+ dev->d_partition = 0;
+ }
rc = ptable_getpart(table, &part, dev->d_partition);
if (rc != 0)
goto out;