svn commit: r241151 - projects/bhyve/sys/boot/userboot/userboot
Peter Grehan
grehan at FreeBSD.org
Wed Oct 3 03:00:38 UTC 2012
Author: grehan
Date: Wed Oct 3 03:00:37 2012
New Revision: 241151
URL: http://svn.freebsd.org/changeset/base/241151
Log:
Rework the GPT/MBR/raw policy so that it actually works, and navigates
around disk_open's current handling of falling back from GPT to MBR.
As in the previous commit, this should all be fixed in CURRENT.
Modified:
projects/bhyve/sys/boot/userboot/userboot/main.c
Modified: projects/bhyve/sys/boot/userboot/userboot/main.c
==============================================================================
--- projects/bhyve/sys/boot/userboot/userboot/main.c Wed Oct 3 02:58:55 2012 (r241150)
+++ projects/bhyve/sys/boot/userboot/userboot/main.c Wed Oct 3 03:00:37 2012 (r241151)
@@ -129,6 +129,7 @@ static void
extract_currdev(void)
{
struct disk_devdesc dev;
+ int gpt, rc;
//bzero(&dev, sizeof(dev));
@@ -138,12 +139,37 @@ extract_currdev(void)
dev.d_unit = 0;
dev.d_slice = 0;
dev.d_partition = 0;
+
/*
- * Figure out if we are using MBR or GPT - for GPT we
- * set the partition to 0 since everything is a GPT slice.
+ * The priority is GPT, MBR and raw disk. Unfortunately,
+ * disk_open() doesn't really get this right so first
+ * probe for MBR, and then GPT. If GPT fails, re-probe
+ * MBR if it succeeded, else assume raw.
*/
- if (dev.d_dev->dv_open(NULL, &dev))
- dev.d_partition = 255;
+ rc = (*dev.d_dev->dv_open)(NULL, &dev);
+
+ dev.d_unit = 0;
+ dev.d_slice = 0;
+ dev.d_partition = 255;
+ gpt = (*dev.d_dev->dv_open)(NULL, &dev);
+
+ if (gpt) {
+ dev.d_unit = 0;
+ dev.d_slice = 0;
+ dev.d_partition = 0;
+
+ if (!rc) {
+ (void) (*dev.d_dev->dv_open)(NULL, &dev);
+ } else {
+ /*
+ * Force raw disk access
+ */
+ dev.d_slice = -1;
+ dev.d_partition = -1;
+ dev.d_offset = 0;
+ }
+ }
+
} else {
dev.d_dev = &host_dev;
dev.d_type = dev.d_dev->dv_type;
More information about the svn-src-projects
mailing list