82 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Copyright (C) 2003 Jana Saout <jana@saout.de>4 *5 * This file is released under the GPL.6 */7 8#include <linux/device-mapper.h>9 10#include <linux/module.h>11#include <linux/init.h>12#include <linux/bio.h>13 14#define DM_MSG_PREFIX "zero"15 16/*17 * Construct a dummy mapping that only returns zeros18 */19static int zero_ctr(struct dm_target *ti, unsigned int argc, char **argv)20{21 if (argc != 0) {22 ti->error = "No arguments required";23 return -EINVAL;24 }25 26 /*27 * Silently drop discards, avoiding -EOPNOTSUPP.28 */29 ti->num_discard_bios = 1;30 ti->discards_supported = true;31 32 return 0;33}34 35/*36 * Return zeros only on reads37 */38static int zero_map(struct dm_target *ti, struct bio *bio)39{40 switch (bio_op(bio)) {41 case REQ_OP_READ:42 if (bio->bi_opf & REQ_RAHEAD) {43 /* readahead of null bytes only wastes buffer cache */44 return DM_MAPIO_KILL;45 }46 zero_fill_bio(bio);47 break;48 case REQ_OP_WRITE:49 case REQ_OP_DISCARD:50 /* writes get silently dropped */51 break;52 default:53 return DM_MAPIO_KILL;54 }55 56 bio_endio(bio);57 58 /* accepted bio, don't make new request */59 return DM_MAPIO_SUBMITTED;60}61 62static void zero_io_hints(struct dm_target *ti, struct queue_limits *limits)63{64 limits->max_hw_discard_sectors = UINT_MAX;65 limits->discard_granularity = 512;66}67 68static struct target_type zero_target = {69 .name = "zero",70 .version = {1, 2, 0},71 .features = DM_TARGET_NOWAIT,72 .module = THIS_MODULE,73 .ctr = zero_ctr,74 .map = zero_map,75 .io_hints = zero_io_hints,76};77module_dm(zero);78 79MODULE_AUTHOR("Jana Saout <jana@saout.de>");80MODULE_DESCRIPTION(DM_NAME " dummy target returning zeros");81MODULE_LICENSE("GPL");82