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