/* attach routine */ void dmattach(int n) { int error; error = config_cfattach_attach(dm_cd.cd_name, &dm_ca); if (error) { aprint_error("%s: unable to register cfattach\n", dm_cd.cd_name); } else { dm_doinit(); } }
/* New module handle routine */ static int dm_modcmd(module_t mod, int cmd, void *unused) { int error, bmajor, cmajor; error = 0; bmajor = -1; cmajor = -1; switch (cmd) { case MOD_LOAD: dm_doinit(); kprintf("Device Mapper version %d.%d.%d loaded\n", DM_VERSION_MAJOR, DM_VERSION_MINOR, DM_VERSION_PATCHLEVEL); break; case MOD_UNLOAD: /* * Disable unloading of dm module if there are any devices * defined in driver. This is probably too strong we need * to disable auto-unload only if there is mounted dm device * present. */ if (dm_dev_counter > 0) return EBUSY; error = dmdestroy(); if (error) break; kprintf("Device Mapper unloaded\n"); break; default: break; } return error; }
/* New module handle routine */ static int dm_modcmd(modcmd_t cmd, void *arg) { #ifdef _MODULE int error, bmajor, cmajor; error = 0; bmajor = -1; cmajor = -1; switch (cmd) { case MODULE_CMD_INIT: error = config_cfdriver_attach(&dm_cd); if (error) break; error = config_cfattach_attach(dm_cd.cd_name, &dm_ca); if (error) { aprint_error("%s: unable to register cfattach\n", dm_cd.cd_name); return error; } error = devsw_attach(dm_cd.cd_name, &dm_bdevsw, &bmajor, &dm_cdevsw, &cmajor); if (error == EEXIST) error = 0; if (error) { config_cfattach_detach(dm_cd.cd_name, &dm_ca); config_cfdriver_detach(&dm_cd); break; } dm_doinit(); break; case MODULE_CMD_FINI: /* * Disable unloading of dm module if there are any devices * defined in driver. This is probably too strong we need * to disable auto-unload only if there is mounted dm device * present. */ if (dm_dev_counter > 0) return EBUSY; error = dmdestroy(); if (error) break; config_cfdriver_detach(&dm_cd); devsw_detach(&dm_bdevsw, &dm_cdevsw); break; case MODULE_CMD_STAT: return ENOTTY; default: return ENOTTY; } return error; #else return ENOTTY; #endif }