summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorpooka <pooka@NetBSD.org>2010-02-19 12:40:47 +0000
committerpooka <pooka@NetBSD.org>2010-02-19 12:40:47 +0000
commit3dbf8271ce793bbc60739b0bba95bcb15a7585ea (patch)
tree71f8496764ce16b7281449071a581aebc86ffe81 /sys/dev
parentbf551971e80043db51f39a631bddd983673668ee (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')
-rw-r--r--sys/dev/usb/ugen.c16
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);