Module Name:    src
Committed By:   christos
Date:           Tue Dec 30 20:29:43 UTC 2014

Modified Files:
        src/sys/dev: ccd.c

Log Message:
- only create ccd's when we ask them to be created.
- keep track of the number of active ccd's so that we don't modunload and
  crash
- fix formatting.
- don't attach 4, the argument is not used.


To generate a diff of this commit:
cvs rdiff -u -r1.157 -r1.158 src/sys/dev/ccd.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/dev/ccd.c
diff -u src/sys/dev/ccd.c:1.157 src/sys/dev/ccd.c:1.158
--- src/sys/dev/ccd.c:1.157	Tue Dec 30 14:11:05 2014
+++ src/sys/dev/ccd.c	Tue Dec 30 15:29:42 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ccd.c,v 1.157 2014/12/30 19:11:05 mlelstv Exp $	*/
+/*	$NetBSD: ccd.c,v 1.158 2014/12/30 20:29:42 christos 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.157 2014/12/30 19:11:05 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ccd.c,v 1.158 2014/12/30 20:29:42 christos Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -216,6 +216,7 @@ static	void printiinfo(struct ccdiinfo *
 
 static LIST_HEAD(, ccd_softc) ccds = LIST_HEAD_INITIALIZER(ccds);
 static kmutex_t ccd_lock;
+static size_t ccd_nactive = 0;
 
 static struct ccd_softc *
 ccdcreate(int unit) {
@@ -248,7 +249,7 @@ ccddestroy(struct ccd_softc *sc) {
 }
 
 static struct ccd_softc *
-ccdget(int unit) {
+ccdget(int unit, int make) {
 	struct ccd_softc *sc;
 	if (unit < 0) {
 #ifdef DIAGNOSTIC
@@ -264,10 +265,13 @@ ccdget(int unit) {
 		}
 	}
 	mutex_exit(&ccd_lock);
+	if (!make)
+		return NULL;
 	if ((sc = ccdcreate(unit)) == NULL)
 		return NULL;
 	mutex_enter(&ccd_lock);
 	LIST_INSERT_HEAD(&ccds, sc, sc_link);
+	ccd_nactive++;
 	mutex_exit(&ccd_lock);
 	return sc;
 }
@@ -276,6 +280,7 @@ static void 
 ccdput(struct ccd_softc *sc) {
 	mutex_enter(&ccd_lock);
 	LIST_REMOVE(sc, sc_link);
+	ccd_nactive--;
 	mutex_exit(&ccd_lock);
 	ccddestroy(sc);
 }
@@ -434,11 +439,11 @@ ccdinit(struct ccd_softc *cs, char **cpa
 
         dg = &cs->sc_dkdev.dk_geom;
         memset(dg, 0, sizeof(*dg));
-        dg->dg_secperunit = cs->sc_size;
-        dg->dg_secsize = ccg->ccg_secsize;
-        dg->dg_nsectors = ccg->ccg_nsectors;
-        dg->dg_ntracks = ccg->ccg_ntracks;
-        dg->dg_ncylinders = ccg->ccg_ncylinders;
+	dg->dg_secperunit = cs->sc_size;
+	dg->dg_secsize = ccg->ccg_secsize;
+	dg->dg_nsectors = ccg->ccg_nsectors;
+	dg->dg_ntracks = ccg->ccg_ntracks;
+	dg->dg_ncylinders = ccg->ccg_ncylinders;
 	
 	if (cs->sc_ileave > 0)
 	        aprint_normal("%s: Interleaving %d component%s "
@@ -601,7 +606,7 @@ ccdopen(dev_t dev, int flags, int fmt, s
 	if (ccddebug & CCDB_FOLLOW)
 		printf("ccdopen(0x%"PRIx64", 0x%x)\n", dev, flags);
 #endif
-	if ((cs = ccdget(unit)) == NULL)
+	if ((cs = ccdget(unit, 1)) == NULL)
 		return ENXIO;
 
 	mutex_enter(&cs->sc_dvlock);
@@ -662,7 +667,7 @@ ccdclose(dev_t dev, int flags, int fmt, 
 		printf("ccdclose(0x%"PRIx64", 0x%x)\n", dev, flags);
 #endif
 
-	if ((cs = ccdget(unit)) == NULL)
+	if ((cs = ccdget(unit, 0)) == NULL)
 		return ENXIO;
 
 	mutex_enter(&cs->sc_dvlock);
@@ -745,7 +750,7 @@ ccdstrategy(struct buf *bp)
 {
 	int unit = ccdunit(bp->b_dev);
 	struct ccd_softc *cs;
-	if ((cs = ccdget(unit)) == NULL)
+	if ((cs = ccdget(unit, 0)) == NULL)
 		return;
 
 	/* Must be open or reading label. */
