Module Name:    src
Committed By:   phx
Date:           Thu Aug 18 08:55:43 UTC 2011

Modified Files:
        src/sys/arch/ofppc/ofppc: disksubr.c

Log Message:
First check whether an MBR is present. Then use it for locating the disklabel.
Otherwise try to construct a disklabel from RDB partitions, and when
everything fails, look for a raw NetBSD disklabel in LABELSECTOR.
This is the same sequence as in ofwboot now.
Also fixed some typos in the comments.


To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/ofppc/ofppc/disksubr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/ofppc/ofppc/disksubr.c
diff -u src/sys/arch/ofppc/ofppc/disksubr.c:1.22 src/sys/arch/ofppc/ofppc/disksubr.c:1.23
--- src/sys/arch/ofppc/ofppc/disksubr.c:1.22	Fri Dec 31 21:50:28 2010
+++ src/sys/arch/ofppc/ofppc/disksubr.c	Thu Aug 18 08:55:43 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: disksubr.c,v 1.22 2010/12/31 21:50:28 phx Exp $	*/
+/*	$NetBSD: disksubr.c,v 1.23 2011/08/18 08:55:43 phx Exp $	*/
 
 /*-
  * Copyright (c) 2010 Frank Wille.
@@ -63,7 +63,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: disksubr.c,v 1.22 2010/12/31 21:50:28 phx Exp $");
+__KERNEL_RCSID(0, "$NetBSD: disksubr.c,v 1.23 2011/08/18 08:55:43 phx Exp $");
 
 #include "opt_disksubr.h"
 
@@ -231,7 +231,6 @@
 {
 	struct adostype adt;
 	struct buf *bp;
-	struct disklabel *dlp;
 	struct partition *pp = NULL;
 	struct partblock *pbp;
 	struct rdblock *rbp;
@@ -246,7 +245,7 @@
 	if (lp->d_partitions[RAW_PART].p_size == 0)
 		lp->d_partitions[RAW_PART].p_size = 0x1fffffff;
 	lp->d_partitions[RAW_PART].p_offset = 0;
-	/* if no 'a' partition, default it to copy of 'c' as BSDFFS */
+	/* if no 'a' partition, default is to copy from 'c' as BSDFFS */
 	if (lp->d_partitions[0].p_size == 0) {
 		lp->d_partitions[0].p_size = lp->d_partitions[RAW_PART].p_size;
 		lp->d_partitions[0].p_offset = 0;
@@ -281,7 +280,7 @@
 #ifdef SD_C_ADJUSTS_NR
 		bp->b_blkno *= (lp->d_secsize / DEV_BSIZE);
 #endif
-		strat(bp);
+		(*strat)(bp);
 
 		if (biowait(bp)) {
 			msg = "rdb scan I/O error";
@@ -294,30 +293,19 @@
 			else
 				msg = "rdb bad checksum";
 		}
-		/* Check for native NetBSD label? */
-		dlp = (struct disklabel *)((char*)bp->b_data + LABELOFFSET);
-		if (dlp->d_magic == DISKMAGIC) {
-			if (dkcksum(dlp))
-				msg = "NetBSD disk label corrupted";
-			else {
-				/* remember block and continue searching? */
-				*lp = *dlp;
-				brelse(bp, 0);
-				return msg;
-			}
-		}
 	}
+
 	if (nextb == RDB_MAXBLOCKS) {
 		if (msg == NULL)
 			msg = "no disk label";
 		goto done;
-	} else if (msg) {
+	} else if (msg != NULL)
 		/*
 		 * maybe we found an invalid one before a valid.
 		 * clear err.
 		 */
 		msg = NULL;
-	}
+
 	osdep->rdblock = nextb;
 
 	/* RDB present, clear disklabel partition table before doing PART blks */
