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

Reply via email to