Module Name:    src
Committed By:   martin
Date:           Sun Oct 11 12:34:30 UTC 2020

Modified Files:
        src/sbin/ccdconfig [netbsd-9]: ccdconfig.c
        src/sys/dev [netbsd-9]: ccd.c
        src/sys/dev/dkwedge [netbsd-9]: dk.c

Log Message:
Pull up following revision(s) (requested by mlelstv in ticket #1110):

        sys/dev/dkwedge/dk.c: revision 1.102
        sys/dev/ccd.c: revision 1.185
        sbin/ccdconfig/ccdconfig.c: revision 1.58

Use raw device for configuring units. This is necessary as
having a block device opened prevents autodiscovery of wedges.

Fix ioctl locking. Add dkdriver.

Check dkdriver before calling a driver function.


To generate a diff of this commit:
cvs rdiff -u -r1.56 -r1.56.18.1 src/sbin/ccdconfig/ccdconfig.c
cvs rdiff -u -r1.179 -r1.179.4.1 src/sys/dev/ccd.c
cvs rdiff -u -r1.97.8.3 -r1.97.8.4 src/sys/dev/dkwedge/dk.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/ccdconfig/ccdconfig.c
diff -u src/sbin/ccdconfig/ccdconfig.c:1.56 src/sbin/ccdconfig/ccdconfig.c:1.56.18.1
--- src/sbin/ccdconfig/ccdconfig.c:1.56	Sun Dec  7 10:44:34 2014
+++ src/sbin/ccdconfig/ccdconfig.c	Sun Oct 11 12:34:29 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ccdconfig.c,v 1.56 2014/12/07 10:44:34 mlelstv Exp $	*/
+/*	$NetBSD: ccdconfig.c,v 1.56.18.1 2020/10/11 12:34:29 martin Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
@@ -33,7 +33,7 @@
 #ifndef lint
 __COPYRIGHT("@(#) Copyright (c) 1996, 1997\
  The NetBSD Foundation, Inc.  All rights reserved.");
-__RCSID("$NetBSD: ccdconfig.c,v 1.56 2014/12/07 10:44:34 mlelstv Exp $");
+__RCSID("$NetBSD: ccdconfig.c,v 1.56.18.1 2020/10/11 12:34:29 martin Exp $");
 #endif
 
 #include <sys/param.h>
@@ -391,24 +391,38 @@ pathtounit(char *path, int *unitp)
 static char *
 resolve_ccdname(char *name)
 {
-	char c, *path;
+	char *path, *buf;
+	const char *p;
+	char c;
 	size_t len;
 	int rawpart;
 
 	if (name[0] == '/' || name[0] == '.') {
 		/* Assume they gave the correct pathname. */
-		return estrdup(name);
-	}
+		path = estrdup(name);
+	} else {
 
-	len = strlen(name);
-	c = name[len - 1];
+		len = strlen(name);
+		c = name[len - 1];
 
-	if (isdigit((unsigned char)c)) {
-		if ((rawpart = getrawpartition()) < 0)
-			return NULL;
-		easprintf(&path, "/dev/%s%c", name, 'a' + rawpart);
-	} else
-		easprintf(&path, "/dev/%s", name);
+		if (isdigit((unsigned char)c)) {
+			if ((rawpart = getrawpartition()) < 0)
+				return NULL;
+			easprintf(&path, "/dev/%s%c", name, 'a' + rawpart);
+		} else
+			easprintf(&path, "/dev/%s", name);
+	}
+
+	/*
+	 * Convert to raw device if possible.
+	 */
+	buf = emalloc(MAXPATHLEN);
+	p = getdiskrawname(buf, MAXPATHLEN, path);
+	if (p) {
+		free(path);
+		path = estrdup(p);
+	}
+	free(buf);
 
 	return path;
 }
@@ -562,6 +576,7 @@ dump_ccd(int argc, char **argv, int acti
 			continue;
 		}
 		errs += printccdinfo(i);
+		free(ccd);
 	}
 	return errs;
 }

