2 * Copyright (C) 2001 Sistina Software (UK) Limited
4 * This file is released under the GPL.
9 #include <linux/module.h>
10 #include <linux/init.h>
11 #include <linux/kmod.h>
12 #include <linux/bio.h>
13 #include <linux/slab.h>
15 #define DM_MSG_PREFIX "target"
18 struct target_type tt
;
20 struct list_head list
;
23 static LIST_HEAD(_targets
);
24 static DECLARE_RWSEM(_lock
);
26 #define DM_MOD_NAME_SIZE 32
28 static inline struct tt_internal
*__find_target_type(const char *name
)
30 struct tt_internal
*ti
;
32 list_for_each_entry (ti
, &_targets
, list
)
33 if (!strcmp(name
, ti
->tt
.name
))
39 static struct tt_internal
*get_target_type(const char *name
)
41 struct tt_internal
*ti
;
45 ti
= __find_target_type(name
);
46 if (ti
&& !try_module_get(ti
->tt
.module
))
53 static void load_module(const char *name
)
55 request_module("dm-%s", name
);
58 struct target_type
*dm_get_target_type(const char *name
)
60 struct tt_internal
*ti
= get_target_type(name
);
64 ti
= get_target_type(name
);
67 return ti
? &ti
->tt
: NULL
;
70 void dm_put_target_type(struct target_type
*t
)
72 struct tt_internal
*ti
= (struct tt_internal
*) t
;
75 module_put(ti
->tt
.module
);
81 static struct tt_internal
*alloc_target(struct target_type
*t
)
83 struct tt_internal
*ti
= kzalloc(sizeof(*ti
), GFP_KERNEL
);
92 int dm_target_iterate(void (*iter_func
)(struct target_type
*tt
,
93 void *param
), void *param
)
95 struct tt_internal
*ti
;
98 list_for_each_entry (ti
, &_targets
, list
)
99 iter_func(&ti
->tt
, param
);
105 int dm_register_target(struct target_type
*t
)
108 struct tt_internal
*ti
= alloc_target(t
);
114 if (__find_target_type(t
->name
))
117 list_add(&ti
->list
, &_targets
);
125 void dm_unregister_target(struct target_type
*t
)
127 struct tt_internal
*ti
;
130 if (!(ti
= __find_target_type(t
->name
))) {
131 DMCRIT("Unregistering unrecognised target: %s", t
->name
);
142 * io-err: always fails an io, useful for bringing
143 * up LVs that have holes in them.
145 static int io_err_ctr(struct dm_target
*ti
, unsigned int argc
, char **args
)
150 static void io_err_dtr(struct dm_target
*ti
)
155 static int io_err_map(struct dm_target
*ti
, struct bio
*bio
,
156 union map_info
*map_context
)
161 static struct target_type error_target
= {
163 .version
= {1, 0, 1},
169 int __init
dm_target_init(void)
171 return dm_register_target(&error_target
);
174 void dm_target_exit(void)
176 dm_unregister_target(&error_target
);
179 EXPORT_SYMBOL(dm_register_target
);
180 EXPORT_SYMBOL(dm_unregister_target
);