Module Name:    src
Committed By:   martin
Date:           Wed Jun  3 17:53:23 UTC 2015

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

Log Message:
Make querying the disk geometry fail silently if called for a non-exitent
disk.
XXX: DIOCGDISKINFO returns strange error codes


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 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.14 src/sbin/fsck/partutil.c:1.15
--- src/sbin/fsck/partutil.c:1.14	Mon Dec 29 16:35:38 2014
+++ src/sbin/fsck/partutil.c	Wed Jun  3 17:53:23 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: partutil.c,v 1.14 2014/12/29 16:35:38 christos Exp $	*/
+/*	$NetBSD: partutil.c,v 1.15 2015/06/03 17:53:23 martin Exp $	*/
 
 /*-
  * Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: partutil.c,v 1.14 2014/12/29 16:35:38 christos Exp $");
+__RCSID("$NetBSD: partutil.c,v 1.15 2015/06/03 17:53:23 martin Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -99,7 +99,7 @@ getdiskinfo(const char *s, int fd, const
 	prop_dictionary_t disk_dict, geom_dict;
 	struct stat sb;
 	const struct partition *pp;
-	int ptn;
+	int ptn, error;
 
 	if (dt) {
 		lp = getdiskbyname(dt);
@@ -108,7 +108,13 @@ getdiskinfo(const char *s, int fd, const
 	}
 
 	/* Get disk description dictionary */
-	if (prop_dictionary_recv_ioctl(fd, DIOCGDISKINFO, &disk_dict)) {
+	error = prop_dictionary_recv_ioctl(fd, DIOCGDISKINFO, &disk_dict);
+
+	/* fail quickly if the device does not exist at all */
+	if (error == ENXIO)
+		return -1;
+
+	if (error) {
 		/*
 		 * Ask for disklabel if DIOCGDISKINFO failed. This is
 		 * compatibility call and can be removed when all devices
@@ -116,7 +122,8 @@ getdiskinfo(const char *s, int fd, const
 		 * cgd, ccd pseudo disk drives doesn't support DIOCGDDISKINFO
 		 */
 		if (ioctl(fd, DIOCGDINFO, lp) == -1) {
-			warn("DIOCGDINFO on %s failed", s);
+			if (errno != ENXIO)
+				warn("DIOCGDINFO on %s failed", s);
 			return -1;
 		}
 		label2geom(geo, lp);

Reply via email to