forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
1.6 KiB
88 lines
1.6 KiB
/* |
|
* Copyright (C) 2003 Jana Saout <[email protected]> |
|
* |
|
* This file is released under the GPL. |
|
*/ |
|
|
|
#include <linux/device-mapper.h> |
|
|
|
#include <linux/module.h> |
|
#include <linux/init.h> |
|
#include <linux/bio.h> |
|
|
|
#define DM_MSG_PREFIX "zero" |
|
|
|
/* |
|
* Construct a dummy mapping that only returns zeros |
|
*/ |
|
static int zero_ctr(struct dm_target *ti, unsigned int argc, char **argv) |
|
{ |
|
if (argc != 0) { |
|
ti->error = "No arguments required"; |
|
return -EINVAL; |
|
} |
|
|
|
/* |
|
* Silently drop discards, avoiding -EOPNOTSUPP. |
|
*/ |
|
ti->num_discard_bios = 1; |
|
|
|
return 0; |
|
} |
|
|
|
/* |
|
* Return zeros only on reads |
|
*/ |
|
static int zero_map(struct dm_target *ti, struct bio *bio) |
|
{ |
|
switch (bio_op(bio)) { |
|
case REQ_OP_READ: |
|
if (bio->bi_opf & REQ_RAHEAD) { |
|
/* readahead of null bytes only wastes buffer cache */ |
|
return DM_MAPIO_KILL; |
|
} |
|
zero_fill_bio(bio); |
|
break; |
|
case REQ_OP_WRITE: |
|
/* writes get silently dropped */ |
|
break; |
|
default: |
|
return DM_MAPIO_KILL; |
|
} |
|
|
|
bio_endio(bio); |
|
|
|
/* accepted bio, don't make new request */ |
|
return DM_MAPIO_SUBMITTED; |
|
} |
|
|
|
static struct target_type zero_target = { |
|
.name = "zero", |
|
.version = {1, 1, 0}, |
|
.features = DM_TARGET_NOWAIT, |
|
.module = THIS_MODULE, |
|
.ctr = zero_ctr, |
|
.map = zero_map, |
|
}; |
|
|
|
static int __init dm_zero_init(void) |
|
{ |
|
int r = dm_register_target(&zero_target); |
|
|
|
if (r < 0) |
|
DMERR("register failed %d", r); |
|
|
|
return r; |
|
} |
|
|
|
static void __exit dm_zero_exit(void) |
|
{ |
|
dm_unregister_target(&zero_target); |
|
} |
|
|
|
module_init(dm_zero_init) |
|
module_exit(dm_zero_exit) |
|
|
|
MODULE_AUTHOR("Jana Saout <[email protected]>"); |
|
MODULE_DESCRIPTION(DM_NAME " dummy target returning zeros"); |
|
MODULE_LICENSE("GPL");
|
|
|