Author: ae
Date: Fri Sep 28 10:49:41 2012
New Revision: 241023
URL: http://svn.freebsd.org/changeset/base/241023

Log:
  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.

Modified:
  head/sys/boot/common/disk.c

Modified: head/sys/boot/common/disk.c
==============================================================================
--- head/sys/boot/common/disk.c Fri Sep 28 08:22:51 2012        (r241022)
+++ head/sys/boot/common/disk.c Fri Sep 28 10:49:41 2012        (r241023)
@@ -179,12 +179,21 @@ disk_open(struct disk_devdesc *dev, off_
                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_
                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)
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to