2005-04-17 02:20:36 +04:00
/*
* Copyright ( C ) 2003 Christophe Saout < christophe @ saout . de >
*
* 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 .
*/
ti - > num_discard_requests = 1 ;
2005-04-17 02:20:36 +04:00
return 0 ;
}
/*
* Return zeros only on reads
*/
static int zero_map ( struct dm_target * ti , struct bio * bio ,
union map_info * map_context )
{
switch ( bio_rw ( bio ) ) {
case READ :
zero_fill_bio ( bio ) ;
break ;
case READA :
/* readahead of null bytes only wastes buffer cache */
return - EIO ;
case WRITE :
/* writes get silently dropped */
break ;
}
2007-09-27 14:47:43 +04:00
bio_endio ( bio , 0 ) ;
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 " ,
. version = { 1 , 0 , 0 } ,
. 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 )
MODULE_AUTHOR ( " Christophe Saout <christophe@saout.de> " ) ;
MODULE_DESCRIPTION ( DM_NAME " dummy target returning zeros " ) ;
MODULE_LICENSE ( " GPL " ) ;