summaryrefslogtreecommitdiffstats
path: root/sys/boot/common
diff options
context:
space:
mode:
authorae <ae@FreeBSD.org>2012-08-13 13:08:30 +0000
committerae <ae@FreeBSD.org>2012-08-13 13:08:30 +0000
commit7244c0647c73c1d518983c079a15b50aff02c38e (patch)
tree94cd955dfa84c0abe0692c5cac01d4de19af1277 /sys/boot/common
parentfa7b327d11ab0238bd2da5610b249be97caaf71e (diff)
downloadFreeBSD-src-7244c0647c73c1d518983c079a15b50aff02c38e.zip
FreeBSD-src-7244c0647c73c1d518983c079a15b50aff02c38e.tar.gz
Unbreak booting from the true dedicated disks.
When we open the disk, check the type of partition table, that has been detected. If this is BSD label, then we assume this is DD mode. Reported by: dim@
Diffstat (limited to 'sys/boot/common')
-rw-r--r--sys/boot/common/disk.c12
-rw-r--r--sys/boot/common/disk.h5
2 files changed, 14 insertions, 3 deletions
diff --git a/sys/boot/common/disk.c b/sys/boot/common/disk.c
index 5711a10..0ad9e37 100644
--- a/sys/boot/common/disk.c
+++ b/sys/boot/common/disk.c
@@ -173,7 +173,13 @@ disk_open(struct disk_devdesc *dev, off_t mediasize, u_int sectorsize)
rc = ENXIO;
goto out;
}
- if (dev->d_slice > 0) {
+ if (ptable_gettype(od->table) == PTABLE_BSD &&
+ dev->d_partition >= 0) {
+ /* It doesn't matter what value has d_slice */
+ rc = ptable_getpart(od->table, &part, dev->d_partition);
+ if (rc == 0)
+ dev->d_offset = part.start;
+ } else if (dev->d_slice > 0) {
/* Try to get information about partition */
rc = ptable_getpart(od->table, &part, dev->d_slice);
if (rc != 0) /* Partition doesn't exist */
@@ -247,9 +253,9 @@ disk_fmtdev(struct disk_devdesc *dev)
#ifdef LOADER_MBR_SUPPORT
cp += sprintf(cp, "s%d", dev->d_slice);
#endif
- if (dev->d_partition >= 0)
- cp += sprintf(cp, "%c", dev->d_partition + 'a');
}
+ if (dev->d_partition >= 0)
+ cp += sprintf(cp, "%c", dev->d_partition + 'a');
strcat(cp, ":");
return (buf);
}
diff --git a/sys/boot/common/disk.h b/sys/boot/common/disk.h
index dc2c3c1..4894661 100644
--- a/sys/boot/common/disk.h
+++ b/sys/boot/common/disk.h
@@ -45,6 +45,11 @@
* d_slice = MBR slice number (typically 1..4)
* d_partition = disklabel partition (typically 0..7)
*
+ * BSD disklabel partition on the true dedicated disk:
+ *
+ * d_slice = -1
+ * d_partition = disklabel partition (typically 0..7)
+ *
* GPT partition:
*
* d_slice = GPT partition number (typically 1..N)
OpenPOWER on IntegriCloud