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;
}