LCOV - code coverage report
Current view: top level - fs/ext4 - extents_status.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 11 11 100.0 %
Date: 2014-02-18 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  *  fs/ext4/extents_status.h
       3                 :            :  *
       4                 :            :  * Written by Yongqiang Yang <xiaoqiangnk@gmail.com>
       5                 :            :  * Modified by
       6                 :            :  *      Allison Henderson <achender@linux.vnet.ibm.com>
       7                 :            :  *      Zheng Liu <wenqing.lz@taobao.com>
       8                 :            :  *
       9                 :            :  */
      10                 :            : 
      11                 :            : #ifndef _EXT4_EXTENTS_STATUS_H
      12                 :            : #define _EXT4_EXTENTS_STATUS_H
      13                 :            : 
      14                 :            : /*
      15                 :            :  * Turn on ES_DEBUG__ to get lots of info about extent status operations.
      16                 :            :  */
      17                 :            : #ifdef ES_DEBUG__
      18                 :            : #define es_debug(fmt, ...)      printk(fmt, ##__VA_ARGS__)
      19                 :            : #else
      20                 :            : #define es_debug(fmt, ...)      no_printk(fmt, ##__VA_ARGS__)
      21                 :            : #endif
      22                 :            : 
      23                 :            : /*
      24                 :            :  * With ES_AGGRESSIVE_TEST defined, the result of es caching will be
      25                 :            :  * checked with old map_block's result.
      26                 :            :  */
      27                 :            : #define ES_AGGRESSIVE_TEST__
      28                 :            : 
      29                 :            : /*
      30                 :            :  * These flags live in the high bits of extent_status.es_pblk
      31                 :            :  */
      32                 :            : #define ES_SHIFT        60
      33                 :            : 
      34                 :            : #define EXTENT_STATUS_WRITTEN   (1 << 3)
      35                 :            : #define EXTENT_STATUS_UNWRITTEN (1 << 2)
      36                 :            : #define EXTENT_STATUS_DELAYED   (1 << 1)
      37                 :            : #define EXTENT_STATUS_HOLE      (1 << 0)
      38                 :            : 
      39                 :            : #define EXTENT_STATUS_FLAGS     (EXTENT_STATUS_WRITTEN | \
      40                 :            :                                  EXTENT_STATUS_UNWRITTEN | \
      41                 :            :                                  EXTENT_STATUS_DELAYED | \
      42                 :            :                                  EXTENT_STATUS_HOLE)
      43                 :            : 
      44                 :            : #define ES_WRITTEN              (1ULL << 63)
      45                 :            : #define ES_UNWRITTEN            (1ULL << 62)
      46                 :            : #define ES_DELAYED              (1ULL << 61)
      47                 :            : #define ES_HOLE                 (1ULL << 60)
      48                 :            : 
      49                 :            : #define ES_MASK                 (ES_WRITTEN | ES_UNWRITTEN | \
      50                 :            :                                  ES_DELAYED | ES_HOLE)
      51                 :            : 
      52                 :            : struct ext4_sb_info;
      53                 :            : struct ext4_extent;
      54                 :            : 
      55                 :            : struct extent_status {
      56                 :            :         struct rb_node rb_node;
      57                 :            :         ext4_lblk_t es_lblk;    /* first logical block extent covers */
      58                 :            :         ext4_lblk_t es_len;     /* length of extent in block */
      59                 :            :         ext4_fsblk_t es_pblk;   /* first physical block */
      60                 :            : };
      61                 :            : 
      62                 :            : struct ext4_es_tree {
      63                 :            :         struct rb_root root;
      64                 :            :         struct extent_status *cache_es; /* recently accessed extent */
      65                 :            : };
      66                 :            : 
      67                 :            : extern int __init ext4_init_es(void);
      68                 :            : extern void ext4_exit_es(void);
      69                 :            : extern void ext4_es_init_tree(struct ext4_es_tree *tree);
      70                 :            : 
      71                 :            : extern int ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk,
      72                 :            :                                  ext4_lblk_t len, ext4_fsblk_t pblk,
      73                 :            :                                  unsigned int status);
      74                 :            : extern void ext4_es_cache_extent(struct inode *inode, ext4_lblk_t lblk,
      75                 :            :                                  ext4_lblk_t len, ext4_fsblk_t pblk,
      76                 :            :                                  unsigned int status);
      77                 :            : extern int ext4_es_remove_extent(struct inode *inode, ext4_lblk_t lblk,
      78                 :            :                                  ext4_lblk_t len);
      79                 :            : extern void ext4_es_find_delayed_extent_range(struct inode *inode,
      80                 :            :                                         ext4_lblk_t lblk, ext4_lblk_t end,
      81                 :            :                                         struct extent_status *es);
      82                 :            : extern int ext4_es_lookup_extent(struct inode *inode, ext4_lblk_t lblk,
      83                 :            :                                  struct extent_status *es);
      84                 :            : 
      85                 :            : static inline int ext4_es_is_written(struct extent_status *es)
      86                 :            : {
      87                 :    5390462 :         return (es->es_pblk & ES_WRITTEN) != 0;
      88                 :            : }
      89                 :            : 
      90                 :            : static inline int ext4_es_is_unwritten(struct extent_status *es)
      91                 :            : {
      92                 :    4842960 :         return (es->es_pblk & ES_UNWRITTEN) != 0;
      93                 :            : }
      94                 :            : 
      95                 :            : static inline int ext4_es_is_delayed(struct extent_status *es)
      96                 :            : {
      97                 :    4752059 :         return (es->es_pblk & ES_DELAYED) != 0;
      98                 :            : }
      99                 :            : 
     100                 :            : static inline int ext4_es_is_hole(struct extent_status *es)
     101                 :            : {
     102                 :    3732371 :         return (es->es_pblk & ES_HOLE) != 0;
     103                 :            : }
     104                 :            : 
     105                 :            : static inline unsigned int ext4_es_status(struct extent_status *es)
     106                 :            : {
     107                 :   11986640 :         return es->es_pblk >> ES_SHIFT;
     108                 :            : }
     109                 :            : 
     110                 :            : static inline ext4_fsblk_t ext4_es_pblock(struct extent_status *es)
     111                 :            : {
     112                 :    2362584 :         return es->es_pblk & ~ES_MASK;
     113                 :            : }
     114                 :            : 
     115                 :            : static inline void ext4_es_store_pblock(struct extent_status *es,
     116                 :            :                                         ext4_fsblk_t pb)
     117                 :            : {
     118                 :            :         ext4_fsblk_t block;
     119                 :            : 
     120                 :    2115093 :         block = (pb & ~ES_MASK) | (es->es_pblk & ES_MASK);
     121                 :       3562 :         es->es_pblk = block;
     122                 :            : }
     123                 :            : 
     124                 :            : static inline void ext4_es_store_status(struct extent_status *es,
     125                 :            :                                         unsigned int status)
     126                 :            : {
     127                 :    2168705 :         es->es_pblk = (((ext4_fsblk_t)
     128                 :    4337410 :                         (status & EXTENT_STATUS_FLAGS) << ES_SHIFT) |
     129                 :    2168705 :                        (es->es_pblk & ~ES_MASK));
     130                 :            : }
     131                 :            : 
     132                 :            : extern void ext4_es_register_shrinker(struct ext4_sb_info *sbi);
     133                 :            : extern void ext4_es_unregister_shrinker(struct ext4_sb_info *sbi);
     134                 :            : extern void ext4_es_lru_add(struct inode *inode);
     135                 :            : extern void ext4_es_lru_del(struct inode *inode);
     136                 :            : 
     137                 :            : #endif /* _EXT4_EXTENTS_STATUS_H */

Generated by: LCOV version 1.9