2005-04-16 15:20:36 -07:00
/*
2014-06-24 14:27:04 -04:00
* Copyright ( C ) 2003 Jana Saout < jana @ saout . de >
2005-04-16 15:20:36 -07:00
*
* This file is released under the GPL .
*/
2008-10-21 17:44:59 +01:00
# include <linux/device-mapper.h>
2005-04-16 15:20:36 -07:00
# include <linux/module.h>
# include <linux/init.h>
# include <linux/bio.h>
2006-06-26 00:27:35 -07:00
# define DM_MSG_PREFIX "zero"
2005-04-16 15:20:36 -07: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 00:27:35 -07:00
ti - > error = " No arguments required " ;
2005-04-16 15:20:36 -07:00
return - EINVAL ;
}
2010-08-12 04:14:12 +01:00
/*
* Silently drop discards , avoiding - EOPNOTSUPP .
*/
2013-03-01 22:45:47 +00:00
ti - > num_discard_bios = 1 ;
2010-08-12 04:14:12 +01:00
2005-04-16 15:20:36 -07:00
return 0 ;
}
/*
* Return zeros only on reads
*/
2012-12-21 20:23:41 +00:00
static int zero_map ( struct dm_target * ti , struct bio * bio )
2005-04-16 15:20:36 -07:00
{
2016-07-19 11:28:41 +02:00
switch ( bio_op ( bio ) ) {
case REQ_OP_READ :
2016-08-05 15:35:16 -06:00
if ( bio - > bi_opf & REQ_RAHEAD ) {
2016-07-19 11:28:41 +02:00
/* readahead of null bytes only wastes buffer cache */
2017-06-03 09:38:02 +02:00
return DM_MAPIO_KILL ;
2016-07-19 11:28:41 +02:00
}
2005-04-16 15:20:36 -07:00
zero_fill_bio ( bio ) ;
break ;
2016-07-19 11:28:41 +02:00
case REQ_OP_WRITE :
2005-04-16 15:20:36 -07:00
/* writes get silently dropped */
break ;
2016-07-19 11:28:41 +02:00
default :
2017-06-03 09:38:02 +02:00
return DM_MAPIO_KILL ;
2005-04-16 15:20:36 -07:00
}
2015-07-20 15:29:37 +02:00
bio_endio ( bio ) ;
2005-04-16 15:20:36 -07:00
/* accepted bio, don't make new request */
2006-12-08 02:41:06 -08:00
return DM_MAPIO_SUBMITTED ;
2005-04-16 15:20:36 -07:00
}
static struct target_type zero_target = {
. name = " zero " ,
2012-12-21 20:23:41 +00:00
. version = { 1 , 1 , 0 } ,
2020-11-13 10:05:51 +08:00
. features = DM_TARGET_NOWAIT ,
2005-04-16 15:20:36 -07:00
. module = THIS_MODULE ,
. ctr = zero_ctr ,
. map = zero_map ,
} ;
2005-05-05 16:16:09 -07:00
static int __init dm_zero_init ( void )
2005-04-16 15:20:36 -07:00
{
int r = dm_register_target ( & zero_target ) ;
if ( r < 0 )
2006-06-26 00:27:35 -07:00
DMERR ( " register failed %d " , r ) ;
2005-04-16 15:20:36 -07:00
return r ;
}
2005-05-05 16:16:09 -07:00
static void __exit dm_zero_exit ( void )
2005-04-16 15:20:36 -07:00
{
2009-01-06 03:04:58 +00:00
dm_unregister_target ( & zero_target ) ;
2005-04-16 15:20:36 -07:00
}
module_init ( dm_zero_init )
module_exit ( dm_zero_exit )
2014-06-24 14:27:04 -04:00
MODULE_AUTHOR ( " Jana Saout <jana@saout.de> " ) ;
2005-04-16 15:20:36 -07:00
MODULE_DESCRIPTION ( DM_NAME " dummy target returning zeros " ) ;
MODULE_LICENSE ( " GPL " ) ;