1 /* 2 * Copyright (C) 2003 Jana Saout <jana@saout.de> 3 * 4 * This file is released under the GPL. 5 */ 6 7 #include <linux/device-mapper.h> 8 9 #include <linux/module.h> 10 #include <linux/init.h> 11 #include <linux/bio.h> 12 13 #define DM_MSG_PREFIX "zero" 14 15 /* 16 * Construct a dummy mapping that only returns zeros 17 */ 18 static int zero_ctr(struct dm_target *ti, unsigned int argc, char **argv) 19 { 20 if (argc != 0) { 21 ti->error = "No arguments required"; 22 return -EINVAL; 23 } 24 25 /* 26 * Silently drop discards, avoiding -EOPNOTSUPP. 27 */ 28 ti->num_discard_bios = 1; 29 30 return 0; 31 } 32 33 /* 34 * Return zeros only on reads 35 */ 36 static int zero_map(struct dm_target *ti, struct bio *bio) 37 { 38 switch (bio_op(bio)) { 39 case REQ_OP_READ: 40 if (bio->bi_opf & REQ_RAHEAD) { 41 /* readahead of null bytes only wastes buffer cache */ 42 return DM_MAPIO_KILL; 43 } 44 zero_fill_bio(bio); 45 break; 46 case REQ_OP_WRITE: 47 /* writes get silently dropped */ 48 break; 49 default: 50 return DM_MAPIO_KILL; 51 } 52 53 bio_endio(bio); 54 55 /* accepted bio, don't make new request */ 56 return DM_MAPIO_SUBMITTED; 57 } 58 59 static struct target_type zero_target = { 60 .name = "zero", 61 .version = {1, 1, 0}, 62 .features = DM_TARGET_NOWAIT, 63 .module = THIS_MODULE, 64 .ctr = zero_ctr, 65 .map = zero_map, 66 }; 67 68 static int __init dm_zero_init(void) 69 { 70 int r = dm_register_target(&zero_target); 71 72 if (r < 0) 73 DMERR("register failed %d", r); 74 75 return r; 76 } 77 78 static void __exit dm_zero_exit(void) 79 { 80 dm_unregister_target(&zero_target); 81 } 82 83 module_init(dm_zero_init) 84 module_exit(dm_zero_exit) 85 86 MODULE_AUTHOR("Jana Saout <jana@saout.de>"); 87 MODULE_DESCRIPTION(DM_NAME " dummy target returning zeros"); 88 MODULE_LICENSE("GPL"); 89