at v2.6.20-rc2 83 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#define DM_MSG_PREFIX "zero" 14 15/* 16 * Construct a dummy mapping that only returns zeros 17 */ 18static 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 return 0; 26} 27 28/* 29 * Return zeros only on reads 30 */ 31static int zero_map(struct dm_target *ti, struct bio *bio, 32 union map_info *map_context) 33{ 34 switch(bio_rw(bio)) { 35 case READ: 36 zero_fill_bio(bio); 37 break; 38 case READA: 39 /* readahead of null bytes only wastes buffer cache */ 40 return -EIO; 41 case WRITE: 42 /* writes get silently dropped */ 43 break; 44 } 45 46 bio_endio(bio, bio->bi_size, 0); 47 48 /* accepted bio, don't make new request */ 49 return DM_MAPIO_SUBMITTED; 50} 51 52static struct target_type zero_target = { 53 .name = "zero", 54 .version = {1, 0, 0}, 55 .module = THIS_MODULE, 56 .ctr = zero_ctr, 57 .map = zero_map, 58}; 59 60static int __init dm_zero_init(void) 61{ 62 int r = dm_register_target(&zero_target); 63 64 if (r < 0) 65 DMERR("register failed %d", r); 66 67 return r; 68} 69 70static void __exit dm_zero_exit(void) 71{ 72 int r = dm_unregister_target(&zero_target); 73 74 if (r < 0) 75 DMERR("unregister failed %d", r); 76} 77 78module_init(dm_zero_init) 79module_exit(dm_zero_exit) 80 81MODULE_AUTHOR("Christophe Saout <christophe@saout.de>"); 82MODULE_DESCRIPTION(DM_NAME " dummy target returning zeros"); 83MODULE_LICENSE("GPL");