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