summaryrefslogtreecommitdiff
path: root/sys/dev/dm/dm_target_zero.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/dm/dm_target_zero.c')
-rw-r--r--sys/dev/dm/dm_target_zero.c59
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.