linux/drivers/md/dm-zero.c
<<
>>
Prefs
   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        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, 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        dm_unregister_target(&zero_target);
  73}
  74
  75module_init(dm_zero_init)
  76module_exit(dm_zero_exit)
  77
  78MODULE_AUTHOR("Christophe Saout <christophe@saout.de>");
  79MODULE_DESCRIPTION(DM_NAME " dummy target returning zeros");
  80MODULE_LICENSE("GPL");
  81