summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoravg <avg@FreeBSD.org>2012-10-06 19:48:15 +0000
committeravg <avg@FreeBSD.org>2012-10-06 19:48:15 +0000
commit694832afbf65421992e4f220a23e8de20d71598f (patch)
treefb7a4c99e0aaa2c3aaf47e4fee08d7d07eb26655
parentba598b122e294d2b8d300a73ad3f8e40ee6fe0c8 (diff)
downloadFreeBSD-src-694832afbf65421992e4f220a23e8de20d71598f.zip
FreeBSD-src-694832afbf65421992e4f220a23e8de20d71598f.tar.gz
zfsboot: simplify probe_drive() a little bit
The first discovered pool, whether it covers the whole boot disk or not, is going to be first in zfs_pools list. So there is no need at all for spapp parameter. This commit also fixes a bug where NULL would be assigned to NULL pointer when probe_drive was called with the spapp parameter of NULL. MFC after: 21 days
-rw-r--r--sys/boot/i386/zfsboot/zfsboot.c40
1 files changed, 13 insertions, 27 deletions
diff --git a/sys/boot/i386/zfsboot/zfsboot.c b/sys/boot/i386/zfsboot/zfsboot.c
index 928cd71..d49c179 100644
--- a/sys/boot/i386/zfsboot/zfsboot.c
+++ b/sys/boot/i386/zfsboot/zfsboot.c
@@ -345,7 +345,7 @@ copy_dsk(struct dsk *dsk)
}
static void
-probe_drive(struct dsk *dsk, spa_t **spap)
+probe_drive(struct dsk *dsk)
{
#ifdef GPT
struct gpt_hdr hdr;
@@ -359,9 +359,10 @@ probe_drive(struct dsk *dsk, spa_t **spap)
/*
* If we find a vdev on the whole disk, stop here. Otherwise dig
- * out the MBR and probe each slice in turn for a vdev.
+ * out the partition table and probe each slice/partition
+ * in turn for a vdev.
*/
- if (vdev_probe(vdev_read, dsk, spap) == 0)
+ if (vdev_probe(vdev_read, dsk, NULL) == 0)
return;
sec = dmadat->secbuf;
@@ -399,13 +400,7 @@ probe_drive(struct dsk *dsk, spa_t **spap)
if (memcmp(&ent->ent_type, &freebsd_zfs_uuid,
sizeof(uuid_t)) == 0) {
dsk->start = ent->ent_lba_start;
- if (vdev_probe(vdev_read, dsk, spap) == 0) {
- /*
- * We record the first pool we find (we will try
- * to boot from that one).
- */
- spap = NULL;
-
+ if (vdev_probe(vdev_read, dsk, NULL) == 0) {
/*
* This slice had a vdev. We need a new dsk
* structure now since the vdev now owns this one.
@@ -428,13 +423,7 @@ trymbr:
if (!dp[i].dp_typ)
continue;
dsk->start = dp[i].dp_start;
- if (vdev_probe(vdev_read, dsk, spap) == 0) {
- /*
- * We record the first pool we find (we will try to boot
- * from that one.
- */
- spap = 0;
-
+ if (vdev_probe(vdev_read, dsk, NULL) == 0) {
/*
* This slice had a vdev. We need a new dsk structure now
* since the vdev now owns this one.
@@ -493,7 +482,7 @@ main(void)
* Probe the boot drive first - we will try to boot from whatever
* pool we find on that drive.
*/
- probe_drive(dsk, &spa);
+ probe_drive(dsk);
/*
* Probe the rest of the drives that the bios knows about. This
@@ -520,20 +509,17 @@ main(void)
dsk->part = 0;
dsk->start = 0;
dsk->init = 0;
- probe_drive(dsk, NULL);
+ probe_drive(dsk);
}
/*
- * If we didn't find a pool on the boot drive, default to the
- * first pool we found, if any.
+ * The first discovered pool, if any, is the pool.
*/
+ spa = spa_get_primary();
if (!spa) {
- spa = spa_get_primary();
- if (!spa) {
- printf("%s: No ZFS pools located, can't boot\n", BOOTPROG);
- for (;;)
- ;
- }
+ printf("%s: No ZFS pools located, can't boot\n", BOOTPROG);
+ for (;;)
+ ;
}
primary_spa = spa;
OpenPOWER on IntegriCloud