Date: Fri, 19 Mar 1999 03:00:04 -0800 (PST) From: Doug Rabson <dfr@nlsystems.com> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/10653: cdevsw_module_handler MOD_UNLOAD problem Message-ID: <199903191100.DAA07188@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/10653; it has been noted by GNATS.
From: Doug Rabson <dfr@nlsystems.com>
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199903191100.DAA07188>
