summaryrefslogtreecommitdiffstats
path: root/sys/boot/common
diff options
context:
space:
mode:
authorae <ae@FreeBSD.org>2012-09-28 10:49:41 +0000
committerae <ae@FreeBSD.org>2012-09-28 10:49:41 +0000
commit604c9734ea49f5072fc39f3632193811b465f2c6 (patch)
tree4c8602bd4b8c2c6a4b3e4c70bf9953627a02e04b /sys/boot/common
parent785571bd2b886e6694a7a9a08f7bdd6f1ce8ce7a (diff)
downloadFreeBSD-src-604c9734ea49f5072fc39f3632193811b465f2c6.zip
FreeBSD-src-604c9734ea49f5072fc39f3632193811b465f2c6.tar.gz
Make the loader a bit smarter, when it tries to open disk and the slice
number is not exactly specified. When the disk has MBR, also try to read BSD label after ptable_getpart() call. When the disk has GPT, also set d_partition to 255. Mostly, this is how it worked before.
Diffstat (limited to 'sys/boot/common')
-rw-r--r--sys/boot/common/disk.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/sys/boot/common/disk.c b/sys/boot/common/disk.c
index c7716d3..0389956 100644
--- a/sys/boot/common/disk.c
+++ b/sys/boot/common/disk.c
@@ -179,12 +179,21 @@ disk_open(struct disk_devdesc *dev, off_t mediasize, u_int sectorsize)
rc = ptable_getpart(od->table, &part, dev->d_partition);
if (rc == 0)
dev->d_offset = part.start;
- } else if (dev->d_slice > 0) {
+ } else if (dev->d_slice >= 0) {
/* Try to get information about partition */
- rc = ptable_getpart(od->table, &part, dev->d_slice);
+ if (dev->d_slice == 0)
+ rc = ptable_getbestpart(od->table, &part);
+ else
+ rc = ptable_getpart(od->table, &part, dev->d_slice);
if (rc != 0) /* Partition doesn't exist */
goto out;
dev->d_offset = part.start;
+ if (dev->d_slice == 0) {
+ /* Save the slice number of best partition to dev */
+ dev->d_slice = part.index;
+ if (ptable_gettype(od->table) == PTABLE_GPT)
+ dev->d_partition = 255;
+ }
if (dev->d_partition == 255)
goto out; /* Nothing more to do */
/*
@@ -217,13 +226,6 @@ disk_open(struct disk_devdesc *dev, off_t mediasize, u_int sectorsize)
if (rc != 0)
goto out;
dev->d_offset += part.start;
- } else if (dev->d_slice == 0) {
- rc = ptable_getbestpart(od->table, &part);
- if (rc != 0)
- goto out;
- /* Save the slice number of best partition to dev */
- dev->d_slice = part.index;
- dev->d_offset = part.start;
}
out:
if (table != NULL)
OpenPOWER on IntegriCloud