Module Name: src Committed By: pgoyette Date: Mon Jul 25 03:30:52 UTC 2016
Modified Files: src/sys/dev/isa [pgoyette-localcount]: fd.c isv.c mcd.c Log Message: Update a few drivers for localcount(9) To generate a diff of this commit: cvs rdiff -u -r1.110 -r1.110.2.1 src/sys/dev/isa/fd.c cvs rdiff -u -r1.7 -r1.7.8.1 src/sys/dev/isa/isv.c cvs rdiff -u -r1.116 -r1.116.2.1 src/sys/dev/isa/mcd.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/isa/fd.c diff -u src/sys/dev/isa/fd.c:1.110 src/sys/dev/isa/fd.c:1.110.2.1 --- src/sys/dev/isa/fd.c:1.110 Tue Dec 8 20:36:15 2015 +++ src/sys/dev/isa/fd.c Mon Jul 25 03:30:51 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: fd.c,v 1.110 2015/12/08 20:36:15 christos Exp $ */ +/* $NetBSD: fd.c,v 1.110.2.1 2016/07/25 03:30:51 pgoyette Exp $ */ /*- * Copyright (c) 1998, 2003, 2008 The NetBSD Foundation, Inc. @@ -81,7 +81,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.110 2015/12/08 20:36:15 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.110.2.1 2016/07/25 03:30:51 pgoyette Exp $"); #include "opt_ddb.h" @@ -695,7 +695,9 @@ fd_dev_to_type(struct fd_softc *fd, dev_ void fdstrategy(struct buf *bp) { - struct fd_softc *fd = device_lookup_private(&fd_cd, FDUNIT(bp->b_dev)); + device_t self; + struct fd_softc *fd = + device_lookup_private_acquire(&fd_cd, FDUNIT(bp->b_dev), &self); struct fdc_softc *fdc = device_private(device_parent(fd->sc_dev)); int sz; @@ -753,12 +755,14 @@ fdstrategy(struct buf *bp) } #endif mutex_exit(&fdc->sc_mtx); + device_release(self); return; done: /* Toss transfer; we're done early. */ bp->b_resid = bp->b_bcount; biodone(bp); + device_release(self); } void @@ -917,20 +921,28 @@ out_fdc(bus_space_tag_t iot, bus_space_h int fdopen(dev_t dev, int flags, int mode, struct lwp *l) { + device_t self; struct fd_softc *fd; const struct fd_type *type; - fd = device_lookup_private(&fd_cd, FDUNIT(dev)); - if (fd == NULL) + fd = device_lookup_private_acquire(&fd_cd, FDUNIT(dev), &self); + if (fd == NULL) { + if (self != NULL) + device_release(self); return (ENXIO); + } type = fd_dev_to_type(fd, dev); - if (type == NULL) + if (type == NULL) { + device_release(self); return ENXIO; + } if ((fd->sc_flags & FD_OPEN) != 0 && - memcmp(fd->sc_type, type, sizeof(*type))) + memcmp(fd->sc_type, type, sizeof(*type))) { + device_release(self); return EBUSY; + } fd->sc_type_copy = *type; fd->sc_type = &fd->sc_type_copy; @@ -939,17 +951,20 @@ fdopen(dev_t dev, int flags, int mode, s fd_set_geometry(fd); + device_release(self); return 0; } int fdclose(dev_t dev, int flags, int mode, struct lwp *l) { + device_t self; struct fd_softc *fd = - device_lookup_private(&fd_cd, FDUNIT(dev)); + device_lookup_private_acquire(&fd_cd, FDUNIT(dev), &self); fd->sc_flags &= ~FD_OPEN; fd->sc_opts &= ~(FDOPT_NORETRY|FDOPT_SILENT); + device_release(self); return 0; } @@ -1396,8 +1411,9 @@ fdcretry(struct fdc_softc *fdc) int fdioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l) { + device_t self; struct fd_softc *fd = - device_lookup_private(&fd_cd, FDUNIT(dev)); + device_lookup_private_acquire(&fd_cd, FDUNIT(dev), &self); struct fdformat_parms *form_parms; struct fdformat_cmd *form_cmd; struct ne7_fd_formb *fd_formb; @@ -1426,20 +1442,25 @@ fdioctl(dev_t dev, u_long cmd, void *add lp->d_secpercyl = fd->sc_type->seccyl; lp->d_secperunit = fd->sc_type->size; - if (readdisklabel(dev, fdstrategy, lp, NULL) != NULL) + if (readdisklabel(dev, fdstrategy, lp, NULL) != NULL) { + device_release(self); return EINVAL; + } break; } error = disk_ioctl(&fd->sc_dk, dev, cmd, addr, flag, l); - if (error != EPASSTHROUGH) + if (error != EPASSTHROUGH) { + device_release(self); return error; + } switch (cmd) { case DIOCWLABEL: if ((flag & FWRITE) == 0) return EBADF; /* XXX do something */ + device_release(self); return 0; case DIOCWDINFO: @@ -1447,8 +1468,10 @@ fdioctl(dev_t dev, u_long cmd, void *add case ODIOCWDINFO: #endif { - if ((flag & FWRITE) == 0) + if ((flag & FWRITE) == 0) { + device_release(self); return EBADF; + } #ifdef __HAVE_OLD_DISKLABEL if (cmd == ODIOCWDINFO) { memset(&newlabel, 0, sizeof newlabel); @@ -1457,10 +1480,10 @@ fdioctl(dev_t dev, u_long cmd, void *add } #endif error = setdisklabel(lp, addr, 0, NULL); - if (error) - return error; + if (error == 0) + error = writedisklabel(dev, fdstrategy, lp, NULL); - error = writedisklabel(dev, fdstrategy, lp, NULL); + device_release(self); return error; } @@ -1488,21 +1511,23 @@ fdioctl(dev_t dev, u_long cmd, void *add default: return EINVAL; } + device_release(self); return 0; case FDIOCSETFORMAT: if((flag & FWRITE) == 0) return EBADF; /* must be opened for writing */ form_parms = (struct fdformat_parms *)addr; - if (form_parms->fdformat_version != FDFORMAT_VERSION) + if (form_parms->fdformat_version != FDFORMAT_VERSION) { + device_release(self); return EINVAL; /* wrong version of formatting prog */ - + } scratch = form_parms->nbps >> 7; if ((form_parms->nbps & 0x7f) || ffs(scratch) == 0 || - scratch & ~(1 << (ffs(scratch)-1))) - /* not a power-of-two multiple of 128 */ - return EINVAL; - + scratch & ~(1 << (ffs(scratch)-1))) { + device_release(self); + return EINVAL; /* not a power-of-two multiple of 128 */ + } switch (form_parms->xfer_rate) { case 500 * 1024: fd->sc_type->rate = FDC_500KBPS; @@ -1514,16 +1539,21 @@ fdioctl(dev_t dev, u_long cmd, void *add fd->sc_type->rate = FDC_250KBPS; break; default: + device_release(self); return EINVAL; } if (form_parms->nspt > FD_MAX_NSEC || form_parms->fillbyte > 0xff || - form_parms->interleave > 0xff) + form_parms->interleave > 0xff) { + device_release(self); return EINVAL; + } fd->sc_type->sectrac = form_parms->nspt; - if (form_parms->ntrk != 2 && form_parms->ntrk != 1) + if (form_parms->ntrk != 2 && form_parms->ntrk != 1) { + device_release(self); return EINVAL; + } fd->sc_type->heads = form_parms->ntrk; fd->sc_type->seccyl = form_parms->nspt * form_parms->ntrk; fd->sc_type->secsize = ffs(scratch)-1; @@ -1534,24 +1564,33 @@ fdioctl(dev_t dev, u_long cmd, void *add fd->sc_type->step = form_parms->stepspercyl; fd->sc_type->fillbyte = form_parms->fillbyte; fd->sc_type->interleave = form_parms->interleave; + + device_release(self); return 0; case FDIOCFORMAT_TRACK: - if((flag & FWRITE) == 0) + if((flag & FWRITE) == 0) { + device_release(self); return EBADF; /* must be opened for writing */ + } form_cmd = (struct fdformat_cmd *)addr; - if (form_cmd->formatcmd_version != FDFORMAT_VERSION) + if (form_cmd->formatcmd_version != FDFORMAT_VERSION) { + device_release(self); return EINVAL; /* wrong version of formatting prog */ + } if (form_cmd->head >= fd->sc_type->heads || form_cmd->cylinder >= fd->sc_type->cyls) { + device_release(self); return EINVAL; } fd_formb = malloc(sizeof(struct ne7_fd_formb), M_TEMP, M_NOWAIT); - if (fd_formb == 0) + if (fd_formb == 0) { + device_release(self); return ENOMEM; + } fd_formb->head = form_cmd->head; fd_formb->cyl = form_cmd->cylinder; @@ -1577,17 +1616,21 @@ fdioctl(dev_t dev, u_long cmd, void *add error = fdformat(dev, fd_formb, l); free(fd_formb, M_TEMP); + device_release(self); return error; case FDIOCGETOPTS: /* get drive options */ *(int *)addr = fd->sc_opts; + device_release(self); return 0; case FDIOCSETOPTS: /* set drive options */ fd->sc_opts = *(int *)addr; + device_release(self); return 0; default: + device_release(self); return ENOTTY; } @@ -1599,16 +1642,20 @@ fdioctl(dev_t dev, u_long cmd, void *add int fdformat(dev_t dev, struct ne7_fd_formb *finfo, struct lwp *l) { + device_t self; int rv = 0; struct fd_softc *fd = - device_lookup_private(&fd_cd, FDUNIT(dev)); + device_lookup_private_acquire(&fd_cd, FDUNIT(dev), &self); struct fd_type *type = fd->sc_type; struct buf *bp; /* set up a buffer header for fdstrategy() */ bp = getiobuf(NULL, false); - if (bp == NULL) + if (bp == NULL) { + if (self != NULL) + device_release(self); return ENOBUFS; + } bp->b_cflags = BC_BUSY; bp->b_flags = B_PHYS | B_FORMAT; @@ -1636,6 +1683,7 @@ fdformat(dev_t dev, struct ne7_fd_formb /* ...and wait for it to complete */ rv = biowait(bp); putiobuf(bp); + device_release(self); return rv; } Index: src/sys/dev/isa/isv.c diff -u src/sys/dev/isa/isv.c:1.7 src/sys/dev/isa/isv.c:1.7.8.1 --- src/sys/dev/isa/isv.c:1.7 Fri Jul 25 08:10:37 2014 +++ src/sys/dev/isa/isv.c Mon Jul 25 03:30:51 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: isv.c,v 1.7 2014/07/25 08:10:37 dholland Exp $ */ +/* $NetBSD: isv.c,v 1.7.8.1 2016/07/25 03:30:51 pgoyette Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: isv.c,v 1.7 2014/07/25 08:10:37 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: isv.c,v 1.7.8.1 2016/07/25 03:30:51 pgoyette Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -259,20 +259,29 @@ isv_attach(device_t parent, device_t sel int isv_open(dev_t dev, int flag, int devtype, lwp_t *l) { + device_t self; vaddr_t va; - struct isv_softc *sc = device_lookup_private(&isv_cd, minor(dev)); + struct isv_softc *sc = + device_lookup_private_acquire(&isv_cd, minor(dev), &self); - if (sc == NULL) + if (sc == NULL) { + if (self != NULL) + device_release(self); return ENXIO; - - if (sc->sc_frame != NULL) + } + if (sc->sc_frame != NULL) { + device_release(self); return 0; + } if ((va = uvm_km_alloc(kernel_map, ISV_WIDTH * ISV_LINES, PAGE_SIZE, - UVM_KMF_WIRED|UVM_KMF_ZERO|UVM_KMF_CANFAIL|UVM_KMF_WAITVA)) == 0) + UVM_KMF_WIRED|UVM_KMF_ZERO|UVM_KMF_CANFAIL|UVM_KMF_WAITVA)) == 0) { + device_release(self); return ENOMEM; + } sc->sc_frame = (uint16_t *)(void *)va; + device_release(self); return 0; } @@ -403,41 +412,60 @@ isv_capture(struct isv_softc *sc) int isv_ioctl(dev_t dev, u_long cmd, void *data, int flag, lwp_t *l) { + device_t self; struct isv_cmd ic; - struct isv_softc *sc = device_lookup_private(&isv_cd, minor(dev)); - - if (cmd != ISV_CMD) + struct isv_softc *sc = + device_lookup_private_acquire(&isv_cd, minor(dev), &self); + int error; + + if (cmd != ISV_CMD) { + if (self != NULL) + device_release(self); return ENOTTY; + } memcpy(&ic, data, sizeof(ic)); - if (ic.c_cmd != ISV_CMD_READ) + if (ic.c_cmd != ISV_CMD_READ) { + if (self != NULL) + device_release(self); return EINVAL; + } ic.c_frameno = 0; - return isv_capture(sc); + error = isv_capture(sc); + device_release(self); + return error; } paddr_t isv_mmap(dev_t dev, off_t offset, int prot) { - struct isv_softc *sc = device_lookup_private(&isv_cd, minor(dev)); - paddr_t pa; + device_t self; + struct isv_softc *sc = + device_lookup_private_acquire(&isv_cd, minor(dev), &self); + paddr_t pa, rpa; - if ((prot & ~(VM_PROT_READ)) != 0) + if ((prot & ~(VM_PROT_READ)) != 0) { + device_release(self); return -1; - - if (sc->sc_frame == NULL) + } + if (sc->sc_frame == NULL) { + device_release(self); return -1; - - if (offset >= ISV_WIDTH * ISV_LINES) + } + if (offset >= ISV_WIDTH * ISV_LINES) { + device_release(self); return -1; - - if (!pmap_extract(pmap_kernel(), (vaddr_t)&sc->sc_frame[offset/2], &pa)) + } + if (!pmap_extract(pmap_kernel(), (vaddr_t)&sc->sc_frame[offset/2], &pa)) { + device_release(self); return -1; - - return atop(pa); + } + rpa = atop(pa); + device_release(self); + return rpa; } static int Index: src/sys/dev/isa/mcd.c diff -u src/sys/dev/isa/mcd.c:1.116 src/sys/dev/isa/mcd.c:1.116.2.1 --- src/sys/dev/isa/mcd.c:1.116 Thu Jul 14 10:19:06 2016 +++ src/sys/dev/isa/mcd.c Mon Jul 25 03:30:52 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: mcd.c,v 1.116 2016/07/14 10:19:06 msaitoh Exp $ */ +/* $NetBSD: mcd.c,v 1.116.2.1 2016/07/25 03:30:52 pgoyette Exp $ */ /* * Copyright (c) 1993, 1994, 1995 Charles M. Hannum. All rights reserved. @@ -56,7 +56,7 @@ /*static char COPYRIGHT[] = "mcd-driver (C)1993 by H.Veit & B.Moore";*/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mcd.c,v 1.116 2016/07/14 10:19:06 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mcd.c,v 1.116.2.1 2016/07/25 03:30:52 pgoyette Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -312,12 +312,16 @@ mcdattach(device_t parent, device_t self int mcdopen(dev_t dev, int flag, int fmt, struct lwp *l) { + device_t self; int error, part; struct mcd_softc *sc; - sc = device_lookup_private(&mcd_cd, MCDUNIT(dev)); - if (sc == NULL) + sc = device_lookup_private_acquire(&mcd_cd, MCDUNIT(dev), &self); + if (sc == NULL) { + if (self != NULL) + device_release(self); return ENXIO; + } mutex_enter(&sc->sc_lock); @@ -389,6 +393,7 @@ mcdopen(dev_t dev, int flag, int fmt, st sc->sc_dk.dk_openmask = sc->sc_dk.dk_copenmask | sc->sc_dk.dk_bopenmask; mutex_exit(&sc->sc_lock); + device_release(self); return 0; bad2: @@ -404,13 +409,16 @@ bad: bad3: mutex_exit(&sc->sc_lock); + device_release(self); return error; } int mcdclose(dev_t dev, int flag, int fmt, struct lwp *l) { - struct mcd_softc *sc = device_lookup_private(&mcd_cd, MCDUNIT(dev)); + device_t self; + struct mcd_softc *sc = + device_lookup_private_acquire(&mcd_cd, MCDUNIT(dev), &self); int part = MCDPART(dev); MCD_TRACE("close: partition=%d\n", part); @@ -437,18 +445,20 @@ mcdclose(dev_t dev, int flag, int fmt, s } mutex_exit(&sc->sc_lock); + device_release(self); return 0; } void mcdstrategy(struct buf *bp) { + device_t self; struct mcd_softc *sc; struct disklabel *lp; daddr_t blkno; int s; - sc = device_lookup_private(&mcd_cd, MCDUNIT(bp->b_dev)); + sc = device_lookup_private_acquire(&mcd_cd, MCDUNIT(bp->b_dev), self); lp = sc->sc_dk.dk_label; /* Test validity. */ @@ -498,11 +508,13 @@ mcdstrategy(struct buf *bp) splx(s); if (!sc->active) mcdstart(sc); + device_release(self); return; done: bp->b_resid = bp->b_bcount; biodone(bp); + device_release(self); } void @@ -571,7 +583,9 @@ mcdwrite(dev_t dev, struct uio *uio, int int mcdioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l) { - struct mcd_softc *sc = device_lookup_private(&mcd_cd, MCDUNIT(dev)); + device_t self; + struct mcd_softc *sc = + device_lookup_private_acquire(&mcd_cd, MCDUNIT(dev), &self); int error; int part; #ifdef __HAVE_OLD_DISKLABEL @@ -580,12 +594,16 @@ mcdioctl(dev_t dev, u_long cmd, void *ad MCD_TRACE("ioctl: cmd=0x%lx\n", cmd); - if ((sc->flags & MCDF_LOADED) == 0) + if ((sc->flags & MCDF_LOADED) == 0) { + device_release(self); return EIO; + } error = disk_ioctl(&sc->sc_dk, dev, cmd, addr, flag, l); - if (error != EPASSTHROUGH) + if (error != EPASSTHROUGH) { + device_release(self); return error; + } part = MCDPART(dev); switch (cmd) { @@ -598,8 +616,10 @@ mcdioctl(dev_t dev, u_long cmd, void *ad { struct disklabel *lp; - if ((flag & FWRITE) == 0) - return EBADF; + if ((flag & FWRITE) == 0) { + error = EBADF; + break; + } #ifdef __HAVE_OLD_DISKLABEL if (cmd == ODIOCSDINFO || cmd == ODIOCWDINFO) { @@ -621,15 +641,17 @@ mcdioctl(dev_t dev, u_long cmd, void *ad sc->flags &= ~MCDF_LABELLING; mutex_exit(&sc->sc_lock); - return error; + break; } case DIOCWLABEL: - return EBADF; + error = EBADF; + break; case DIOCGDEFLABEL: mcdgetdefaultlabel(sc, addr); - return 0; + error = 0; + break; #ifdef __HAVE_OLD_DISKLABEL case ODIOCGDEFLABEL: @@ -637,15 +659,19 @@ mcdioctl(dev_t dev, u_long cmd, void *ad if (newlabel.d_npartitions > OLDMAXPARTITIONS) return ENOTTY; memcpy(addr, &newlabel, sizeof (struct olddisklabel)); - return 0; + error = 0; + break; #endif case CDIOCPLAYTRACKS: - return mcd_playtracks(sc, addr); + error = mcd_playtracks(sc, addr); + break; case CDIOCPLAYMSF: - return mcd_playmsf(sc, addr); + error = mcd_playmsf(sc, addr); + break; case CDIOCPLAYBLOCKS: - return mcd_playblocks(sc, addr); + error = mcd_playblocks(sc, addr); + break; case CDIOCREADSUBCHANNEL: { struct cd_sub_channel_info info; error = mcd_read_subchannel(sc, addr, &info); @@ -653,32 +679,36 @@ mcdioctl(dev_t dev, u_long cmd, void *ad struct ioc_read_subchannel *ch = addr; error = copyout(&info, ch->data, ch->data_len); } - return error; + braek; } case CDIOCREADSUBCHANNEL_BUF: - return mcd_read_subchannel(sc, addr, + error = mcd_read_subchannel(sc, addr, &((struct ioc_read_subchannel_buf *)addr)->info); + break; case CDIOREADTOCHEADER: - return mcd_toc_header(sc, addr); + error = mcd_toc_header(sc, addr); + break; case CDIOREADTOCENTRYS: { struct cd_toc_entry entries[MCD_MAXTOCS]; struct ioc_read_toc_entry *te = addr; int count; if (te->data_len > sizeof entries) - return EINVAL; - error = mcd_toc_entries(sc, te, entries, &count); + error = EINVAL; + else + error = mcd_toc_entries(sc, te, entries, &count); if (error == 0) /* Copy the data back. */ error = copyout(entries, te->data, min(te->data_len, count * sizeof(struct cd_toc_entry))); - return error; + break; } case CDIOREADTOCENTRIES_BUF: { struct ioc_read_toc_entry_buf *te = addr; int count; if (te->req.data_len > sizeof te->entry) return EINVAL; - return mcd_toc_entries(sc, &te->req, te->entry, &count); + error = mcd_toc_entries(sc, &te->req, te->entry, &count); + break; } case CDIOCSETPATCH: case CDIOCGETVOL: @@ -688,15 +718,20 @@ mcdioctl(dev_t dev, u_long cmd, void *ad case CDIOCSETMUTE: case CDIOCSETLEFT: case CDIOCSETRIGHT: - return EINVAL; + error = EINVAL; + break; case CDIOCRESUME: - return mcd_resume(sc); + error = mcd_resume(sc); + break; case CDIOCPAUSE: - return mcd_pause(sc); + error = mcd_pause(sc); + break; case CDIOCSTART: - return EINVAL; + error = EINVAL; + break; case CDIOCSTOP: - return mcd_stop(sc); + error = mcd_stop(sc); + break; case DIOCEJECT: if (*(int *)addr == 0) { /* @@ -708,38 +743,46 @@ mcdioctl(dev_t dev, u_long cmd, void *ad sc->sc_dk.dk_openmask) { error = mcd_setlock(sc, MCD_LK_UNLOCK); if (error) - return (error); + break; } else { - return (EBUSY); + error = EBUSY; + break; } } /* FALLTHROUGH */ case CDIOCEJECT: /* FALLTHROUGH */ case ODIOCEJECT: - return mcd_eject(sc); + error = mcd_eject(sc); + break; case CDIOCALLOW: - return mcd_setlock(sc, MCD_LK_UNLOCK); + error = mcd_setlock(sc, MCD_LK_UNLOCK); + break; case CDIOCPREVENT: - return mcd_setlock(sc, MCD_LK_LOCK); + error = mcd_setlock(sc, MCD_LK_LOCK); + break; case DIOCLOCK: - return mcd_setlock(sc, + error = mcd_setlock(sc, (*(int *)addr) ? MCD_LK_LOCK : MCD_LK_UNLOCK); + break; case CDIOCSETDEBUG: sc->debug = 1; - return 0; + error = 0; + break; case CDIOCCLRDEBUG: sc->debug = 0; - return 0; + error = 0; + break; case CDIOCRESET: - return mcd_hard_reset(sc); + error = mcd_hard_reset(sc); + break; default: - return ENOTTY; + error = ENOTTY; + break; } -#ifdef DIAGNOSTIC - panic("mcdioctl: impossible"); -#endif + device_release(self); + return error; } void