@@ -442,16 +430,16 @@
 		case ADT_NETBSDROOT:
 			pp = &lp->d_partitions[0];
 			if (pp->p_size) {
-				printf("WARN: more than one root, ignoring\n");
-				osdep->rdblock = RDBNULL;	/* invlidate cpulab */
+				printf("more than one root, ignoring\n");
+				osdep->rdblock = RDBNULL; /* invalidate cpulab */
 				continue;
 			}
 			break;
 		case ADT_NETBSDSWAP:
 			pp = &lp->d_partitions[1];
 			if (pp->p_size) {
-				printf("WARN: more than one swap, ignoring\n");
-				osdep->rdblock = RDBNULL;	/* invlidate cpulab */
+				printf("more than one swap, ignoring\n");
+				osdep->rdblock = RDBNULL; /* invalidate cpulab */
 				continue;
 			}
 			break;
@@ -747,41 +735,44 @@
 	bp->b_cylinder = 1 / lp->d_secpercyl;
 	(*strat)(bp);
 
-	/* no valid RDB found */
-	osdep->rdblock = RDBNULL;
-
-	/* XXX cd_start is abused as a flag for fictious disklabel */
-	osdep->cd_start = -1;
-
 	if (biowait(bp)) {
 		msg = "I/O error reading block zero";
 		goto done;
 	}
 
+	/* no valid RDB found */
+	osdep->rdblock = RDBNULL;
+
+	/* XXX cd_start is abused as a flag for fictitious disklabel */
+	osdep->cd_start = -1;
+
 	osdep->cd_labelsector = LABELSECTOR;
 	osdep->cd_labeloffset = LABELOFFSET;
 
-	if (read_netbsd_label(dev, strat, lp, osdep))
-		osdep->cd_start = 0;
-	else {
-		if (bswap16(*(u_int16_t *)((char *)bp->b_data +
-		    MBR_MAGIC_OFFSET)) == MBR_MAGIC) {
-			/* read_dos_label figures out labelsector/offset */
-			msg = read_dos_label(dev, strat, lp, osdep);
-			if (!msg)
-				osdep->cd_start = 0;
-		} else {
+	if (bswap16(*(u_int16_t *)((char *)bp->b_data + MBR_MAGIC_OFFSET))
+	    == MBR_MAGIC) {
+		/*
+		 * We've got an MBR partitioned disk.
+		 * read_dos_label figures out labelsector/offset itself
+		 */
+		msg = read_dos_label(dev, strat, lp, osdep);
+	} else {
 #ifdef RDB_PART
-			/* scan for RDB partitions */
-			msg = read_rdb_label(dev, strat, lp, osdep);
+		/* scan for RDB partitions */
+		msg = read_rdb_label(dev, strat, lp, osdep);
 #else
-			msg = "no disk label";
+		msg = "no NetBSD disk label";
 #endif
-			osdep->cd_start = 0;	/* XXX for now */
+		if (msg != NULL) {
+			/* try reading a raw NetBSD disklabel at last */
+			if (read_netbsd_label(dev, strat, lp, osdep))
+				msg = NULL;
 		}
 	}
+	if (msg == NULL)
+		osdep->cd_start = 0;
 
-done:
+    done:
 	brelse(bp, 0);
 	return msg;
 }
@@ -849,16 +840,14 @@
 	int error;
 	struct disklabel label;
 
-	/* If RDB was present, we don't support writing them yet. */
-	if (osdep->rdblock != RDBNULL)
-		return EINVAL;
-
 	/*
-	 * Try to re-read a disklabel, in case he changed the MBR.
+	 * Try to re-read a disklabel, in case the MBR was modified.
 	 */
 	label = *lp;
 	readdisklabel(dev, strat, &label, osdep);
-	if (osdep->cd_start < 0)
+
+	/* If RDB was present, we don't support writing them yet. */
+	if (osdep->rdblock != RDBNULL)
 		return EINVAL;
 
 	/* get a buffer and initialize it */
@@ -886,7 +875,7 @@
 	(*strat)(bp);
 	error = biowait(bp);
 
-done:
+    done:
 	brelse(bp, 0);
 
 	return error;

Reply via email to