Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright (C) 2003 Jana Saout <jana@saout.de>
0003  *
0004  * This file is released under the GPL.
0005  */
0006 
0007 #include <linux/device-mapper.h>
0008 
0009 #include <linux/module.h>
0010 #include <linux/init.h>
0011 #include <linux/bio.h>
0012 
0013 #define DM_MSG_PREFIX "zero"
0014 
0015 /*
0016  * Construct a dummy mapping that only returns zeros
0017  */
0018 static int zero_ctr(struct dm_target *ti, unsigned int argc, char **argv)
0019 {
0020     if (argc != 0) {
0021         ti->error = "No arguments required";
0022         return -EINVAL;
0023     }
0024 
0025     /*
0026      * Silently drop discards, avoiding -EOPNOTSUPP.
0027      */
0028     ti->num_discard_bios = 1;
0029 
0030     return 0;
0031 }
0032 
0033 /*
0034  * Return zeros only on reads
0035  */
0036 static int zero_map(struct dm_target *ti, struct bio *bio)
0037 {
0038     switch (bio_op(bio)) {
0039     case REQ_OP_READ:
0040         if (bio->bi_opf & REQ_RAHEAD) {
0041             /* readahead of null bytes only wastes buffer cache */
0042             return DM_MAPIO_KILL;
0043         }
0044         zero_fill_bio(bio);
0045         break;
0046     case REQ_OP_WRITE:
0047         /* writes get silently dropped */
0048         break;
0049     default:
0050         return DM_MAPIO_KILL;
0051     }
0052 
0053     bio_endio(bio);
0054 
0055     /* accepted bio, don't make new request */
0056     return DM_MAPIO_SUBMITTED;
0057 }
0058 
0059 static struct target_type zero_target = {
0060     .name   = "zero",
0061     .version = {1, 1, 0},
0062     .features = DM_TARGET_NOWAIT,
0063     .module = THIS_MODULE,
0064     .ctr    = zero_ctr,
0065     .map    = zero_map,
0066 };
0067 
0068 static int __init dm_zero_init(void)
0069 {
0070     int r = dm_register_target(&zero_target);
0071 
0072     if (r < 0)
0073         DMERR("register failed %d", r);
0074 
0075     return r;
0076 }
0077 
0078 static void __exit dm_zero_exit(void)
0079 {
0080     dm_unregister_target(&zero_target);
0081 }
0082 
0083 module_init(dm_zero_init)
0084 module_exit(dm_zero_exit)
0085 
0086 MODULE_AUTHOR("Jana Saout <jana@saout.de>");
0087 MODULE_DESCRIPTION(DM_NAME " dummy target returning zeros");
0088 MODULE_LICENSE("GPL");