brintos

brintos / linux-shallow public Read only

0
0
Text · 1.6 KiB · 9a0bb62 Raw
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