Branch data Line data Source code
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 : 0 : static int zero_ctr(struct dm_target *ti, unsigned int argc, char **argv) 19 : : { 20 [ # # ]: 0 : if (argc != 0) { 21 : 0 : ti->error = "No arguments required"; 22 : 0 : return -EINVAL; 23 : : } 24 : : 25 : : /* 26 : : * Silently drop discards, avoiding -EOPNOTSUPP. 27 : : */ 28 : 0 : ti->num_discard_bios = 1; 29 : : 30 : 0 : return 0; 31 : : } 32 : : 33 : : /* 34 : : * Return zeros only on reads 35 : : */ 36 : 0 : static int zero_map(struct dm_target *ti, struct bio *bio) 37 : : { 38 [ # # # ]: 0 : switch (bio_op(bio)) { 39 : 0 : case REQ_OP_READ: 40 [ # # ]: 0 : if (bio->bi_opf & REQ_RAHEAD) { 41 : : /* readahead of null bytes only wastes buffer cache */ 42 : : return DM_MAPIO_KILL; 43 : : } 44 : 0 : 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 : 0 : bio_endio(bio); 54 : : 55 : : /* accepted bio, don't make new request */ 56 : 0 : return DM_MAPIO_SUBMITTED; 57 : : } 58 : : 59 : : static struct target_type zero_target = { 60 : : .name = "zero", 61 : : .version = {1, 1, 0}, 62 : : .module = THIS_MODULE, 63 : : .ctr = zero_ctr, 64 : : .map = zero_map, 65 : : }; 66 : : 67 : 30 : static int __init dm_zero_init(void) 68 : : { 69 : 30 : int r = dm_register_target(&zero_target); 70 : : 71 [ - + ]: 30 : if (r < 0) 72 : 0 : DMERR("register failed %d", r); 73 : : 74 : 30 : return r; 75 : : } 76 : : 77 : 0 : static void __exit dm_zero_exit(void) 78 : : { 79 : 0 : dm_unregister_target(&zero_target); 80 : 0 : } 81 : : 82 : : module_init(dm_zero_init) 83 : : module_exit(dm_zero_exit) 84 : : 85 : : MODULE_AUTHOR("Jana Saout <jana@saout.de>"); 86 : : MODULE_DESCRIPTION(DM_NAME " dummy target returning zeros"); 87 : : MODULE_LICENSE("GPL");