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 static 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 static 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"); 82