at v2.6.13-rc2 81 lines 1.5 kB view raw
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 */ 16static 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 */ 29static 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 50static 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 58static 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 68static 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 76module_init(dm_zero_init) 77module_exit(dm_zero_exit) 78 79MODULE_AUTHOR("Christophe Saout <christophe@saout.de>"); 80MODULE_DESCRIPTION(DM_NAME " dummy target returning zeros"); 81MODULE_LICENSE("GPL");