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