LCOV - code coverage report
Current view: top level - drivers/md - dm-zero.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 4 21 19.0 %
Date: 2022-04-01 14:35:51 Functions: 1 4 25.0 %
Branches: 1 9 11.1 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Copyright (C) 2003 Jana Saout <jana@saout.de>
       3                 :            :  *
       4                 :            :  * This file is released under the GPL.
       5                 :            :  */
       6                 :            : 
       7                 :            : #include <linux/device-mapper.h>
       8                 :            : 
       9                 :            : #include <linux/module.h>
      10                 :            : #include <linux/init.h>
      11                 :            : #include <linux/bio.h>
      12                 :            : 
      13                 :            : #define DM_MSG_PREFIX "zero"
      14                 :            : 
      15                 :            : /*
      16                 :            :  * Construct a dummy mapping that only returns zeros
      17                 :            :  */
      18                 :          0 : static int zero_ctr(struct dm_target *ti, unsigned int argc, char **argv)
      19                 :            : {
      20         [ #  # ]:          0 :         if (argc != 0) {
      21                 :          0 :                 ti->error = "No arguments required";
      22                 :          0 :                 return -EINVAL;
      23                 :            :         }
      24                 :            : 
      25                 :            :         /*
      26                 :            :          * Silently drop discards, avoiding -EOPNOTSUPP.
      27                 :            :          */
      28                 :          0 :         ti->num_discard_bios = 1;
      29                 :            : 
      30                 :          0 :         return 0;
      31                 :            : }
      32                 :            : 
      33                 :            : /*
      34                 :            :  * Return zeros only on reads
      35                 :            :  */
      36                 :          0 : static int zero_map(struct dm_target *ti, struct bio *bio)
      37                 :            : {
      38      [ #  #  # ]:          0 :         switch (bio_op(bio)) {
      39                 :          0 :         case REQ_OP_READ:
      40         [ #  # ]:          0 :                 if (bio->bi_opf & REQ_RAHEAD) {
      41                 :            :                         /* readahead of null bytes only wastes buffer cache */
      42                 :            :                         return DM_MAPIO_KILL;
      43                 :            :                 }
      44                 :          0 :                 zero_fill_bio(bio);
      45                 :            :                 break;
      46                 :            :         case REQ_OP_WRITE:
      47                 :            :                 /* writes get silently dropped */
      48                 :            :                 break;
      49                 :            :         default:
      50                 :            :                 return DM_MAPIO_KILL;
      51                 :            :         }
      52                 :            : 
      53                 :          0 :         bio_endio(bio);
      54                 :            : 
      55                 :            :         /* accepted bio, don't make new request */
      56                 :          0 :         return DM_MAPIO_SUBMITTED;
      57                 :            : }
      58                 :            : 
      59                 :            : static struct target_type zero_target = {
      60                 :            :         .name   = "zero",
      61                 :            :         .version = {1, 1, 0},
      62                 :            :         .module = THIS_MODULE,
      63                 :            :         .ctr    = zero_ctr,
      64                 :            :         .map    = zero_map,
      65                 :            : };
      66                 :            : 
      67                 :         21 : static int __init dm_zero_init(void)
      68                 :            : {
      69                 :         21 :         int r = dm_register_target(&zero_target);
      70                 :            : 
      71         [ -  + ]:         21 :         if (r < 0)
      72                 :          0 :                 DMERR("register failed %d", r);
      73                 :            : 
      74                 :         21 :         return r;
      75                 :            : }
      76                 :            : 
      77                 :          0 : static void __exit dm_zero_exit(void)
      78                 :            : {
      79                 :          0 :         dm_unregister_target(&zero_target);
      80                 :          0 : }
      81                 :            : 
      82                 :            : module_init(dm_zero_init)
      83                 :            : module_exit(dm_zero_exit)
      84                 :            : 
      85                 :            : MODULE_AUTHOR("Jana Saout <jana@saout.de>");
      86                 :            : MODULE_DESCRIPTION(DM_NAME " dummy target returning zeros");
      87                 :            : MODULE_LICENSE("GPL");

Generated by: LCOV version 1.14