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 : 4904789 : return (es->es_pblk & ES_WRITTEN) != 0;
88 : : }
89 : :
90 : : static inline int ext4_es_is_unwritten(struct extent_status *es)
91 : : {
92 : 4747422 : return (es->es_pblk & ES_UNWRITTEN) != 0;
93 : : }
94 : :
95 : : static inline int ext4_es_is_delayed(struct extent_status *es)
96 : : {
97 : 4752928 : return (es->es_pblk & ES_DELAYED) != 0;
98 : : }
99 : :
100 : : static inline int ext4_es_is_hole(struct extent_status *es)
101 : : {
102 : 3677621 : return (es->es_pblk & ES_HOLE) != 0;
103 : : }
104 : :
105 : : static inline unsigned int ext4_es_status(struct extent_status *es)
106 : : {
107 : 11977406 : return es->es_pblk >> ES_SHIFT;
108 : : }
109 : :
110 : : static inline ext4_fsblk_t ext4_es_pblock(struct extent_status *es)
111 : : {
112 : 1953396 : 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 : 2092699 : block = (pb & ~ES_MASK) | (es->es_pblk & ES_MASK);
121 : 3564 : es->es_pblk = block;
122 : : }
123 : :
124 : : static inline void ext4_es_store_status(struct extent_status *es,
125 : : unsigned int status)
126 : : {
127 : 2145797 : es->es_pblk = (((ext4_fsblk_t)
128 : 4291594 : (status & EXTENT_STATUS_FLAGS) << ES_SHIFT) |
129 : 2145797 : (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 */
|