diff options
| author | pooka <pooka@NetBSD.org> | 2010-02-19 12:40:47 +0000 |
|---|---|---|
| committer | pooka <pooka@NetBSD.org> | 2010-02-19 12:40:47 +0000 |
| commit | 3dbf8271ce793bbc60739b0bba95bcb15a7585ea (patch) | |
| tree | 71f8496764ce16b7281449071a581aebc86ffe81 /sys/dev/usb | |
| parent | bf551971e80043db51f39a631bddd983673668ee (diff) | |
Replace USB_GET_SC() instances with USB_GET_SC_OPEN(). The latter
is exactly like the former, except it returns with ENXIO if sc is
NULL instead of continuing on to use it. Most of the time this is
handled by the fd layer and you get EBADF, but sometimes it's
possible to race into the device method for whatever reason and
you get a kernel panic. I have no idea what the "whatever reason"
might be.
Diffstat (limited to 'sys/dev/usb')
| -rw-r--r-- | sys/dev/usb/ugen.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/sys/dev/usb/ugen.c b/sys/dev/usb/ugen.c index 416f7b53869..a03eebb3071 100644 --- a/sys/dev/usb/ugen.c +++ b/sys/dev/usb/ugen.c @@ -1,4 +1,4 @@ -/* $NetBSD: ugen.c,v 1.108 2009/12/24 01:32:22 jakllsch Exp $ */ +/* $NetBSD: ugen.c,v 1.109 2010/02/19 12:40:47 pooka Exp $ */ /* * Copyright (c) 1998, 2004 The NetBSD Foundation, Inc. @@ -37,7 +37,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ugen.c,v 1.108 2009/12/24 01:32:22 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ugen.c,v 1.109 2010/02/19 12:40:47 pooka Exp $"); #include "opt_compat_netbsd.h" @@ -507,7 +507,7 @@ ugenclose(dev_t dev, int flag, int mode, struct lwp *l) int dir; int i; - USB_GET_SC(ugen, UGENUNIT(dev), sc); + USB_GET_SC_OPEN(ugen, UGENUNIT(dev), sc); DPRINTFN(5, ("ugenclose: flag=%d, mode=%d, unit=%d, endpt=%d\n", flag, mode, UGENUNIT(dev), endpt)); @@ -786,7 +786,7 @@ ugenread(dev_t dev, struct uio *uio, int flag) struct ugen_softc *sc; int error; - USB_GET_SC(ugen, UGENUNIT(dev), sc); + USB_GET_SC_OPEN(ugen, UGENUNIT(dev), sc); sc->sc_refcnt++; error = ugen_do_read(sc, endpt, uio, flag); @@ -969,7 +969,7 @@ ugenwrite(dev_t dev, struct uio *uio, int flag) struct ugen_softc *sc; int error; - USB_GET_SC(ugen, UGENUNIT(dev), sc); + USB_GET_SC_OPEN(ugen, UGENUNIT(dev), sc); sc->sc_refcnt++; error = ugen_do_write(sc, endpt, uio, flag); @@ -1823,7 +1823,7 @@ ugenioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l) struct ugen_softc *sc; int error; - USB_GET_SC(ugen, UGENUNIT(dev), sc); + USB_GET_SC_OPEN(ugen, UGENUNIT(dev), sc); sc->sc_refcnt++; error = ugen_do_ioctl(sc, endpt, cmd, addr, flag, l); @@ -1840,7 +1840,7 @@ ugenpoll(dev_t dev, int events, struct lwp *l) int revents = 0; int s; - USB_GET_SC(ugen, UGENUNIT(dev), sc); + USB_GET_SC_OPEN(ugen, UGENUNIT(dev), sc); if (sc->sc_dying) return (POLLHUP); @@ -2025,7 +2025,7 @@ ugenkqfilter(dev_t dev, struct knote *kn) struct klist *klist; int s; - USB_GET_SC(ugen, UGENUNIT(dev), sc); + USB_GET_SC_OPEN(ugen, UGENUNIT(dev), sc); if (sc->sc_dying) return (ENXIO); |
