diff options
author | dfr <dfr@FreeBSD.org> | 1999-03-23 21:11:47 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 1999-03-23 21:11:47 +0000 |
commit | 11ad9ec0faf05fe2db5754c0da78e7c406f671dc (patch) | |
tree | 427f81fd3ebb7ea4651c5737a30676c1122f2ee5 /sys/kern/kern_conf.c | |
parent | 578ecf706ca430d14a8acbe37b6fc416d8a19caf (diff) | |
download | FreeBSD-src-11ad9ec0faf05fe2db5754c0da78e7c406f671dc.zip FreeBSD-src-11ad9ec0faf05fe2db5754c0da78e7c406f671dc.tar.gz |
Call the module's unload handler before removing the device from the
cdevsw list. This allows a handler to veto the load without losing its
place in the list.
PR: kern/10653
Diffstat (limited to 'sys/kern/kern_conf.c')
-rw-r--r-- | sys/kern/kern_conf.c | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c index e47459b..502b78d 100644 --- a/sys/kern/kern_conf.c +++ b/sys/kern/kern_conf.c @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: kern_conf.c,v 1.29 1998/11/14 21:58:51 wollman Exp $ + * $Id: kern_conf.c,v 1.30 1999/01/27 21:49:55 dillon Exp $ */ #include <sys/param.h> @@ -173,14 +173,18 @@ cdevsw_module_handler(module_t mod, int what, void *arg) 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 @@ bdevsw_module_handler(module_t mod, int what, void* arg) 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) |