diff options
| author | haad <haad@NetBSD.org> | 2008-12-21 00:59:39 +0000 |
|---|---|---|
| committer | haad <haad@NetBSD.org> | 2008-12-21 00:59:39 +0000 |
| commit | cca8fb31f911820f397b9d96a25bdf445dcaa28b (patch) | |
| tree | 2a241827f48fd6b8d163de6d5f6d4c7bd4388c30 /sys/dev/dm/dm_target_zero.c | |
| parent | 38805eb14c9a24414515ec80d28fc16ff67c9c41 (diff) | |
Add support for loading dm targets as separate modules. All targets except
linear can be loaded as module. Module is not loaded when there is target
with similar name already. Zero and error targets aresimple examples how
can be all future targets written to support dynamic loading. Target can't
be unloaded until there is at least one user.
Diffstat (limited to 'sys/dev/dm/dm_target_zero.c')
| -rw-r--r-- | sys/dev/dm/dm_target_zero.c | 59 |
1 files changed, 58 insertions, 1 deletions
diff --git a/sys/dev/dm/dm_target_zero.c b/sys/dev/dm/dm_target_zero.c index c323620732c..b752559ca50 100644 --- a/sys/dev/dm/dm_target_zero.c +++ b/sys/dev/dm/dm_target_zero.c @@ -1,4 +1,4 @@ -/* $NetBSD: dm_target_zero.c,v 1.3 2008/12/19 16:30:41 haad Exp $ */ +/* $NetBSD: dm_target_zero.c,v 1.4 2008/12/21 00:59:39 haad Exp $ */ /* * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -40,6 +40,63 @@ #include "dm.h" +#ifdef DM_TARGET_MODULE +/* + * Every target can be compiled directly to dm driver or as a + * separate module this part of target is used for loading targets + * to dm driver. + * Target can be unloaded from kernel only if there are no users of + * it e.g. there are no devices which uses that target. + */ +#include <sys/kernel.h> +#include <sys/module.h> + +MODULE(MODULE_CLASS_MISC, dm_target_zero, NULL); + +static int +dm_target_zero_modcmd(modcmd_t cmd, void *arg) +{ + dm_target_t *dmt; + int r; + dmt = NULL; + + switch (cmd) { + case MODULE_CMD_INIT: + if ((dmt = dm_target_lookup("zero")) != NULL) + return EEXIST; + + dmt = dm_target_alloc("zero"); + + dmt->version[0] = 1; + dmt->version[1] = 0; + dmt->version[2] = 0; + strlcpy(dmt->name, "zero", DM_MAX_TYPE_NAME); + dmt->init = &dm_target_zero_init; + dmt->status = &dm_target_zero_status; + dmt->strategy = &dm_target_zero_strategy; + dmt->deps = &dm_target_zero_deps; + dmt->destroy = &dm_target_zero_destroy; + dmt->upcall = &dm_target_zero_upcall; + + r = dm_target_insert(dmt); + break; + + case MODULE_CMD_FINI: + r = dm_target_rem("zero"); + break; + + case MODULE_CMD_STAT: + return ENOTTY; + + default: + return ENOTTY; + } + + return r; +} + +#endif + /* * Zero target init function. This target doesn't need * target specific config area. |
