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>