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        /*
  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");
  86