Module Name:    src
Committed By:   nisimura
Date:           Mon Apr  9 12:40:56 UTC 2012

Modified Files:
        src/sys/arch/sandpoint/stand/altboot: dsk.c

Log Message:
Refactor disklabel decode logic.  RAIDFRAME case needs more attention
as it's not certain whether a general solution.


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/sandpoint/stand/altboot/dsk.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/sandpoint/stand/altboot/dsk.c
diff -u src/sys/arch/sandpoint/stand/altboot/dsk.c:1.14 src/sys/arch/sandpoint/stand/altboot/dsk.c:1.15
--- src/sys/arch/sandpoint/stand/altboot/dsk.c:1.14	Sun Jan 22 13:16:54 2012
+++ src/sys/arch/sandpoint/stand/altboot/dsk.c	Mon Apr  9 12:40:55 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: dsk.c,v 1.14 2012/01/22 13:16:54 phx Exp $ */
+/* $NetBSD: dsk.c,v 1.15 2012/04/09 12:40:55 nisimura Exp $ */
 
 /*-
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -77,6 +77,7 @@ static void drive_ident(struct disk *, c
 static char *mkident(char *, int);
 static void set_xfermode(struct dkdev_ata *, int);
 static void decode_dlabel(struct disk *, char *);
+static struct disklabel *search_dmagic(char *);
 static int lba_read(struct disk *, int64_t, int, void *);
 static void issue48(struct dvata_chan *, int64_t, int);
 static void issue28(struct dvata_chan *, int64_t, int);
@@ -306,7 +307,6 @@ decode_dlabel(struct disk *d, char *iobu
         struct mbr_partition *mp, *bsdp;
 	struct disklabel *dlp;
 	struct partition *pp;
-	char *dp;
 	int i, first, rf_offset;
 
 	bsdp = NULL;
@@ -324,39 +324,26 @@ decode_dlabel(struct disk *d, char *iobu
 	rf_offset = 0;
 	first = (bsdp) ? bswap32(bsdp->mbrp_start) : 0;
 	(*d->lba_read)(d, first + LABELSECTOR, 1, iobuf);
-	dp = iobuf /* + LABELOFFSET */;
-	for (i = 0; i < 512 - sizeof(struct disklabel); i++, dp += 4) {
-		dlp = (struct disklabel *)dp;
-		if (dlp->d_magic == DISKMAGIC && dlp->d_magic2 == DISKMAGIC) {
-			if (dlp->d_partitions[0].p_fstype == FS_RAID) {
-				printf("%s%c: raid\n", d->xname, i + 'a');
-				snprintf(d->xname, sizeof(d->xname), "raid.");
-				rf_offset = dlp->d_partitions[0].p_offset +
-				    RF_PROTECTED_SECTORS;
-				(*d->lba_read)(d, rf_offset + LABELSECTOR, 1,
-				    iobuf);
-				dp = iobuf /* + LABELOFFSET */;
-				for (i = 0; i < 512 - sizeof(struct disklabel); i++, dp += 4) {
-					dlp = (struct disklabel *)dp;
-					if (dlp->d_magic == DISKMAGIC &&
-					    dlp->d_magic2 == DISKMAGIC)
-						goto found;
-				}
-			} else	/* Not RAID */
-				goto found;
-		}
+	dlp = search_dmagic(iobuf);
+	if (dlp == NULL)
+		goto notfound;
+	if (dlp->d_partitions[0].p_fstype == FS_RAID) {
+		printf("%s%c: raid\n", d->xname, 0 + 'a');
+		snprintf(d->xname, sizeof(d->xname), "raid.");
+		rf_offset
+		    = dlp->d_partitions[0].p_offset + RF_PROTECTED_SECTORS;
+		(*d->lba_read)(d, rf_offset + LABELSECTOR, 1, iobuf);
+		dlp = search_dmagic(iobuf);
+		if (dlp == NULL)
+			goto notfound;
 	}
-	d->dlabel = NULL;
-	printf("%s: no disklabel\n", d->xname);
-	return;
-  found:
 	for (i = 0; i < dlp->d_npartitions; i += 1) {
 		const char *type;
 		pp = &dlp->d_partitions[i];
 		pp->p_offset += rf_offset;
 		type = NULL;
 		switch (pp->p_fstype) {
-		case FS_SWAP: /* swap */
+		case FS_SWAP:
 			type = "swap";
 			break;
 		case FS_BSDFFS:
@@ -372,6 +359,25 @@ decode_dlabel(struct disk *d, char *iobu
 	}
 	d->dlabel = allocaligned(sizeof(struct disklabel), 4);
 	memcpy(d->dlabel, dlp, sizeof(struct disklabel));
+	return;
+  notfound:
+	d->dlabel = NULL;
+	printf("%s: no disklabel\n", d->xname);
+	return;
+}
+
+struct disklabel *
+search_dmagic(char *dp)
+{
+	int i;
+	struct disklabel *dlp;
+
+	for (i = 0; i < 512 - sizeof(struct disklabel); i += 4, dp += 4) {
+		dlp = (struct disklabel *)dp;
+		if (dlp->d_magic == DISKMAGIC && dlp->d_magic2 == DISKMAGIC)
+			return dlp;
+	}
+	return NULL;
 }
 
 static void

Reply via email to