Index: src/sys/dev/ccd.c
diff -u src/sys/dev/ccd.c:1.179 src/sys/dev/ccd.c:1.179.4.1
--- src/sys/dev/ccd.c:1.179	Wed Mar 27 19:13:34 2019
+++ src/sys/dev/ccd.c	Sun Oct 11 12:34:29 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ccd.c,v 1.179 2019/03/27 19:13:34 martin Exp $	*/
+/*	$NetBSD: ccd.c,v 1.179.4.1 2020/10/11 12:34:29 martin Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 1999, 2007, 2009 The NetBSD Foundation, Inc.
@@ -88,7 +88,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ccd.c,v 1.179 2019/03/27 19:13:34 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ccd.c,v 1.179.4.1 2020/10/11 12:34:29 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -209,6 +209,11 @@ const struct cdevsw ccd_cdevsw = {
 	.d_flag = D_DISK | D_MPSAFE
 };
 
+static const struct dkdriver ccddkdriver = {
+	.d_strategy = ccdstrategy,
+	.d_minphys = minphys
+}; 
+
 #ifdef DEBUG
 static	void printiinfo(struct ccdiinfo *);
 #endif
@@ -233,7 +238,7 @@ ccdcreate(int unit) {
 	sc->sc_iolock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NONE);
 	cv_init(&sc->sc_stop, "ccdstop");
 	cv_init(&sc->sc_push, "ccdthr");
-	disk_init(&sc->sc_dkdev, sc->sc_xname, NULL); /* XXX */
+	disk_init(&sc->sc_dkdev, sc->sc_xname, &ccddkdriver);
 	return sc;
 }
 
@@ -1138,8 +1143,6 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 			return (EBADF);
 	}
 
-	mutex_enter(&cs->sc_dvlock);
-
 	/* Must be initialized for these... */
 	switch (cmd) {
 	case CCDIOCCLR:
@@ -1163,15 +1166,102 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 	case ODIOCWDINFO:
 	case ODIOCGDEFLABEL:
 #endif
-		if ((cs->sc_flags & CCDF_INITED) == 0) {
-			error = ENXIO;
-			goto out;
-		}
+		if ((cs->sc_flags & CCDF_INITED) == 0)
+			return ENXIO;
 	}
 
 	error = disk_ioctl(&cs->sc_dkdev, dev, cmd, data, flag, l);
 	if (error != EPASSTHROUGH)
