Commit | Line | Data |
---|---|---|
3bd94003 | 1 | // SPDX-License-Identifier: GPL-2.0-only |
1da177e4 | 2 | /* |
bf14299f | 3 | * Copyright (C) 2003 Jana Saout <jana@saout.de> |
1da177e4 LT |
4 | * |
5 | * This file is released under the GPL. | |
6 | */ | |
7 | ||
586e80e6 | 8 | #include <linux/device-mapper.h> |
1da177e4 LT |
9 | |
10 | #include <linux/module.h> | |
11 | #include <linux/init.h> | |
12 | #include <linux/bio.h> | |
13 | ||
72d94861 AK |
14 | #define DM_MSG_PREFIX "zero" |
15 | ||
1da177e4 LT |
16 | /* |
17 | * Construct a dummy mapping that only returns zeros | |
18 | */ | |
19 | static int zero_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |
20 | { | |
21 | if (argc != 0) { | |
72d94861 | 22 | ti->error = "No arguments required"; |
1da177e4 LT |
23 | return -EINVAL; |
24 | } | |
25 | ||
f8facb61 MS |
26 | /* |
27 | * Silently drop discards, avoiding -EOPNOTSUPP. | |
28 | */ | |
55a62eef | 29 | ti->num_discard_bios = 1; |
f8facb61 | 30 | |
1da177e4 LT |
31 | return 0; |
32 | } | |
33 | ||
34 | /* | |
35 | * Return zeros only on reads | |
36 | */ | |
7de3ee57 | 37 | static int zero_map(struct dm_target *ti, struct bio *bio) |
1da177e4 | 38 | { |
70246286 CH |
39 | switch (bio_op(bio)) { |
40 | case REQ_OP_READ: | |
1eff9d32 | 41 | if (bio->bi_opf & REQ_RAHEAD) { |
70246286 | 42 | /* readahead of null bytes only wastes buffer cache */ |
846785e6 | 43 | return DM_MAPIO_KILL; |
70246286 | 44 | } |
1da177e4 LT |
45 | zero_fill_bio(bio); |
46 | break; | |
70246286 | 47 | case REQ_OP_WRITE: |
1da177e4 LT |
48 | /* writes get silently dropped */ |
49 | break; | |
70246286 | 50 | default: |
846785e6 | 51 | return DM_MAPIO_KILL; |
1da177e4 LT |
52 | } |
53 | ||
4246a0b6 | 54 | bio_endio(bio); |
1da177e4 LT |
55 | |
56 | /* accepted bio, don't make new request */ | |
d2a7ad29 | 57 | return DM_MAPIO_SUBMITTED; |
1da177e4 LT |
58 | } |
59 | ||
60 | static struct target_type zero_target = { | |
61 | .name = "zero", | |
7de3ee57 | 62 | .version = {1, 1, 0}, |
410fe220 | 63 | .features = DM_TARGET_NOWAIT, |
1da177e4 LT |
64 | .module = THIS_MODULE, |
65 | .ctr = zero_ctr, | |
66 | .map = zero_map, | |
67 | }; | |
68 | ||
5e198d94 | 69 | static int __init dm_zero_init(void) |
1da177e4 LT |
70 | { |
71 | int r = dm_register_target(&zero_target); | |
72 | ||
73 | if (r < 0) | |
72d94861 | 74 | DMERR("register failed %d", r); |
1da177e4 LT |
75 | |
76 | return r; | |
77 | } | |
78 | ||
5e198d94 | 79 | static void __exit dm_zero_exit(void) |
1da177e4 | 80 | { |
10d3bd09 | 81 | dm_unregister_target(&zero_target); |
1da177e4 LT |
82 | } |
83 | ||
84 | module_init(dm_zero_init) | |
85 | module_exit(dm_zero_exit) | |
86 | ||
bf14299f | 87 | MODULE_AUTHOR("Jana Saout <jana@saout.de>"); |
1da177e4 LT |
88 | MODULE_DESCRIPTION(DM_NAME " dummy target returning zeros"); |
89 | MODULE_LICENSE("GPL"); |