3f69d097c6e7f0c785aafb88d19e0b3278a80286
[deliverable/linux.git] / fs / ext4 / extents_status.h
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 #define EXTENT_STATUS_WRITTEN 0x80000000 /* written extent */
24 #define EXTENT_STATUS_UNWRITTEN 0x40000000 /* unwritten extent */
25 #define EXTENT_STATUS_DELAYED 0x20000000 /* delayed extent */
26 #define EXTENT_STATUS_HOLE 0x10000000 /* hole */
27
28 #define EXTENT_STATUS_FLAGS (EXTENT_STATUS_WRITTEN | \
29 EXTENT_STATUS_UNWRITTEN | \
30 EXTENT_STATUS_DELAYED | \
31 EXTENT_STATUS_HOLE)
32
33 struct extent_status {
34 struct rb_node rb_node;
35 ext4_lblk_t es_lblk; /* first logical block extent covers */
36 ext4_lblk_t es_len; /* length of extent in block */
37 ext4_fsblk_t es_pblk; /* first physical block */
38 };
39
40 struct ext4_es_tree {
41 struct rb_root root;
42 struct extent_status *cache_es; /* recently accessed extent */
43 };
44
45 extern int __init ext4_init_es(void);
46 extern void ext4_exit_es(void);
47 extern void ext4_es_init_tree(struct ext4_es_tree *tree);
48
49 extern int ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk,
50 ext4_lblk_t len, ext4_fsblk_t pblk,
51 unsigned long long status);
52 extern int ext4_es_remove_extent(struct inode *inode, ext4_lblk_t lblk,
53 ext4_lblk_t len);
54 extern void ext4_es_find_delayed_extent(struct inode *inode, ext4_lblk_t lblk,
55 struct extent_status *es);
56
57 static inline int ext4_es_is_written(struct extent_status *es)
58 {
59 return (es->es_pblk & EXTENT_STATUS_WRITTEN);
60 }
61
62 static inline int ext4_es_is_unwritten(struct extent_status *es)
63 {
64 return (es->es_pblk & EXTENT_STATUS_UNWRITTEN);
65 }
66
67 static inline int ext4_es_is_delayed(struct extent_status *es)
68 {
69 return (es->es_pblk & EXTENT_STATUS_DELAYED);
70 }
71
72 static inline int ext4_es_is_hole(struct extent_status *es)
73 {
74 return (es->es_pblk & EXTENT_STATUS_HOLE);
75 }
76
77 static inline ext4_fsblk_t ext4_es_status(struct extent_status *es)
78 {
79 return (es->es_pblk & EXTENT_STATUS_FLAGS);
80 }
81
82 static inline ext4_fsblk_t ext4_es_pblock(struct extent_status *es)
83 {
84 return (es->es_pblk & ~EXTENT_STATUS_FLAGS);
85 }
86
87 static inline void ext4_es_store_pblock(struct extent_status *es,
88 ext4_fsblk_t pb)
89 {
90 ext4_fsblk_t block;
91
92 block = (pb & ~EXTENT_STATUS_FLAGS) |
93 (es->es_pblk & EXTENT_STATUS_FLAGS);
94 es->es_pblk = block;
95 }
96
97 static inline void ext4_es_store_status(struct extent_status *es,
98 unsigned long long status)
99 {
100 ext4_fsblk_t block;
101
102 block = (status & EXTENT_STATUS_FLAGS) |
103 (es->es_pblk & ~EXTENT_STATUS_FLAGS);
104 es->es_pblk = block;
105 }
106
107 #endif /* _EXT4_EXTENTS_STATUS_H */
This page took 0.033041 seconds and 4 git commands to generate.