-		goto out;
+		return error;
+
+	switch (cmd) {
+	case DIOCGSTRATEGY:
+	    {
+		struct disk_strategy *dks = (void *)data;
+
+		mutex_enter(cs->sc_iolock);
+		if (cs->sc_bufq != NULL)
+			strlcpy(dks->dks_name,
+			    bufq_getstrategyname(cs->sc_bufq),
+			    sizeof(dks->dks_name));
+		else
+			error = EINVAL;
+		mutex_exit(cs->sc_iolock);
+		dks->dks_paramlen = 0;
+		break;
+	    }
+
+	case DIOCWDINFO:
+	case DIOCSDINFO:
+#ifdef __HAVE_OLD_DISKLABEL
+	case ODIOCWDINFO:
+	case ODIOCSDINFO:
+#endif
+	{
+		struct disklabel *lp;
+#ifdef __HAVE_OLD_DISKLABEL
+		if (cmd == ODIOCSDINFO || cmd == ODIOCWDINFO) {
+			memset(&newlabel, 0, sizeof newlabel);
+			memcpy(&newlabel, data, sizeof (struct olddisklabel));
+			lp = &newlabel;
+		} else
+#endif
+		lp = (struct disklabel *)data;
+
+		cs->sc_flags |= CCDF_LABELLING;
+
+		error = setdisklabel(cs->sc_dkdev.dk_label,
+		    lp, 0, cs->sc_dkdev.dk_cpulabel);
+		if (error == 0) {
+			if (cmd == DIOCWDINFO
+#ifdef __HAVE_OLD_DISKLABEL
+			    || cmd == ODIOCWDINFO
+#endif
+			   )
+				error = writedisklabel(CCDLABELDEV(dev),
+				    ccdstrategy, cs->sc_dkdev.dk_label,
+				    cs->sc_dkdev.dk_cpulabel);
+		}
+
+		cs->sc_flags &= ~CCDF_LABELLING;
+		break;
+	}
+
+	case DIOCKLABEL:
+		if (*(int *)data != 0)
+			cs->sc_flags |= CCDF_KLABEL;
+		else
+			cs->sc_flags &= ~CCDF_KLABEL;
+		break;
+
+	case DIOCWLABEL:
+		if (*(int *)data != 0)
+			cs->sc_flags |= CCDF_WLABEL;
+		else
+			cs->sc_flags &= ~CCDF_WLABEL;
+		break;
+
+	case DIOCGDEFLABEL:
+		ccdgetdefaultlabel(cs, (struct disklabel *)data);
+		break;
+
+#ifdef __HAVE_OLD_DISKLABEL
+	case ODIOCGDEFLABEL:
+		ccdgetdefaultlabel(cs, &newlabel);
+		if (newlabel.d_npartitions > OLDMAXPARTITIONS)
+			return ENOTTY;
+		memcpy(data, &newlabel, sizeof (struct olddisklabel));
+		break;
+#endif
+	default:
+		error = ENOTTY;
+			break;
+	}
+
+	if (error != ENOTTY)
+		return error;
+
+	mutex_enter(&cs->sc_dvlock);
 
 	error = 0;
 	switch (cmd) {
@@ -1237,6 +1327,12 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 				    sizeof(*vpp));
 				kmem_free(cpp, ccio->ccio_ndisks *
 				    sizeof(*cpp));
+
+				/*
+				 * No component data is allocated,
+				 * nothing is to be freed.
+				*/
+				cs->sc_nccdisks = 0;
 				goto out;
 			}
 			++lookedup;
@@ -1336,43 +1432,31 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 			    cs->sc_cinfo[i].ci_pathlen);
 		}
 