@@ -1031,7 +1036,7 @@ ccdread(dev_t dev, struct uio *uio, int 
 	if (ccddebug & CCDB_FOLLOW)
 		printf("ccdread(0x%"PRIx64", %p)\n", dev, uio);
 #endif
-	if ((cs = ccdget(unit)) == NULL)
+	if ((cs = ccdget(unit, 0)) == NULL)
 		return 0;
 
 	/* Unlocked advisory check, ccdstrategy check is synchronous. */
@@ -1052,7 +1057,7 @@ ccdwrite(dev_t dev, struct uio *uio, int
 	if (ccddebug & CCDB_FOLLOW)
 		printf("ccdwrite(0x%"PRIx64", %p)\n", dev, uio);
 #endif
-	if ((cs = ccdget(unit)) == NULL)
+	if ((cs = ccdget(unit, 0)) == NULL)
 		return ENOENT;
 
 	/* Unlocked advisory check, ccdstrategy check is synchronous. */
@@ -1067,7 +1072,7 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 {
 	int unit = ccdunit(dev);
 	int i, j, lookedup = 0, error = 0;
-	int part, pmask;
+	int part, pmask, make;
 	struct ccd_softc *cs;
 	struct ccd_ioctl *ccio = (struct ccd_ioctl *)data;
 	kauth_cred_t uc;
@@ -1078,7 +1083,19 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 	struct disklabel newlabel;
 #endif
 
-	if ((cs = ccdget(unit)) == NULL)
+	switch (cmd) {
+#if defined(COMPAT_60) && !defined(_LP64)
+	case CCDIOCSET_60:
+#endif
+	case CCDIOCSET:
+		make = 1;
+		break;
+	default:
+		make = 0;
+		break;
+	}
+
+	if ((cs = ccdget(unit, make)) == NULL)
 		return ENOENT;
 	uc = kauth_cred_get();
 
@@ -1506,7 +1523,7 @@ ccdsize(dev_t dev)
 	int part, unit, omask, size;
 
 	unit = ccdunit(dev);
-	if ((cs = ccdget(unit)) == NULL)
+	if ((cs = ccdget(unit, 0)) == NULL)
 		return -1;
 
 	if ((cs->sc_flags & CCDF_INITED) == 0)
@@ -1578,7 +1595,7 @@ ccdgetdisklabel(dev_t dev)
 	struct disklabel *lp;
 	struct cpu_disklabel *clp;
 
-	if ((cs = ccdget(unit)) == NULL)
+	if ((cs = ccdget(unit, 0)) == NULL)
 		return;
 	lp = cs->sc_dkdev.dk_label;
 	clp = cs->sc_dkdev.dk_cpulabel;
@@ -1689,16 +1706,21 @@ ccd_modcmd(modcmd_t cmd, void *arg)
 	switch (cmd) {
 	case MODULE_CMD_INIT:
 #ifdef _MODULE
-		ccdattach(4);
+		ccdattach(0);
 
-		return devsw_attach("ccd", &ccd_bdevsw, &bmajor,
+		error = devsw_attach("ccd", &ccd_bdevsw, &bmajor,
 		    &ccd_cdevsw, &cmajor);
 #endif
 		break;
 
 	case MODULE_CMD_FINI:
 #ifdef _MODULE
-		return devsw_detach(&ccd_bdevsw, &ccd_cdevsw);
+		mutex_enter(&ccd_lock);
+		if (ccd_nactive)
+			error = EBUSY;
+		else
+			error = devsw_detach(&ccd_bdevsw, &ccd_cdevsw);
+		mutex_exit(&ccd_lock);
 #endif
 		break;
 

Reply via email to