2023-01-25 23:00:44 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2005-04-17 02:20:36 +04:00
/*
2014-06-24 22:27:04 +04:00
* Copyright ( C ) 2003 Jana Saout < jana @ saout . de >
2005-04-17 02:20:36 +04:00
*
* This file is released under the GPL .
*/
2008-10-21 20:44:59 +04:00
# include <linux/device-mapper.h>
2005-04-17 02:20:36 +04:00
# include <linux/module.h>
# include <linux/init.h>
# include <linux/bio.h>
2006-06-26 11:27:35 +04:00
# define DM_MSG_PREFIX "zero"
2005-04-17 02:20:36 +04:00
/*
* Construct a dummy mapping that only returns zeros
*/
static int zero_ctr ( struct dm_target * ti , unsigned int argc , char * * argv )
{
if ( argc ! = 0 ) {
2006-06-26 11:27:35 +04:00
ti - > error = " No arguments required " ;
2005-04-17 02:20:36 +04:00
return - EINVAL ;
}
2010-08-12 07:14:12 +04:00
/*
* Silently drop discards , avoiding - EOPNOTSUPP .
*/
2013-03-02 02:45:47 +04:00
ti - > num_discard_bios = 1 ;
2023-04-04 18:19:33 +03:00
ti - > discards_supported = true ;
2010-08-12 07:14:12 +04:00
2005-04-17 02:20:36 +04:00
return 0 ;
}
/*
* Return zeros only on reads
*/
2012-12-22 00:23:41 +04:00
static int zero_map ( struct dm_target * ti , struct bio * bio )
2005-04-17 02:20:36 +04:00
{
2016-07-19 12:28:41 +03:00
switch ( bio_op ( bio ) ) {
case REQ_OP_READ :
2016-08-06 00:35:16 +03:00
if ( bio - > bi_opf & REQ_RAHEAD ) {
2016-07-19 12:28:41 +03:00
/* readahead of null bytes only wastes buffer cache */
2017-06-03 10:38:02 +03:00
return DM_MAPIO_KILL ;
2016-07-19 12:28:41 +03:00
}
2005-04-17 02:20:36 +04:00
zero_fill_bio ( bio ) ;
break ;
2016-07-19 12:28:41 +03:00
case REQ_OP_WRITE :
2023-04-04 18:19:33 +03:00
case REQ_OP_DISCARD :
2005-04-17 02:20:36 +04:00
/* writes get silently dropped */
break ;
2016-07-19 12:28:41 +03:00
default :
2017-06-03 10:38:02 +03:00
return DM_MAPIO_KILL ;
2005-04-17 02:20:36 +04:00
}
2015-07-20 16:29:37 +03:00
bio_endio ( bio ) ;
2005-04-17 02:20:36 +04:00
/* accepted bio, don't make new request */
2006-12-08 13:41:06 +03:00
return DM_MAPIO_SUBMITTED ;
2005-04-17 02:20:36 +04:00
}
2023-04-04 18:19:33 +03:00
static void zero_io_hints ( struct dm_target * ti , struct queue_limits * limits )
{
limits - > max_discard_sectors = UINT_MAX ;
limits - > max_hw_discard_sectors = UINT_MAX ;
limits - > discard_granularity = 512 ;
}
2005-04-17 02:20:36 +04:00
static struct target_type zero_target = {
. name = " zero " ,
2023-04-04 18:19:33 +03:00
. version = { 1 , 2 , 0 } ,
2020-11-13 05:05:51 +03:00
. features = DM_TARGET_NOWAIT ,
2005-04-17 02:20:36 +04:00
. module = THIS_MODULE ,
. ctr = zero_ctr ,
. map = zero_map ,
2023-04-04 18:19:33 +03:00
. io_hints = zero_io_hints ,
2005-04-17 02:20:36 +04:00
} ;
2023-04-09 19:43:37 +03:00
module_dm ( zero ) ;
2005-04-17 02:20:36 +04:00
2014-06-24 22:27:04 +04:00
MODULE_AUTHOR ( " Jana Saout <jana@saout.de> " ) ;
2005-04-17 02:20:36 +04:00
MODULE_DESCRIPTION ( DM_NAME " dummy target returning zeros " ) ;
MODULE_LICENSE ( " GPL " ) ;