aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Rabson <dfr@FreeBSD.org>1999-03-23 21:11:47 +0000
committerDoug Rabson <dfr@FreeBSD.org>1999-03-23 21:11:47 +0000
commit6ca34d85be402b5064da03ad44f2701d8fd03031 (patch)
tree8ee1807cb1ff2f519b8a1ece92f7a213758d73c3
parentce04fea4452e71a6da05a6b89fb0c020f02947a1 (diff)
downloadsrc-6ca34d85be402b5064da03ad44f2701d8fd03031.tar.gz
src-6ca34d85be402b5064da03ad44f2701d8fd03031.zip
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
Notes
Notes: svn path=/head/; revision=44975
-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 e47459b4f0f9..502b78d9bd79 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)