diff options
Diffstat (limited to 'sys/kern/kern_conf.c')
-rw-r--r-- | sys/kern/kern_conf.c | 64 |
1 files changed, 63 insertions, 1 deletions
diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c index e66ebe1..912c4c5 100644 --- a/sys/kern/kern_conf.c +++ b/sys/kern/kern_conf.c @@ -30,11 +30,12 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: kern_conf.c,v 1.22 1997/09/27 13:39:03 kato Exp $ + * $Id: kern_conf.c,v 1.23 1997/11/22 08:35:37 bde Exp $ */ #include <sys/param.h> #include <sys/systm.h> +#include <sys/module.h> #include <sys/conf.h> #include <sys/vnode.h> @@ -212,3 +213,64 @@ bdevsw_add_generic(int bdev, int cdev, struct bdevsw *bdevsw) dev = makedev(bdev, 0); bdevsw_add(&dev, bdevsw , NULL); } + +int +cdevsw_module_handler(module_t mod, modeventtype_t what, void* arg) +{ + struct cdevsw_module_data* data = (struct cdevsw_module_data*) arg; + int error; + + switch (what) { + case MOD_LOAD: + if (error = cdevsw_add(&data->dev, data->cdevsw, NULL)) + return error; + break; + + case MOD_UNLOAD: + if (error = cdevsw_add(&data->dev, NULL, NULL)) + return error; + break; + } + + if (data->chainevh) + return data->chainevh(mod, what, data->chainarg); + else + return 0; +} + +int +bdevsw_module_handler(module_t mod, modeventtype_t what, void* arg) +{ + struct bdevsw_module_data* data = (struct bdevsw_module_data*) arg; + int error; + + switch (what) { + case MOD_LOAD: + /* + * XXX hack alert. + */ + if (isdisk(data->bdev, VBLK) && data->bdevsw->d_flags != D_DISK) { + printf("bdevsw_module_handler: adding D_DISK flag for device %d\n", + major(data->bdev)); + data->bdevsw->d_flags = D_DISK; + } + cdevsw_make(data->bdevsw); + if (error = cdevsw_add(&data->cdev, data->bdevsw->d_cdev, NULL)) + return error; + if (error = bdevsw_add(&data->bdev, data->bdevsw, NULL)) + return error; + break; + + case MOD_UNLOAD: + if (error = cdevsw_add(&data->cdev, NULL, NULL)) + return error; + if (error = cdevsw_add(&data->bdev, NULL, NULL)) + return error; + break; + } + + if (data->chainevh) + return data->chainevh(mod, what, data->chainarg); + else + return 0; +} |