0001
0002
0003
0004
0005
0006
0007 #include <linux/device-mapper.h>
0008
0009 #include <linux/module.h>
0010 #include <linux/init.h>
0011 #include <linux/bio.h>
0012
0013 #define DM_MSG_PREFIX "zero"
0014
0015
0016
0017
0018 static int zero_ctr(struct dm_target *ti, unsigned int argc, char **argv)
0019 {
0020 if (argc != 0) {
0021 ti->error = "No arguments required";
0022 return -EINVAL;
0023 }
0024
0025
0026
0027
0028 ti->num_discard_bios = 1;
0029
0030 return 0;
0031 }
0032
0033
0034
0035
0036 static int zero_map(struct dm_target *ti, struct bio *bio)
0037 {
0038 switch (bio_op(bio)) {
0039 case REQ_OP_READ:
0040 if (bio->bi_opf & REQ_RAHEAD) {
0041
0042 return DM_MAPIO_KILL;
0043 }
0044 zero_fill_bio(bio);
0045 break;
0046 case REQ_OP_WRITE:
0047
0048 break;
0049 default:
0050 return DM_MAPIO_KILL;
0051 }
0052
0053 bio_endio(bio);
0054
0055
0056 return DM_MAPIO_SUBMITTED;
0057 }
0058
0059 static struct target_type zero_target = {
0060 .name = "zero",
0061 .version = {1, 1, 0},
0062 .features = DM_TARGET_NOWAIT,
0063 .module = THIS_MODULE,
0064 .ctr = zero_ctr,
0065 .map = zero_map,
0066 };
0067
0068 static int __init dm_zero_init(void)
0069 {
0070 int r = dm_register_target(&zero_target);
0071
0072 if (r < 0)
0073 DMERR("register failed %d", r);
0074
0075 return r;
0076 }
0077
0078 static void __exit dm_zero_exit(void)
0079 {
0080 dm_unregister_target(&zero_target);
0081 }
0082
0083 module_init(dm_zero_init)
0084 module_exit(dm_zero_exit)
0085
0086 MODULE_AUTHOR("Jana Saout <jana@saout.de>");
0087 MODULE_DESCRIPTION(DM_NAME " dummy target returning zeros");
0088 MODULE_LICENSE("GPL");