summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_conf.c
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>1999-03-23 21:11:47 +0000
committerdfr <dfr@FreeBSD.org>1999-03-23 21:11:47 +0000
commit11ad9ec0faf05fe2db5754c0da78e7c406f671dc (patch)
tree427f81fd3ebb7ea4651c5737a30676c1122f2ee5 /sys/kern/kern_conf.c
parent578ecf706ca430d14a8acbe37b6fc416d8a19caf (diff)
downloadFreeBSD-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.c45
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)
OpenPOWER on IntegriCloud