Author: ae
Date: Wed Aug 15 10:11:29 2012
New Revision: 239293
URL: http://svn.freebsd.org/changeset/base/239293

Log:
  Rework r239232 to unbreak ZFS detection on MBR slices.

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

Modified: head/sys/boot/common/disk.c
==============================================================================
--- head/sys/boot/common/disk.c Wed Aug 15 09:18:49 2012        (r239292)
+++ head/sys/boot/common/disk.c Wed Aug 15 10:11:29 2012        (r239293)
@@ -187,16 +187,14 @@ disk_open(struct disk_devdesc *dev, off_
                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_
                        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;
_______________________________________________
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