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