-		/* Free interleave index. */
-		for (i = 0; cs->sc_itable[i].ii_ndisk; ++i) {
-			kmem_free(cs->sc_itable[i].ii_index,
-			    cs->sc_itable[i].ii_indexsz);
+		if (cs->sc_nccdisks != 0) {
+			/* Free interleave index. */
+			for (i = 0; cs->sc_itable[i].ii_ndisk; ++i) {
+				kmem_free(cs->sc_itable[i].ii_index,
+				    cs->sc_itable[i].ii_indexsz);
+			}
+			/* Free component info and interleave table. */
+			kmem_free(cs->sc_cinfo, cs->sc_nccdisks *
+			    sizeof(struct ccdcinfo));
+			kmem_free(cs->sc_itable, (cs->sc_nccdisks + 1) *
+			    sizeof(struct ccdiinfo));
 		}
 
-		/* Free component info and interleave table. */
-		kmem_free(cs->sc_cinfo, cs->sc_nccdisks *
-		    sizeof(struct ccdcinfo));
-		kmem_free(cs->sc_itable, (cs->sc_nccdisks + 1) *
-		    sizeof(struct ccdiinfo));
-
 		aprint_normal("%s: detached\n", cs->sc_xname);
 
 		/* Detach the disk. */
 		disk_detach(&cs->sc_dkdev);
 		bufq_free(cs->sc_bufq);
+
+		/* also releases dv_lock */
 		ccdput(cs);
+
 		/* Don't break, otherwise cs is read again. */
 		return 0;
 
-	case DIOCGSTRATEGY:
-	    {
-		struct disk_strategy *dks = (void *)data;
-
-		mutex_enter(cs->sc_iolock);
-		if (cs->sc_bufq != NULL)
-			strlcpy(dks->dks_name,
-			    bufq_getstrategyname(cs->sc_bufq),
-			    sizeof(dks->dks_name));
-		else
-			error = EINVAL;
-		mutex_exit(cs->sc_iolock);
-		dks->dks_paramlen = 0;
-		break;
-	    }
-
 	case DIOCGCACHE:
 	    {
 		int dkcache = 0;
@@ -1414,73 +1498,11 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 		}
 		break;
 
-	case DIOCWDINFO:
-	case DIOCSDINFO:
-#ifdef __HAVE_OLD_DISKLABEL
-	case ODIOCWDINFO:
-	case ODIOCSDINFO:
-#endif
-	{
-		struct disklabel *lp;
-#ifdef __HAVE_OLD_DISKLABEL
-		if (cmd == ODIOCSDINFO || cmd == ODIOCWDINFO) {
-			memset(&newlabel, 0, sizeof newlabel);
-			memcpy(&newlabel, data, sizeof (struct olddisklabel));
-			lp = &newlabel;
-		} else
-#endif
-		lp = (struct disklabel *)data;
-
-		cs->sc_flags |= CCDF_LABELLING;
-
-		error = setdisklabel(cs->sc_dkdev.dk_label,
-		    lp, 0, cs->sc_dkdev.dk_cpulabel);
-		if (error == 0) {
-			if (cmd == DIOCWDINFO
-#ifdef __HAVE_OLD_DISKLABEL
-			    || cmd == ODIOCWDINFO
-#endif
-			   )
-				error = writedisklabel(CCDLABELDEV(dev),
-				    ccdstrategy, cs->sc_dkdev.dk_label,
-				    cs->sc_dkdev.dk_cpulabel);
-		}
-
-		cs->sc_flags &= ~CCDF_LABELLING;
+default:
+	error = ENOTTY;
 		break;
 	}
 
-	case DIOCKLABEL:
-		if (*(int *)data != 0)
-			cs->sc_flags |= CCDF_KLABEL;
-		else
-			cs->sc_flags &= ~CCDF_KLABEL;
-		break;
-
-	case DIOCWLABEL:
-		if (*(int *)data != 0)
-			cs->sc_flags |= CCDF_WLABEL;
-		else
-			cs->sc_flags &= ~CCDF_WLABEL;
-		break;
-
-	case DIOCGDEFLABEL:
-		ccdgetdefaultlabel(cs, (struct disklabel *)data);
-		break;
-
-#ifdef __HAVE_OLD_DISKLABEL
-	case ODIOCGDEFLABEL:
-		ccdgetdefaultlabel(cs, &newlabel);
-		if (newlabel.d_npartitions > OLDMAXPARTITIONS)
-			return ENOTTY;
-		memcpy(data, &newlabel, sizeof (struct olddisklabel));
-		break;
-#endif
-
-	default:
-		error = ENOTTY;
-	}
-
  out:
 	mutex_exit(&cs->sc_dvlock);
 	return (error);

Index: src/sys/dev/dkwedge/dk.c
diff -u src/sys/dev/dkwedge/dk.c:1.97.8.3 src/sys/dev/dkwedge/dk.c:1.97.8.4
--- src/sys/dev/dkwedge/dk.c:1.97.8.3	Fri Apr 24 17:42:53 2020
+++ src/sys/dev/dkwedge/dk.c	Sun Oct 11 12:34:29 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: dk.c,v 1.97.8.3 2020/04/24 17:42:53 martin Exp $	*/
+/*	$NetBSD: dk.c,v 1.97.8.4 2020/10/11 12:34:29 martin Exp $	*/
 
 /*-
  * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.97.8.3 2020/04/24 17:42:53 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.97.8.4 2020/10/11 12:34:29 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_dkwedge.h"
@@ -1412,7 +1412,10 @@ dkminphys(struct buf *bp)
 
 	dev = bp->b_dev;
 	bp->b_dev = sc->sc_pdev;
-	(*sc->sc_parent->dk_driver->d_minphys)(bp);
+	if (sc->sc_parent->dk_driver && sc->sc_parent->dk_driver->d_minphys)
+		(*sc->sc_parent->dk_driver->d_minphys)(bp);
+	else
+		minphys(bp);
 	bp->b_dev = dev;
 }
 

Reply via email to