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 ;
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 :
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
}
static struct target_type zero_target = {
. name = " zero " ,
2012-12-22 00:23:41 +04:00
. version = { 1 , 1 , 0 } ,
2005-04-17 02:20:36 +04:00
. module = THIS_MODULE ,
. ctr = zero_ctr ,
. map = zero_map ,
} ;
2005-05-06 03:16:09 +04:00
static int __init dm_zero_init ( void )
2005-04-17 02:20:36 +04:00
{
int r = dm_register_target ( & zero_target ) ;
if ( r < 0 )
2006-06-26 11:27:35 +04:00
DMERR ( " register failed %d " , r ) ;
2005-04-17 02:20:36 +04:00
return r ;
}
2005-05-06 03:16:09 +04:00
static void __exit dm_zero_exit ( void )
2005-04-17 02:20:36 +04:00
{
2009-01-06 06:04:58 +03:00
dm_unregister_target ( & zero_target ) ;
2005-04-17 02:20:36 +04:00
}
module_init ( dm_zero_init )
module_exit ( dm_zero_exit )
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 " ) ;