Module Name:    src
Committed By:   haad
Date:           Sat Jun  6 18:31:29 UTC 2009

Modified Files:
        src/sbin/fsck: partutil.c

Log Message:
Add support for devices which do not support DIOCGDISKINFO ioctl yet. This
change  will restore fsck/newfs on vnd device.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sbin/fsck/partutil.c

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

Modified files:

Index: src/sbin/fsck/partutil.c
diff -u src/sbin/fsck/partutil.c:1.6 src/sbin/fsck/partutil.c:1.7
--- src/sbin/fsck/partutil.c:1.6	Sat Jun  6 17:47:50 2009
+++ src/sbin/fsck/partutil.c	Sat Jun  6 18:31:29 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: partutil.c,v 1.6 2009/06/06 17:47:50 haad Exp $	*/
+/*	$NetBSD: partutil.c,v 1.7 2009/06/06 18:31:29 haad Exp $	*/
 
 /*-
  * Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: partutil.c,v 1.6 2009/06/06 17:47:50 haad Exp $");
+__RCSID("$NetBSD: partutil.c,v 1.7 2009/06/06 18:31:29 haad Exp $");
 
 #include <sys/types.h>
 #include <sys/disklabel.h>
@@ -52,6 +52,23 @@
 
 #include "partutil.h"
 
+/*
+ * Convert disklabel geometry info to disk_geom.
+ */
+static void
+label2geom(struct disk_geom *geo, const struct disklabel *lp)
+{
+	geo->dg_secperunit = lp->d_secperunit;
+	geo->dg_secsize = lp->d_secsize;
+	geo->dg_nsectors = lp->d_nsectors;
+	geo->dg_ntracks = lp->d_ntracks;
+	geo->dg_ncylinders = lp->d_ncylinders;
+	geo->dg_secpercyl = lp->d_secpercyl;
+	geo->dg_pcylinders = lp->d_ncylinders;
+	geo->dg_sparespertrack = lp->d_sparespertrack;
+	geo->dg_sparespercyl = lp->d_sparespercyl;
+	geo->dg_acylinders = lp->d_acylinders;
+}
 
 /*
  * Set what we need to know about disk geometry.
@@ -138,7 +155,10 @@
 	struct disklabel lab;
 	struct disklabel *lp = &lab;
 	prop_dictionary_t disk_dict, geom_dict;
+	int error;
 
+	error = 0;
+	
 	if (dt) {
 		lp = getdiskbyname(dt);
 		if (lp == NULL)
@@ -146,18 +166,30 @@
 	}
 
 	/* Get disk description dictionary */
-	if (prop_dictionary_recv_ioctl(fd, DIOCGDISKINFO, &disk_dict) != 0) {
-		warn("Please implement DIOCGDISKINFO for %s\n disk driver\n", s);
-		return (errno);
+	if ((error = prop_dictionary_recv_ioctl(fd, DIOCGDISKINFO,
+		    &disk_dict)) != 0) {
+		warn("Please implement DIOCGDISKINFO for %s disk driver\n", s);
+		
+		/*
+		 * Ask for disklabel if DIOCGDISKINFO failed. This is
+		 * compatibility call and can be removed when all devices
+		 * will support DIOCGDISKINFO.
+		 */
+		if ((error = ioctl(fd, DIOCGDINFO, lp)) == -1) {
+			printf("DIOCGDINFO on %s failed\n", s);
+			return (errno);
+		}
+		label2geom(geo, lp);
+	} else {
+		geom_dict = prop_dictionary_get(disk_dict, "geometry");
+		dict2geom(geo, geom_dict);
 	}
 	
-	geom_dict = prop_dictionary_get(disk_dict, "geometry");
-	dict2geom(geo, geom_dict);
-
 	/* Get info about partition/wedge */
 	if (ioctl(fd, DIOCGWEDGEINFO, dkw) == -1) {
 		if (ioctl(fd, DIOCGDINFO, lp) == -1)
-			errx(errno, "Please implement DIOCGWEDGEINFO or DIOCGDINFO for disk device %s\n", s);
+			errx(errno, "Please implement DIOCGWEDGEINFO or "
+			    "DIOCGDINFO for disk device %s\n", s);
 
 		part2wedge(dkw, lp, s);
 	}

Reply via email to