From owner-svn-src-head@FreeBSD.ORG Tue Nov 23 20:23:25 2010 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D56F4106564A; Tue, 23 Nov 2010 20:23:25 +0000 (UTC) (envelope-from weongyo@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id C3A4A8FC08; Tue, 23 Nov 2010 20:23:25 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id oANKNPid041955; Tue, 23 Nov 2010 20:23:25 GMT (envelope-from weongyo@svn.freebsd.org) Received: (from weongyo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id oANKNPME041953; Tue, 23 Nov 2010 20:23:25 GMT (envelope-from weongyo@svn.freebsd.org) Message-Id: <201011232023.oANKNPME041953@svn.freebsd.org> From: Weongyo Jeong Date: Tue, 23 Nov 2010 20:23:25 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r215764 - head/sys/dev/usb X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 23 Nov 2010 20:23:25 -0000 Author: weongyo Date: Tue Nov 23 20:23:25 2010 New Revision: 215764 URL: http://svn.freebsd.org/changeset/base/215764 Log: Fixes a kernel crash when usb module is reloaded after unload that it didn't destroy the cdev properly. Pointy hat to: me Reported by: Brandon Gooch , jkim Modified: head/sys/dev/usb/usb_pf.c Modified: head/sys/dev/usb/usb_pf.c ============================================================================== --- head/sys/dev/usb/usb_pf.c Tue Nov 23 19:23:47 2010 (r215763) +++ head/sys/dev/usb/usb_pf.c Tue Nov 23 20:23:25 2010 (r215764) @@ -141,6 +141,7 @@ static struct cdevsw usbpf_cdevsw = { .d_kqfilter = usbpf_kqfilter, }; +static struct cdev *usbpf_cdev; static LIST_HEAD(, usbpf_if) usbpf_iflist; static struct mtx usbpf_mtx; /* global lock */ static int usbpf_uifd_cnt; @@ -1850,13 +1851,26 @@ usbpf_append_bytes(struct usbpf_d *ud, c static void usbpf_drvinit(void *unused) { - struct cdev *dev; mtx_init(&usbpf_mtx, "USB packet filter global lock", NULL, MTX_DEF); LIST_INIT(&usbpf_iflist); - dev = make_dev(&usbpf_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "usbpf"); + usbpf_cdev = make_dev(&usbpf_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, + "usbpf"); +} + +static void +usbpf_drvuninit(void) +{ + + if (usbpf_cdev != NULL) { + destroy_dev(usbpf_cdev); + usbpf_cdev = NULL; + } + mtx_destroy(&usbpf_mtx); } SYSINIT(usbpf_dev, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, usbpf_drvinit, NULL); +SYSUNINIT(usbpf_undev, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, usbpf_drvuninit, NULL); +