diff options
Diffstat (limited to 'fs/ext4/mballoc.h')
-rw-r--r-- | fs/ext4/mballoc.h | 71 |
1 files changed, 8 insertions, 63 deletions
diff --git a/fs/ext4/mballoc.h b/fs/ext4/mballoc.h index b5dff1fff1e5..10a2921baf14 100644 --- a/fs/ext4/mballoc.h +++ b/fs/ext4/mballoc.h | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/version.h> | 20 | #include <linux/version.h> |
21 | #include <linux/blkdev.h> | 21 | #include <linux/blkdev.h> |
22 | #include <linux/marker.h> | 22 | #include <linux/marker.h> |
23 | #include <linux/mutex.h> | ||
23 | #include "ext4_jbd2.h" | 24 | #include "ext4_jbd2.h" |
24 | #include "ext4.h" | 25 | #include "ext4.h" |
25 | #include "group.h" | 26 | #include "group.h" |
@@ -98,9 +99,6 @@ | |||
98 | */ | 99 | */ |
99 | #define MB_DEFAULT_GROUP_PREALLOC 512 | 100 | #define MB_DEFAULT_GROUP_PREALLOC 512 |
100 | 101 | ||
101 | static struct kmem_cache *ext4_pspace_cachep; | ||
102 | static struct kmem_cache *ext4_ac_cachep; | ||
103 | static struct kmem_cache *ext4_free_ext_cachep; | ||
104 | 102 | ||
105 | struct ext4_free_data { | 103 | struct ext4_free_data { |
106 | /* this links the free block information from group_info */ | 104 | /* this links the free block information from group_info */ |
@@ -120,26 +118,6 @@ struct ext4_free_data { | |||
120 | tid_t t_tid; | 118 | tid_t t_tid; |
121 | }; | 119 | }; |
122 | 120 | ||
123 | struct ext4_group_info { | ||
124 | unsigned long bb_state; | ||
125 | struct rb_root bb_free_root; | ||
126 | unsigned short bb_first_free; | ||
127 | unsigned short bb_free; | ||
128 | unsigned short bb_fragments; | ||
129 | struct list_head bb_prealloc_list; | ||
130 | #ifdef DOUBLE_CHECK | ||
131 | void *bb_bitmap; | ||
132 | #endif | ||
133 | unsigned short bb_counters[]; | ||
134 | }; | ||
135 | |||
136 | #define EXT4_GROUP_INFO_NEED_INIT_BIT 0 | ||
137 | #define EXT4_GROUP_INFO_LOCKED_BIT 1 | ||
138 | |||
139 | #define EXT4_MB_GRP_NEED_INIT(grp) \ | ||
140 | (test_bit(EXT4_GROUP_INFO_NEED_INIT_BIT, &((grp)->bb_state))) | ||
141 | |||
142 | |||
143 | struct ext4_prealloc_space { | 121 | struct ext4_prealloc_space { |
144 | struct list_head pa_inode_list; | 122 | struct list_head pa_inode_list; |
145 | struct list_head pa_group_list; | 123 | struct list_head pa_group_list; |
@@ -217,6 +195,11 @@ struct ext4_allocation_context { | |||
217 | __u8 ac_op; /* operation, for history only */ | 195 | __u8 ac_op; /* operation, for history only */ |
218 | struct page *ac_bitmap_page; | 196 | struct page *ac_bitmap_page; |
219 | struct page *ac_buddy_page; | 197 | struct page *ac_buddy_page; |
198 | /* | ||
199 | * pointer to the held semaphore upon successful | ||
200 | * block allocation | ||
201 | */ | ||
202 | struct rw_semaphore *alloc_semp; | ||
220 | struct ext4_prealloc_space *ac_pa; | 203 | struct ext4_prealloc_space *ac_pa; |
221 | struct ext4_locality_group *ac_lg; | 204 | struct ext4_locality_group *ac_lg; |
222 | }; | 205 | }; |
@@ -250,6 +233,7 @@ struct ext4_buddy { | |||
250 | struct super_block *bd_sb; | 233 | struct super_block *bd_sb; |
251 | __u16 bd_blkbits; | 234 | __u16 bd_blkbits; |
252 | ext4_group_t bd_group; | 235 | ext4_group_t bd_group; |
236 | struct rw_semaphore *alloc_semp; | ||
253 | }; | 237 | }; |
254 | #define EXT4_MB_BITMAP(e4b) ((e4b)->bd_bitmap) | 238 | #define EXT4_MB_BITMAP(e4b) ((e4b)->bd_bitmap) |
255 | #define EXT4_MB_BUDDY(e4b) ((e4b)->bd_buddy) | 239 | #define EXT4_MB_BUDDY(e4b) ((e4b)->bd_buddy) |
@@ -259,51 +243,12 @@ static inline void ext4_mb_store_history(struct ext4_allocation_context *ac) | |||
259 | { | 243 | { |
260 | return; | 244 | return; |
261 | } | 245 | } |
262 | #else | ||
263 | static void ext4_mb_store_history(struct ext4_allocation_context *ac); | ||
264 | #endif | 246 | #endif |
265 | 247 | ||
266 | #define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1) | 248 | #define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1) |
267 | 249 | ||
268 | struct buffer_head *read_block_bitmap(struct super_block *, ext4_group_t); | 250 | struct buffer_head *read_block_bitmap(struct super_block *, ext4_group_t); |
269 | 251 | static inline ext4_fsblk_t ext4_grp_offs_to_block(struct super_block *sb, | |
270 | static void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap, | ||
271 | ext4_group_t group); | ||
272 | static void ext4_mb_return_to_preallocation(struct inode *inode, | ||
273 | struct ext4_buddy *e4b, sector_t block, | ||
274 | int count); | ||
275 | static void ext4_mb_put_pa(struct ext4_allocation_context *, | ||
276 | struct super_block *, struct ext4_prealloc_space *pa); | ||
277 | static int ext4_mb_init_per_dev_proc(struct super_block *sb); | ||
278 | static int ext4_mb_destroy_per_dev_proc(struct super_block *sb); | ||
279 | static void release_blocks_on_commit(journal_t *journal, transaction_t *txn); | ||
280 | |||
281 | |||
282 | static inline void ext4_lock_group(struct super_block *sb, ext4_group_t group) | ||
283 | { | ||
284 | struct ext4_group_info *grinfo = ext4_get_group_info(sb, group); | ||
285 | |||
286 | bit_spin_lock(EXT4_GROUP_INFO_LOCKED_BIT, &(grinfo->bb_state)); | ||
287 | } | ||
288 | |||
289 | static inline void ext4_unlock_group(struct super_block *sb, | ||
290 | ext4_group_t group) | ||
291 | { | ||
292 | struct ext4_group_info *grinfo = ext4_get_group_info(sb, group); | ||
293 | |||
294 | bit_spin_unlock(EXT4_GROUP_INFO_LOCKED_BIT, &(grinfo->bb_state)); | ||
295 | } | ||
296 | |||
297 | static inline int ext4_is_group_locked(struct super_block *sb, | ||
298 | ext4_group_t group) | ||
299 | { | ||
300 | struct ext4_group_info *grinfo = ext4_get_group_info(sb, group); | ||
301 | |||
302 | return bit_spin_is_locked(EXT4_GROUP_INFO_LOCKED_BIT, | ||
303 | &(grinfo->bb_state)); | ||
304 | } | ||
305 | |||
306 | static ext4_fsblk_t ext4_grp_offs_to_block(struct super_block *sb, | ||
307 | struct ext4_free_extent *fex) | 252 | struct ext4_free_extent *fex) |
308 | { | 253 | { |
309 | ext4_fsblk_t block; | 254 | ext4_fsblk_t block; |