From owner-freebsd-bugs Fri Mar 19 3: 2:57 1999 Delivered-To: freebsd-bugs@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.ORG [204.216.27.21]) by hub.freebsd.org (Postfix) with ESMTP id 48CE214E7B for ; Fri, 19 Mar 1999 03:00:23 -0800 (PST) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.9.2/8.9.2) id DAA07188; Fri, 19 Mar 1999 03:00:04 -0800 (PST) (envelope-from gnats@FreeBSD.org) Date: Fri, 19 Mar 1999 03:00:04 -0800 (PST) Message-Id: <199903191100.DAA07188@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org Cc: From: Doug Rabson Subject: Re: kern/10653: cdevsw_module_handler MOD_UNLOAD problem Reply-To: Doug Rabson Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org The following reply was made to PR kern/10653; it has been noted by GNATS. From: Doug Rabson To: M.Indlekofer@fz-juelich.de Cc: freebsd-gnats-submit@freebsd.org Subject: Re: kern/10653: cdevsw_module_handler MOD_UNLOAD problem Date: Fri, 19 Mar 1999 10:58:05 +0000 (GMT) On Thu, 18 Mar 1999 M.Indlekofer@fz-juelich.de wrote: > In my case: A program used a device and kldunload was called. > xxx_handler returned EBUSY and kldunload said: can't unload, device busy. > The next time the program issued a ioctl for the still open device > the system crashed in spec_ioctl (gdb -k ...) with an invalid > entry in the cdevsw for MYMAJOR: Fatal trap 12: page fault in kernel mode. > >How-To-Repeat: > see example above > >Fix: > /sys/kern/kern_conf.c:???devsw_module_handler should consult the > module handler (data->chainevh) FIRST in the case of MOD_UNLOAD > whether the module want's to unload before it "kills" the devsw! Could you test this patch: Index: kern_conf.c =================================================================== RCS file: /home/ncvs/src/sys/kern/kern_conf.c,v retrieving revision 1.30 diff -u -r1.30 kern_conf.c --- kern_conf.c 1999/01/27 21:49:55 1.30 +++ kern_conf.c 1999/03/19 10:22:40 @@ -173,14 +173,18 @@ switch (what) { case MOD_LOAD: - if ((error = cdevsw_add(&data->dev, data->cdevsw, NULL)) != 0) - return error; - break; + error = cdevsw_add(&data->dev, data->cdevsw, NULL); + if (!error && data->chainevh) + error = data->chainevh(mod, what, data->chainarg); + return error; case MOD_UNLOAD: - if ((error = cdevsw_add(&data->dev, NULL, NULL)) != 0) - return error; - break; + if (data->chainevh) { + error = data->chainevh(mod, what, data->chainarg); + if (error) + return error; + } + return cdevsw_add(&data->dev, NULL, NULL); } if (data->chainevh) @@ -197,20 +201,23 @@ switch (what) { case MOD_LOAD: - if ((error = cdevsw_add(&data->cdev, data->cdevsw, NULL)) != 0) - return error; - if ((error = bdevsw_add(&data->bdev, data->cdevsw, NULL)) != 0) { - cdevsw_add(&data->bdev, NULL, NULL); - return error; - } - break; + error = cdevsw_add(&data->cdev, data->cdevsw, NULL); + if (!error) + error = bdevsw_add(&data->bdev, data->cdevsw, NULL); + if (!error && data->chainevh) + error = data->chainevh(mod, what, data->chainarg); + return error; case MOD_UNLOAD: - if ((error = bdevsw_add(&data->bdev, NULL, NULL)) != 0) - return error; - if ((error = cdevsw_add(&data->cdev, NULL, NULL)) != 0) - return error; - break; + if (data->chainevh) { + error = data->chainevh(mod, what, data->chainarg); + if (error) + return error; + } + error = bdevsw_add(&data->bdev, NULL, NULL); + if (!error) + error = cdevsw_add(&data->cdev, NULL, NULL); + return error; } if (data->chainevh) -- Doug Rabson Mail: dfr@nlsystems.com Nonlinear Systems Ltd. Phone: +44 181 442 9037 To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message