diff options
Diffstat (limited to 'drivers/md/dm-zero.c')
-rw-r--r-- | drivers/md/dm-zero.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/drivers/md/dm-zero.c b/drivers/md/dm-zero.c new file mode 100644 index 000000000000..7febc2cac73d --- /dev/null +++ b/drivers/md/dm-zero.c | |||
@@ -0,0 +1,81 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2003 Christophe Saout <christophe@saout.de> | ||
3 | * | ||
4 | * This file is released under the GPL. | ||
5 | */ | ||
6 | |||
7 | #include "dm.h" | ||
8 | |||
9 | #include <linux/module.h> | ||
10 | #include <linux/init.h> | ||
11 | #include <linux/bio.h> | ||
12 | |||
13 | /* | ||
14 | * Construct a dummy mapping that only returns zeros | ||
15 | */ | ||
16 | static int zero_ctr(struct dm_target *ti, unsigned int argc, char **argv) | ||
17 | { | ||
18 | if (argc != 0) { | ||
19 | ti->error = "dm-zero: No arguments required"; | ||
20 | return -EINVAL; | ||
21 | } | ||
22 | |||
23 | return 0; | ||
24 | } | ||
25 | |||
26 | /* | ||
27 | * Return zeros only on reads | ||
28 | */ | ||
29 | static int zero_map(struct dm_target *ti, struct bio *bio, | ||
30 | union map_info *map_context) | ||
31 | { | ||
32 | switch(bio_rw(bio)) { | ||
33 | case READ: | ||
34 | zero_fill_bio(bio); | ||
35 | break; | ||
36 | case READA: | ||
37 | /* readahead of null bytes only wastes buffer cache */ | ||
38 | return -EIO; | ||
39 | case WRITE: | ||
40 | /* writes get silently dropped */ | ||
41 | break; | ||
42 | } | ||
43 | |||
44 | bio_endio(bio, bio->bi_size, 0); | ||
45 | |||
46 | /* accepted bio, don't make new request */ | ||
47 | return 0; | ||
48 | } | ||
49 | |||
50 | static struct target_type zero_target = { | ||
51 | .name = "zero", | ||
52 | .version = {1, 0, 0}, | ||
53 | .module = THIS_MODULE, | ||
54 | .ctr = zero_ctr, | ||
55 | .map = zero_map, | ||
56 | }; | ||
57 | |||
58 | int __init dm_zero_init(void) | ||
59 | { | ||
60 | int r = dm_register_target(&zero_target); | ||
61 | |||
62 | if (r < 0) | ||
63 | DMERR("zero: register failed %d", r); | ||
64 | |||
65 | return r; | ||
66 | } | ||
67 | |||
68 | void __exit dm_zero_exit(void) | ||
69 | { | ||
70 | int r = dm_unregister_target(&zero_target); | ||
71 | |||
72 | if (r < 0) | ||
73 | DMERR("zero: unregister failed %d", r); | ||
74 | } | ||
75 | |||
76 | module_init(dm_zero_init) | ||
77 | module_exit(dm_zero_exit) | ||
78 | |||
79 | MODULE_AUTHOR("Christophe Saout <christophe@saout.de>"); | ||
80 | MODULE_DESCRIPTION(DM_NAME " dummy target returning zeros"); | ||
81 | MODULE_LICENSE("GPL"); | ||