Blame view
fs/ext4/ext4_extents.h
8.28 KB
a86c61812 [PATCH] ext3: add... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* * Copyright (c) 2003-2006, Cluster File Systems, Inc, info@clusterfs.com * Written by Alex Tomas <alex@clusterfs.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public Licens * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111- */ |
3dcf54515 ext4: move header... |
18 19 |
#ifndef _EXT4_EXTENTS #define _EXT4_EXTENTS |
a86c61812 [PATCH] ext3: add... |
20 |
|
3dcf54515 ext4: move header... |
21 |
#include "ext4.h" |
a86c61812 [PATCH] ext3: add... |
22 23 |
/* |
bbf2f9fb1 Fix misspellings ... |
24 |
* With AGGRESSIVE_TEST defined, the capacity of index/leaf blocks |
d0d856e8b [PATCH] ext4: cle... |
25 26 27 |
* becomes very small, so index split, in-depth growing and * other hard changes happen much more often. * This is for debug purposes only. |
a86c61812 [PATCH] ext3: add... |
28 |
*/ |
bbf2f9fb1 Fix misspellings ... |
29 |
#define AGGRESSIVE_TEST_ |
a86c61812 [PATCH] ext3: add... |
30 31 |
/* |
d0d856e8b [PATCH] ext4: cle... |
32 33 34 |
* With EXTENTS_STATS defined, the number of blocks and extents * are collected in the truncate path. They'll be shown at * umount time. |
a86c61812 [PATCH] ext3: add... |
35 36 37 38 |
*/ #define EXTENTS_STATS__ /* |
d0d856e8b [PATCH] ext4: cle... |
39 40 |
* If CHECK_BINSEARCH is defined, then the results of the binary search * will also be checked by linear search. |
a86c61812 [PATCH] ext3: add... |
41 42 43 44 |
*/ #define CHECK_BINSEARCH__ /* |
d0d856e8b [PATCH] ext4: cle... |
45 46 |
* If EXT_DEBUG is defined you can use the 'extdebug' mount option * to get lots of info about what's going on. |
a86c61812 [PATCH] ext3: add... |
47 48 49 50 51 52 53 54 55 |
*/ #define EXT_DEBUG__ #ifdef EXT_DEBUG #define ext_debug(a...) printk(a) #else #define ext_debug(a...) #endif /* |
d0d856e8b [PATCH] ext4: cle... |
56 57 |
* If EXT_STATS is defined then stats numbers are collected. * These number will be displayed at umount time. |
a86c61812 [PATCH] ext3: add... |
58 59 60 61 62 |
*/ #define EXT_STATS_ /* |
d0d856e8b [PATCH] ext4: cle... |
63 64 65 |
* ext4_inode has i_block array (60 bytes total). * The first 12 bytes store ext4_extent_header; * the remainder stores an array of ext4_extent. |
a86c61812 [PATCH] ext3: add... |
66 67 68 |
*/ /* |
d0d856e8b [PATCH] ext4: cle... |
69 70 |
* This is the extent on-disk structure. * It's used at the bottom of the tree. |
a86c61812 [PATCH] ext3: add... |
71 72 73 74 75 |
*/ struct ext4_extent { __le32 ee_block; /* first logical block extent covers */ __le16 ee_len; /* number of blocks covered by extent */ __le16 ee_start_hi; /* high 16 bits of physical block */ |
b377611d1 ext4: Convert ext... |
76 |
__le32 ee_start_lo; /* low 32 bits of physical block */ |
a86c61812 [PATCH] ext3: add... |
77 78 79 |
}; /* |
d0d856e8b [PATCH] ext4: cle... |
80 81 |
* This is index on-disk structure. * It's used at all the levels except the bottom. |
a86c61812 [PATCH] ext3: add... |
82 83 84 |
*/ struct ext4_extent_idx { __le32 ei_block; /* index covers logical blocks from 'block' */ |
d8dd0b454 ext4: Convert ext... |
85 |
__le32 ei_leaf_lo; /* pointer to the physical block of the next * |
d0d856e8b [PATCH] ext4: cle... |
86 |
* level. leaf or next index could be there */ |
a86c61812 [PATCH] ext3: add... |
87 88 89 90 91 |
__le16 ei_leaf_hi; /* high 16 bits of physical block */ __u16 ei_unused; }; /* |
d0d856e8b [PATCH] ext4: cle... |
92 |
* Each block (leaves and indexes), even inode-stored has header. |
a86c61812 [PATCH] ext3: add... |
93 94 95 96 97 |
*/ struct ext4_extent_header { __le16 eh_magic; /* probably will support different formats */ __le16 eh_entries; /* number of valid entries */ __le16 eh_max; /* capacity of store in entries */ |
d0d856e8b [PATCH] ext4: cle... |
98 |
__le16 eh_depth; /* has tree real underlying blocks? */ |
a86c61812 [PATCH] ext3: add... |
99 100 101 102 103 104 |
__le32 eh_generation; /* generation of the tree */ }; #define EXT4_EXT_MAGIC cpu_to_le16(0xf30a) /* |
d0d856e8b [PATCH] ext4: cle... |
105 106 107 |
* Array of ext4_ext_path contains path to some extent. * Creation/lookup routines use it for traversal/splitting/etc. * Truncate uses it to simulate recursive walking. |
a86c61812 [PATCH] ext3: add... |
108 109 |
*/ struct ext4_ext_path { |
f65e6fba1 [PATCH] ext4: 48b... |
110 |
ext4_fsblk_t p_block; |
a86c61812 [PATCH] ext3: add... |
111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
__u16 p_depth; struct ext4_extent *p_ext; struct ext4_extent_idx *p_idx; struct ext4_extent_header *p_hdr; struct buffer_head *p_bh; }; /* * structure for external API */ #define EXT4_EXT_CACHE_NO 0 #define EXT4_EXT_CACHE_GAP 1 #define EXT4_EXT_CACHE_EXTENT 2 |
6873fa0de Hook ext4 to the ... |
125 126 127 128 129 130 131 132 133 134 135 136 137 |
/* * to be called by ext4_ext_walk_space() * negative retcode - error * positive retcode - signal for ext4_ext_walk_space(), see below * callback must return valid extent (passed or newly created) */ typedef int (*ext_prepare_callback)(struct inode *, struct ext4_ext_path *, struct ext4_ext_cache *, struct ext4_extent *, void *); #define EXT_CONTINUE 0 #define EXT_BREAK 1 #define EXT_REPEAT 2 |
a86c61812 [PATCH] ext3: add... |
138 139 |
#define EXT_MAX_BLOCK 0xffffffff |
749269fac Change on-disk fo... |
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
/* * EXT_INIT_MAX_LEN is the maximum number of blocks we can have in an * initialized extent. This is 2^15 and not (2^16 - 1), since we use the * MSB of ee_len field in the extent datastructure to signify if this * particular extent is an initialized extent or an uninitialized (i.e. * preallocated). * EXT_UNINIT_MAX_LEN is the maximum number of blocks we can have in an * uninitialized extent. * If ee_len is <= 0x8000, it is an initialized extent. Otherwise, it is an * uninitialized one. In other words, if MSB of ee_len is set, it is an * uninitialized extent with only one special scenario when ee_len = 0x8000. * In this case we can not have an uninitialized extent of zero length and * thus we make it as a special case of initialized extent with 0x8000 length. * This way we get better extent-to-group alignment for initialized extents. * Hence, the maximum number of blocks we can have in an *initialized* * extent is 2^15 (32768) and in an *uninitialized* extent is 2^15-1 (32767). */ #define EXT_INIT_MAX_LEN (1UL << 15) #define EXT_UNINIT_MAX_LEN (EXT_INIT_MAX_LEN - 1) |
471d4011a [PATCH] ext4: uni... |
159 |
|
a86c61812 [PATCH] ext3: add... |
160 161 162 163 164 165 166 167 |
#define EXT_FIRST_EXTENT(__hdr__) \ ((struct ext4_extent *) (((char *) (__hdr__)) + \ sizeof(struct ext4_extent_header))) #define EXT_FIRST_INDEX(__hdr__) \ ((struct ext4_extent_idx *) (((char *) (__hdr__)) + \ sizeof(struct ext4_extent_header))) #define EXT_HAS_FREE_INDEX(__path__) \ |
8c55e2041 EXT4: Fix whitespace |
168 169 |
(le16_to_cpu((__path__)->p_hdr->eh_entries) \ < le16_to_cpu((__path__)->p_hdr->eh_max)) |
a86c61812 [PATCH] ext3: add... |
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
#define EXT_LAST_EXTENT(__hdr__) \ (EXT_FIRST_EXTENT((__hdr__)) + le16_to_cpu((__hdr__)->eh_entries) - 1) #define EXT_LAST_INDEX(__hdr__) \ (EXT_FIRST_INDEX((__hdr__)) + le16_to_cpu((__hdr__)->eh_entries) - 1) #define EXT_MAX_EXTENT(__hdr__) \ (EXT_FIRST_EXTENT((__hdr__)) + le16_to_cpu((__hdr__)->eh_max) - 1) #define EXT_MAX_INDEX(__hdr__) \ (EXT_FIRST_INDEX((__hdr__)) + le16_to_cpu((__hdr__)->eh_max) - 1) static inline struct ext4_extent_header *ext_inode_hdr(struct inode *inode) { return (struct ext4_extent_header *) EXT4_I(inode)->i_data; } static inline struct ext4_extent_header *ext_block_hdr(struct buffer_head *bh) { return (struct ext4_extent_header *) bh->b_data; } static inline unsigned short ext_depth(struct inode *inode) { return le16_to_cpu(ext_inode_hdr(inode)->eh_depth); } static inline void ext4_ext_tree_changed(struct inode *inode) { EXT4_I(inode)->i_ext_generation++; } static inline void ext4_ext_invalidate_cache(struct inode *inode) { EXT4_I(inode)->i_cached_extent.ec_type = EXT4_EXT_CACHE_NO; } |
a2df2a634 fallocate support... |
204 205 |
static inline void ext4_ext_mark_uninitialized(struct ext4_extent *ext) { |
749269fac Change on-disk fo... |
206 207 208 |
/* We can not have an uninitialized extent of zero length! */ BUG_ON((le16_to_cpu(ext->ee_len) & ~EXT_INIT_MAX_LEN) == 0); ext->ee_len |= cpu_to_le16(EXT_INIT_MAX_LEN); |
a2df2a634 fallocate support... |
209 210 211 212 |
} static inline int ext4_ext_is_uninitialized(struct ext4_extent *ext) { |
749269fac Change on-disk fo... |
213 214 |
/* Extent with ee_len of 0x8000 is treated as an initialized extent */ return (le16_to_cpu(ext->ee_len) > EXT_INIT_MAX_LEN); |
a2df2a634 fallocate support... |
215 216 217 218 |
} static inline int ext4_ext_get_actual_len(struct ext4_extent *ext) { |
749269fac Change on-disk fo... |
219 220 221 |
return (le16_to_cpu(ext->ee_len) <= EXT_INIT_MAX_LEN ? le16_to_cpu(ext->ee_len) : (le16_to_cpu(ext->ee_len) - EXT_INIT_MAX_LEN)); |
a2df2a634 fallocate support... |
222 |
} |
d2a176379 ext4: delayed all... |
223 |
extern int ext4_ext_calc_metadata_amount(struct inode *inode, int blocks); |
c14c6fd5c ext4: Add EXT4_IO... |
224 225 |
extern ext4_fsblk_t idx_pblock(struct ext4_extent_idx *); extern void ext4_ext_store_pblock(struct ext4_extent *, ext4_fsblk_t); |
a86c61812 [PATCH] ext3: add... |
226 |
extern int ext4_extent_tree_init(handle_t *, struct inode *); |
ee12b6306 ext4: journal cre... |
227 228 229 |
extern int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int num, struct ext4_ext_path *path); |
56055d3ae write support for... |
230 231 232 |
extern int ext4_ext_try_to_merge(struct inode *inode, struct ext4_ext_path *path, struct ext4_extent *); |
25d14f983 ext4: Extent over... |
233 |
extern unsigned int ext4_ext_check_overlap(struct inode *, struct ext4_extent *, struct ext4_ext_path *); |
a86c61812 [PATCH] ext3: add... |
234 |
extern int ext4_ext_insert_extent(handle_t *, struct inode *, struct ext4_ext_path *, struct ext4_extent *); |
6873fa0de Hook ext4 to the ... |
235 236 |
extern int ext4_ext_walk_space(struct inode *, ext4_lblk_t, ext4_lblk_t, ext_prepare_callback, void *); |
725d26d3f ext4: Introduce e... |
237 238 |
extern struct ext4_ext_path *ext4_ext_find_extent(struct inode *, ext4_lblk_t, struct ext4_ext_path *); |
1988b51e4 ext4: Add new fun... |
239 240 241 242 |
extern int ext4_ext_search_left(struct inode *, struct ext4_ext_path *, ext4_lblk_t *, ext4_fsblk_t *); extern int ext4_ext_search_right(struct inode *, struct ext4_ext_path *, ext4_lblk_t *, ext4_fsblk_t *); |
b35905c16 ext4: Fix memory ... |
243 |
extern void ext4_ext_drop_refs(struct ext4_ext_path *); |
3dcf54515 ext4: move header... |
244 |
#endif /* _EXT4_EXTENTS */ |
a86c61812 [PATCH] ext3: add... |
245 |