xref: /openbmc/linux/fs/reiserfs/bitmap.c (revision f15cbe6f)
1 /*
2  * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README
3  */
4 /* Reiserfs block (de)allocator, bitmap-based. */
5 
6 #include <linux/time.h>
7 #include <linux/reiserfs_fs.h>
8 #include <linux/errno.h>
9 #include <linux/buffer_head.h>
10 #include <linux/kernel.h>
11 #include <linux/pagemap.h>
12 #include <linux/vmalloc.h>
13 #include <linux/reiserfs_fs_sb.h>
14 #include <linux/reiserfs_fs_i.h>
15 #include <linux/quotaops.h>
16 
17 #define PREALLOCATION_SIZE 9
18 
19 /* different reiserfs block allocator options */
20 
21 #define SB_ALLOC_OPTS(s) (REISERFS_SB(s)->s_alloc_options.bits)
22 
23 #define  _ALLOC_concentrating_formatted_nodes 0
24 #define  _ALLOC_displacing_large_files 1
25 #define  _ALLOC_displacing_new_packing_localities 2
26 #define  _ALLOC_old_hashed_relocation 3
27 #define  _ALLOC_new_hashed_relocation 4
28 #define  _ALLOC_skip_busy 5
29 #define  _ALLOC_displace_based_on_dirid 6
30 #define  _ALLOC_hashed_formatted_nodes 7
31 #define  _ALLOC_old_way 8
32 #define  _ALLOC_hundredth_slices 9
33 #define  _ALLOC_dirid_groups 10
34 #define  _ALLOC_oid_groups 11
35 #define  _ALLOC_packing_groups 12
36 
37 #define  concentrating_formatted_nodes(s)	test_bit(_ALLOC_concentrating_formatted_nodes, &SB_ALLOC_OPTS(s))
38 #define  displacing_large_files(s)		test_bit(_ALLOC_displacing_large_files, &SB_ALLOC_OPTS(s))
39 #define  displacing_new_packing_localities(s)	test_bit(_ALLOC_displacing_new_packing_localities, &SB_ALLOC_OPTS(s))
40 
41 #define SET_OPTION(optname) \
42    do { \
43         reiserfs_warning(s, "reiserfs: option \"%s\" is set", #optname); \
44         set_bit(_ALLOC_ ## optname , &SB_ALLOC_OPTS(s)); \
45     } while(0)
46 #define TEST_OPTION(optname, s) \
47     test_bit(_ALLOC_ ## optname , &SB_ALLOC_OPTS(s))
48 
49 static inline void get_bit_address(struct super_block *s,
50 				   b_blocknr_t block,
51 				   unsigned int *bmap_nr,
52 				   unsigned int *offset)
53 {
54 	/* It is in the bitmap block number equal to the block
55 	 * number divided by the number of bits in a block. */
56 	*bmap_nr = block >> (s->s_blocksize_bits + 3);
57 	/* Within that bitmap block it is located at bit offset *offset. */
58 	*offset = block & ((s->s_blocksize << 3) - 1);
59 }
60 
61 int is_reusable(struct super_block *s, b_blocknr_t block, int bit_value)
62 {
63 	unsigned int bmap, offset;
64 	unsigned int bmap_count = reiserfs_bmap_count(s);
65 
66 	if (block == 0 || block >= SB_BLOCK_COUNT(s)) {
67 		reiserfs_warning(s,
68 				 "vs-4010: is_reusable: block number is out of range %lu (%u)",
69 				 block, SB_BLOCK_COUNT(s));
70 		return 0;
71 	}
72 
73 	get_bit_address(s, block, &bmap, &offset);
74 
75 	/* Old format filesystem? Unlikely, but the bitmaps are all up front so
76 	 * we need to account for it. */
77 	if (unlikely(test_bit(REISERFS_OLD_FORMAT,
78 			      &(REISERFS_SB(s)->s_properties)))) {
79 		b_blocknr_t bmap1 = REISERFS_SB(s)->s_sbh->b_blocknr + 1;
80 		if (block >= bmap1 &&
81 		    block <= bmap1 + bmap_count) {
82 			reiserfs_warning(s, "vs: 4019: is_reusable: "
83 					 "bitmap block %lu(%u) can't be freed or reused",
84 					 block, bmap_count);
85 			return 0;
86 		}
87 	} else {
88 		if (offset == 0) {
89 			reiserfs_warning(s, "vs: 4020: is_reusable: "
90 					 "bitmap block %lu(%u) can't be freed or reused",
91 					 block, bmap_count);
92 			return 0;
93 		}
94 	}
95 
96 	if (bmap >= bmap_count) {
97 		reiserfs_warning(s,
98 				 "vs-4030: is_reusable: there is no so many bitmap blocks: "
99 				 "block=%lu, bitmap_nr=%u", block, bmap);
100 		return 0;
101 	}
102 
103 	if (bit_value == 0 && block == SB_ROOT_BLOCK(s)) {
104 		reiserfs_warning(s,
105 				 "vs-4050: is_reusable: this is root block (%u), "
106 				 "it must be busy", SB_ROOT_BLOCK(s));
107 		return 0;
108 	}
109 
110 	return 1;
111 }
112 
113 /* searches in journal structures for a given block number (bmap, off). If block
114    is found in reiserfs journal it suggests next free block candidate to test. */
115 static inline int is_block_in_journal(struct super_block *s, unsigned int bmap,
116 				      int off, int *next)
117 {
118 	b_blocknr_t tmp;
119 
120 	if (reiserfs_in_journal(s, bmap, off, 1, &tmp)) {
121 		if (tmp) {	/* hint supplied */
122 			*next = tmp;
123 			PROC_INFO_INC(s, scan_bitmap.in_journal_hint);
124 		} else {
125 			(*next) = off + 1;	/* inc offset to avoid looping. */
126 			PROC_INFO_INC(s, scan_bitmap.in_journal_nohint);
127 		}
128 		PROC_INFO_INC(s, scan_bitmap.retry);
129 		return 1;
130 	}
131 	return 0;
132 }
133 
134 /* it searches for a window of zero bits with given minimum and maximum lengths in one bitmap
135  * block; */
136 static int scan_bitmap_block(struct reiserfs_transaction_handle *th,
137 			     unsigned int bmap_n, int *beg, int boundary,
138 			     int min, int max, int unfm)
139 {
140 	struct super_block *s = th->t_super;
141 	struct reiserfs_bitmap_info *bi = &SB_AP_BITMAP(s)[bmap_n];
142 	struct buffer_head *bh;
143 	int end, next;
144 	int org = *beg;
145 
146 	BUG_ON(!th->t_trans_id);
147 
148 	RFALSE(bmap_n >= reiserfs_bmap_count(s), "Bitmap %u is out of "
149 	       "range (0..%u)", bmap_n, reiserfs_bmap_count(s) - 1);
150 	PROC_INFO_INC(s, scan_bitmap.bmap);
151 /* this is unclear and lacks comments, explain how journal bitmaps
152    work here for the reader.  Convey a sense of the design here. What
153    is a window? */
154 /* - I mean `a window of zero bits' as in description of this function - Zam. */
155 
156 	if (!bi) {
157 		reiserfs_warning(s, "NULL bitmap info pointer for bitmap %d",
158 				 bmap_n);
159 		return 0;
160 	}
161 
162 	bh = reiserfs_read_bitmap_block(s, bmap_n);
163 	if (bh == NULL)
164 		return 0;
165 
166 	while (1) {
167 	      cont:
168 		if (bi->free_count < min) {
169 			brelse(bh);
170 			return 0;	// No free blocks in this bitmap
171 		}
172 
173 		/* search for a first zero bit -- beggining of a window */
174 		*beg = reiserfs_find_next_zero_le_bit
175 		    ((unsigned long *)(bh->b_data), boundary, *beg);
176 
177 		if (*beg + min > boundary) {	/* search for a zero bit fails or the rest of bitmap block
178 						 * cannot contain a zero window of minimum size */
179 			brelse(bh);
180 			return 0;
181 		}
182 
183 		if (unfm && is_block_in_journal(s, bmap_n, *beg, beg))
184 			continue;
185 		/* first zero bit found; we check next bits */
186 		for (end = *beg + 1;; end++) {
187 			if (end >= *beg + max || end >= boundary
188 			    || reiserfs_test_le_bit(end, bh->b_data)) {
189 				next = end;
190 				break;
191 			}
192 			/* finding the other end of zero bit window requires looking into journal structures (in
193 			 * case of searching for free blocks for unformatted nodes) */
194 			if (unfm && is_block_in_journal(s, bmap_n, end, &next))
195 				break;
196 		}
197 
198 		/* now (*beg) points to beginning of zero bits window,
199 		 * (end) points to one bit after the window end */
200 		if (end - *beg >= min) {	/* it seems we have found window of proper size */
201 			int i;
202 			reiserfs_prepare_for_journal(s, bh, 1);
203 			/* try to set all blocks used checking are they still free */
204 			for (i = *beg; i < end; i++) {
205 				/* It seems that we should not check in journal again. */
206 				if (reiserfs_test_and_set_le_bit
207 				    (i, bh->b_data)) {
208 					/* bit was set by another process
209 					 * while we slept in prepare_for_journal() */
210 					PROC_INFO_INC(s, scan_bitmap.stolen);
211 					if (i >= *beg + min) {	/* we can continue with smaller set of allocated blocks,
212 								 * if length of this set is more or equal to `min' */
213 						end = i;
214 						break;
215 					}
216 					/* otherwise we clear all bit were set ... */
217 					while (--i >= *beg)
218 						reiserfs_test_and_clear_le_bit
219 						    (i, bh->b_data);
220 					reiserfs_restore_prepared_buffer(s, bh);
221 					*beg = org;
222 					/* ... and search again in current block from beginning */
223 					goto cont;
224 				}
225 			}
226 			bi->free_count -= (end - *beg);
227 			journal_mark_dirty(th, s, bh);
228 			brelse(bh);
229 
230 			/* free block count calculation */
231 			reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s),
232 						     1);
233 			PUT_SB_FREE_BLOCKS(s, SB_FREE_BLOCKS(s) - (end - *beg));
234 			journal_mark_dirty(th, s, SB_BUFFER_WITH_SB(s));
235 
236 			return end - (*beg);
237 		} else {
238 			*beg = next;
239 		}
240 	}
241 }
242 
243 static int bmap_hash_id(struct super_block *s, u32 id)
244 {
245 	char *hash_in = NULL;
246 	unsigned long hash;
247 	unsigned bm;
248 
249 	if (id <= 2) {
250 		bm = 1;
251 	} else {
252 		hash_in = (char *)(&id);
253 		hash = keyed_hash(hash_in, 4);
254 		bm = hash % reiserfs_bmap_count(s);
255 		if (!bm)
256 			bm = 1;
257 	}
258 	/* this can only be true when SB_BMAP_NR = 1 */
259 	if (bm >= reiserfs_bmap_count(s))
260 		bm = 0;
261 	return bm;
262 }
263 
264 /*
265  * hashes the id and then returns > 0 if the block group for the
266  * corresponding hash is full
267  */
268 static inline int block_group_used(struct super_block *s, u32 id)
269 {
270 	int bm = bmap_hash_id(s, id);
271 	struct reiserfs_bitmap_info *info = &SB_AP_BITMAP(s)[bm];
272 
273 	/* If we don't have cached information on this bitmap block, we're
274 	 * going to have to load it later anyway. Loading it here allows us
275 	 * to make a better decision. This favors long-term performance gain
276 	 * with a better on-disk layout vs. a short term gain of skipping the
277 	 * read and potentially having a bad placement. */
278 	if (info->free_count == UINT_MAX) {
279 		struct buffer_head *bh = reiserfs_read_bitmap_block(s, bm);
280 		brelse(bh);
281 	}
282 
283 	if (info->free_count > ((s->s_blocksize << 3) * 60 / 100)) {
284 		return 0;
285 	}
286 	return 1;
287 }
288 
289 /*
290  * the packing is returned in disk byte order
291  */
292 __le32 reiserfs_choose_packing(struct inode * dir)
293 {
294 	__le32 packing;
295 	if (TEST_OPTION(packing_groups, dir->i_sb)) {
296 		u32 parent_dir = le32_to_cpu(INODE_PKEY(dir)->k_dir_id);
297 		/*
298 		 * some versions of reiserfsck expect packing locality 1 to be
299 		 * special
300 		 */
301 		if (parent_dir == 1 || block_group_used(dir->i_sb, parent_dir))
302 			packing = INODE_PKEY(dir)->k_objectid;
303 		else
304 			packing = INODE_PKEY(dir)->k_dir_id;
305 	} else
306 		packing = INODE_PKEY(dir)->k_objectid;
307 	return packing;
308 }
309 
310 /* Tries to find contiguous zero bit window (given size) in given region of
311  * bitmap and place new blocks there. Returns number of allocated blocks. */
312 static int scan_bitmap(struct reiserfs_transaction_handle *th,
313 		       b_blocknr_t * start, b_blocknr_t finish,
314 		       int min, int max, int unfm, sector_t file_block)
315 {
316 	int nr_allocated = 0;
317 	struct super_block *s = th->t_super;
318 	/* find every bm and bmap and bmap_nr in this file, and change them all to bitmap_blocknr
319 	 * - Hans, it is not a block number - Zam. */
320 
321 	unsigned int bm, off;
322 	unsigned int end_bm, end_off;
323 	unsigned int off_max = s->s_blocksize << 3;
324 
325 	BUG_ON(!th->t_trans_id);
326 
327 	PROC_INFO_INC(s, scan_bitmap.call);
328 	if (SB_FREE_BLOCKS(s) <= 0)
329 		return 0;	// No point in looking for more free blocks
330 
331 	get_bit_address(s, *start, &bm, &off);
332 	get_bit_address(s, finish, &end_bm, &end_off);
333 	if (bm > reiserfs_bmap_count(s))
334 		return 0;
335 	if (end_bm > reiserfs_bmap_count(s))
336 		end_bm = reiserfs_bmap_count(s);
337 
338 	/* When the bitmap is more than 10% free, anyone can allocate.
339 	 * When it's less than 10% free, only files that already use the
340 	 * bitmap are allowed. Once we pass 80% full, this restriction
341 	 * is lifted.
342 	 *
343 	 * We do this so that files that grow later still have space close to
344 	 * their original allocation. This improves locality, and presumably
345 	 * performance as a result.
346 	 *
347 	 * This is only an allocation policy and does not make up for getting a
348 	 * bad hint. Decent hinting must be implemented for this to work well.
349 	 */
350 	if (TEST_OPTION(skip_busy, s)
351 	    && SB_FREE_BLOCKS(s) > SB_BLOCK_COUNT(s) / 20) {
352 		for (; bm < end_bm; bm++, off = 0) {
353 			if ((off && (!unfm || (file_block != 0)))
354 			    || SB_AP_BITMAP(s)[bm].free_count >
355 			    (s->s_blocksize << 3) / 10)
356 				nr_allocated =
357 				    scan_bitmap_block(th, bm, &off, off_max,
358 						      min, max, unfm);
359 			if (nr_allocated)
360 				goto ret;
361 		}
362 		/* we know from above that start is a reasonable number */
363 		get_bit_address(s, *start, &bm, &off);
364 	}
365 
366 	for (; bm < end_bm; bm++, off = 0) {
367 		nr_allocated =
368 		    scan_bitmap_block(th, bm, &off, off_max, min, max, unfm);
369 		if (nr_allocated)
370 			goto ret;
371 	}
372 
373 	nr_allocated =
374 	    scan_bitmap_block(th, bm, &off, end_off + 1, min, max, unfm);
375 
376       ret:
377 	*start = bm * off_max + off;
378 	return nr_allocated;
379 
380 }
381 
382 static void _reiserfs_free_block(struct reiserfs_transaction_handle *th,
383 				 struct inode *inode, b_blocknr_t block,
384 				 int for_unformatted)
385 {
386 	struct super_block *s = th->t_super;
387 	struct reiserfs_super_block *rs;
388 	struct buffer_head *sbh, *bmbh;
389 	struct reiserfs_bitmap_info *apbi;
390 	unsigned int nr, offset;
391 
392 	BUG_ON(!th->t_trans_id);
393 
394 	PROC_INFO_INC(s, free_block);
395 
396 	rs = SB_DISK_SUPER_BLOCK(s);
397 	sbh = SB_BUFFER_WITH_SB(s);
398 	apbi = SB_AP_BITMAP(s);
399 
400 	get_bit_address(s, block, &nr, &offset);
401 
402 	if (nr >= reiserfs_bmap_count(s)) {
403 		reiserfs_warning(s, "vs-4075: reiserfs_free_block: "
404 				 "block %lu is out of range on %s "
405 				 "(nr=%u,max=%u)", block,
406 				 reiserfs_bdevname(s), nr,
407 				 reiserfs_bmap_count(s));
408 		return;
409 	}
410 
411 	bmbh = reiserfs_read_bitmap_block(s, nr);
412 	if (!bmbh)
413 		return;
414 
415 	reiserfs_prepare_for_journal(s, bmbh, 1);
416 
417 	/* clear bit for the given block in bit map */
418 	if (!reiserfs_test_and_clear_le_bit(offset, bmbh->b_data)) {
419 		reiserfs_warning(s, "vs-4080: reiserfs_free_block: "
420 				 "free_block (%s:%lu)[dev:blocknr]: bit already cleared",
421 				 reiserfs_bdevname(s), block);
422 	}
423 	apbi[nr].free_count++;
424 	journal_mark_dirty(th, s, bmbh);
425 	brelse(bmbh);
426 
427 	reiserfs_prepare_for_journal(s, sbh, 1);
428 	/* update super block */
429 	set_sb_free_blocks(rs, sb_free_blocks(rs) + 1);
430 
431 	journal_mark_dirty(th, s, sbh);
432 	if (for_unformatted)
433 		DQUOT_FREE_BLOCK_NODIRTY(inode, 1);
434 }
435 
436 void reiserfs_free_block(struct reiserfs_transaction_handle *th,
437 			 struct inode *inode, b_blocknr_t block,
438 			 int for_unformatted)
439 {
440 	struct super_block *s = th->t_super;
441 	BUG_ON(!th->t_trans_id);
442 
443 	RFALSE(!s, "vs-4061: trying to free block on nonexistent device");
444 	if (!is_reusable(s, block, 1))
445 		return;
446 
447 	if (block > sb_block_count(REISERFS_SB(s)->s_rs)) {
448 		reiserfs_panic(th->t_super, "bitmap-4072",
449 			       "Trying to free block outside file system "
450 			       "boundaries (%lu > %lu)",
451 			       block, sb_block_count(REISERFS_SB(s)->s_rs));
452 		return;
453 	}
454 	/* mark it before we clear it, just in case */
455 	journal_mark_freed(th, s, block);
456 	_reiserfs_free_block(th, inode, block, for_unformatted);
457 }
458 
459 /* preallocated blocks don't need to be run through journal_mark_freed */
460 static void reiserfs_free_prealloc_block(struct reiserfs_transaction_handle *th,
461 					 struct inode *inode, b_blocknr_t block)
462 {
463 	BUG_ON(!th->t_trans_id);
464 	RFALSE(!th->t_super,
465 	       "vs-4060: trying to free block on nonexistent device");
466 	if (!is_reusable(th->t_super, block, 1))
467 		return;
468 	_reiserfs_free_block(th, inode, block, 1);
469 }
470 
471 static void __discard_prealloc(struct reiserfs_transaction_handle *th,
472 			       struct reiserfs_inode_info *ei)
473 {
474 	unsigned long save = ei->i_prealloc_block;
475 	int dirty = 0;
476 	struct inode *inode = &ei->vfs_inode;
477 	BUG_ON(!th->t_trans_id);
478 #ifdef CONFIG_REISERFS_CHECK
479 	if (ei->i_prealloc_count < 0)
480 		reiserfs_warning(th->t_super,
481 				 "zam-4001:%s: inode has negative prealloc blocks count.",
482 				 __func__);
483 #endif
484 	while (ei->i_prealloc_count > 0) {
485 		reiserfs_free_prealloc_block(th, inode, ei->i_prealloc_block);
486 		ei->i_prealloc_block++;
487 		ei->i_prealloc_count--;
488 		dirty = 1;
489 	}
490 	if (dirty)
491 		reiserfs_update_sd(th, inode);
492 	ei->i_prealloc_block = save;
493 	list_del_init(&(ei->i_prealloc_list));
494 }
495 
496 /* FIXME: It should be inline function */
497 void reiserfs_discard_prealloc(struct reiserfs_transaction_handle *th,
498 			       struct inode *inode)
499 {
500 	struct reiserfs_inode_info *ei = REISERFS_I(inode);
501 	BUG_ON(!th->t_trans_id);
502 	if (ei->i_prealloc_count)
503 		__discard_prealloc(th, ei);
504 }
505 
506 void reiserfs_discard_all_prealloc(struct reiserfs_transaction_handle *th)
507 {
508 	struct list_head *plist = &SB_JOURNAL(th->t_super)->j_prealloc_list;
509 
510 	BUG_ON(!th->t_trans_id);
511 
512 	while (!list_empty(plist)) {
513 		struct reiserfs_inode_info *ei;
514 		ei = list_entry(plist->next, struct reiserfs_inode_info,
515 				i_prealloc_list);
516 #ifdef CONFIG_REISERFS_CHECK
517 		if (!ei->i_prealloc_count) {
518 			reiserfs_warning(th->t_super,
519 					 "zam-4001:%s: inode is in prealloc list but has no preallocated blocks.",
520 					 __func__);
521 		}
522 #endif
523 		__discard_prealloc(th, ei);
524 	}
525 }
526 
527 void reiserfs_init_alloc_options(struct super_block *s)
528 {
529 	set_bit(_ALLOC_skip_busy, &SB_ALLOC_OPTS(s));
530 	set_bit(_ALLOC_dirid_groups, &SB_ALLOC_OPTS(s));
531 	set_bit(_ALLOC_packing_groups, &SB_ALLOC_OPTS(s));
532 }
533 
534 /* block allocator related options are parsed here */
535 int reiserfs_parse_alloc_options(struct super_block *s, char *options)
536 {
537 	char *this_char, *value;
538 
539 	REISERFS_SB(s)->s_alloc_options.bits = 0;	/* clear default settings */
540 
541 	while ((this_char = strsep(&options, ":")) != NULL) {
542 		if ((value = strchr(this_char, '=')) != NULL)
543 			*value++ = 0;
544 
545 		if (!strcmp(this_char, "concentrating_formatted_nodes")) {
546 			int temp;
547 			SET_OPTION(concentrating_formatted_nodes);
548 			temp = (value
549 				&& *value) ? simple_strtoul(value, &value,
550 							    0) : 10;
551 			if (temp <= 0 || temp > 100) {
552 				REISERFS_SB(s)->s_alloc_options.border = 10;
553 			} else {
554 				REISERFS_SB(s)->s_alloc_options.border =
555 				    100 / temp;
556 			}
557 			continue;
558 		}
559 		if (!strcmp(this_char, "displacing_large_files")) {
560 			SET_OPTION(displacing_large_files);
561 			REISERFS_SB(s)->s_alloc_options.large_file_size =
562 			    (value
563 			     && *value) ? simple_strtoul(value, &value, 0) : 16;
564 			continue;
565 		}
566 		if (!strcmp(this_char, "displacing_new_packing_localities")) {
567 			SET_OPTION(displacing_new_packing_localities);
568 			continue;
569 		};
570 
571 		if (!strcmp(this_char, "old_hashed_relocation")) {
572 			SET_OPTION(old_hashed_relocation);
573 			continue;
574 		}
575 
576 		if (!strcmp(this_char, "new_hashed_relocation")) {
577 			SET_OPTION(new_hashed_relocation);
578 			continue;
579 		}
580 
581 		if (!strcmp(this_char, "dirid_groups")) {
582 			SET_OPTION(dirid_groups);
583 			continue;
584 		}
585 		if (!strcmp(this_char, "oid_groups")) {
586 			SET_OPTION(oid_groups);
587 			continue;
588 		}
589 		if (!strcmp(this_char, "packing_groups")) {
590 			SET_OPTION(packing_groups);
591 			continue;
592 		}
593 		if (!strcmp(this_char, "hashed_formatted_nodes")) {
594 			SET_OPTION(hashed_formatted_nodes);
595 			continue;
596 		}
597 
598 		if (!strcmp(this_char, "skip_busy")) {
599 			SET_OPTION(skip_busy);
600 			continue;
601 		}
602 
603 		if (!strcmp(this_char, "hundredth_slices")) {
604 			SET_OPTION(hundredth_slices);
605 			continue;
606 		}
607 
608 		if (!strcmp(this_char, "old_way")) {
609 			SET_OPTION(old_way);
610 			continue;
611 		}
612 
613 		if (!strcmp(this_char, "displace_based_on_dirid")) {
614 			SET_OPTION(displace_based_on_dirid);
615 			continue;
616 		}
617 
618 		if (!strcmp(this_char, "preallocmin")) {
619 			REISERFS_SB(s)->s_alloc_options.preallocmin =
620 			    (value
621 			     && *value) ? simple_strtoul(value, &value, 0) : 4;
622 			continue;
623 		}
624 
625 		if (!strcmp(this_char, "preallocsize")) {
626 			REISERFS_SB(s)->s_alloc_options.preallocsize =
627 			    (value
628 			     && *value) ? simple_strtoul(value, &value,
629 							 0) :
630 			    PREALLOCATION_SIZE;
631 			continue;
632 		}
633 
634 		reiserfs_warning(s, "zam-4001: %s : unknown option - %s",
635 				 __func__, this_char);
636 		return 1;
637 	}
638 
639 	reiserfs_warning(s, "allocator options = [%08x]\n", SB_ALLOC_OPTS(s));
640 	return 0;
641 }
642 
643 static inline void new_hashed_relocation(reiserfs_blocknr_hint_t * hint)
644 {
645 	char *hash_in;
646 	if (hint->formatted_node) {
647 		hash_in = (char *)&hint->key.k_dir_id;
648 	} else {
649 		if (!hint->inode) {
650 			//hint->search_start = hint->beg;
651 			hash_in = (char *)&hint->key.k_dir_id;
652 		} else
653 		    if (TEST_OPTION(displace_based_on_dirid, hint->th->t_super))
654 			hash_in = (char *)(&INODE_PKEY(hint->inode)->k_dir_id);
655 		else
656 			hash_in =
657 			    (char *)(&INODE_PKEY(hint->inode)->k_objectid);
658 	}
659 
660 	hint->search_start =
661 	    hint->beg + keyed_hash(hash_in, 4) % (hint->end - hint->beg);
662 }
663 
664 /*
665  * Relocation based on dirid, hashing them into a given bitmap block
666  * files. Formatted nodes are unaffected, a separate policy covers them
667  */
668 static void dirid_groups(reiserfs_blocknr_hint_t * hint)
669 {
670 	unsigned long hash;
671 	__u32 dirid = 0;
672 	int bm = 0;
673 	struct super_block *sb = hint->th->t_super;
674 	if (hint->inode)
675 		dirid = le32_to_cpu(INODE_PKEY(hint->inode)->k_dir_id);
676 	else if (hint->formatted_node)
677 		dirid = hint->key.k_dir_id;
678 
679 	if (dirid) {
680 		bm = bmap_hash_id(sb, dirid);
681 		hash = bm * (sb->s_blocksize << 3);
682 		/* give a portion of the block group to metadata */
683 		if (hint->inode)
684 			hash += sb->s_blocksize / 2;
685 		hint->search_start = hash;
686 	}
687 }
688 
689 /*
690  * Relocation based on oid, hashing them into a given bitmap block
691  * files. Formatted nodes are unaffected, a separate policy covers them
692  */
693 static void oid_groups(reiserfs_blocknr_hint_t * hint)
694 {
695 	if (hint->inode) {
696 		unsigned long hash;
697 		__u32 oid;
698 		__u32 dirid;
699 		int bm;
700 
701 		dirid = le32_to_cpu(INODE_PKEY(hint->inode)->k_dir_id);
702 
703 		/* keep the root dir and it's first set of subdirs close to
704 		 * the start of the disk
705 		 */
706 		if (dirid <= 2)
707 			hash = (hint->inode->i_sb->s_blocksize << 3);
708 		else {
709 			oid = le32_to_cpu(INODE_PKEY(hint->inode)->k_objectid);
710 			bm = bmap_hash_id(hint->inode->i_sb, oid);
711 			hash = bm * (hint->inode->i_sb->s_blocksize << 3);
712 		}
713 		hint->search_start = hash;
714 	}
715 }
716 
717 /* returns 1 if it finds an indirect item and gets valid hint info
718  * from it, otherwise 0
719  */
720 static int get_left_neighbor(reiserfs_blocknr_hint_t * hint)
721 {
722 	struct treepath *path;
723 	struct buffer_head *bh;
724 	struct item_head *ih;
725 	int pos_in_item;
726 	__le32 *item;
727 	int ret = 0;
728 
729 	if (!hint->path)	/* reiserfs code can call this function w/o pointer to path
730 				 * structure supplied; then we rely on supplied search_start */
731 		return 0;
732 
733 	path = hint->path;
734 	bh = get_last_bh(path);
735 	RFALSE(!bh, "green-4002: Illegal path specified to get_left_neighbor");
736 	ih = get_ih(path);
737 	pos_in_item = path->pos_in_item;
738 	item = get_item(path);
739 
740 	hint->search_start = bh->b_blocknr;
741 
742 	if (!hint->formatted_node && is_indirect_le_ih(ih)) {
743 		/* for indirect item: go to left and look for the first non-hole entry
744 		   in the indirect item */
745 		if (pos_in_item == I_UNFM_NUM(ih))
746 			pos_in_item--;
747 //          pos_in_item = I_UNFM_NUM (ih) - 1;
748 		while (pos_in_item >= 0) {
749 			int t = get_block_num(item, pos_in_item);
750 			if (t) {
751 				hint->search_start = t;
752 				ret = 1;
753 				break;
754 			}
755 			pos_in_item--;
756 		}
757 	}
758 
759 	/* does result value fit into specified region? */
760 	return ret;
761 }
762 
763 /* should be, if formatted node, then try to put on first part of the device
764    specified as number of percent with mount option device, else try to put
765    on last of device.  This is not to say it is good code to do so,
766    but the effect should be measured.  */
767 static inline void set_border_in_hint(struct super_block *s,
768 				      reiserfs_blocknr_hint_t * hint)
769 {
770 	b_blocknr_t border =
771 	    SB_BLOCK_COUNT(s) / REISERFS_SB(s)->s_alloc_options.border;
772 
773 	if (hint->formatted_node)
774 		hint->end = border - 1;
775 	else
776 		hint->beg = border;
777 }
778 
779 static inline void displace_large_file(reiserfs_blocknr_hint_t * hint)
780 {
781 	if (TEST_OPTION(displace_based_on_dirid, hint->th->t_super))
782 		hint->search_start =
783 		    hint->beg +
784 		    keyed_hash((char *)(&INODE_PKEY(hint->inode)->k_dir_id),
785 			       4) % (hint->end - hint->beg);
786 	else
787 		hint->search_start =
788 		    hint->beg +
789 		    keyed_hash((char *)(&INODE_PKEY(hint->inode)->k_objectid),
790 			       4) % (hint->end - hint->beg);
791 }
792 
793 static inline void hash_formatted_node(reiserfs_blocknr_hint_t * hint)
794 {
795 	char *hash_in;
796 
797 	if (!hint->inode)
798 		hash_in = (char *)&hint->key.k_dir_id;
799 	else if (TEST_OPTION(displace_based_on_dirid, hint->th->t_super))
800 		hash_in = (char *)(&INODE_PKEY(hint->inode)->k_dir_id);
801 	else
802 		hash_in = (char *)(&INODE_PKEY(hint->inode)->k_objectid);
803 
804 	hint->search_start =
805 	    hint->beg + keyed_hash(hash_in, 4) % (hint->end - hint->beg);
806 }
807 
808 static inline int
809 this_blocknr_allocation_would_make_it_a_large_file(reiserfs_blocknr_hint_t *
810 						   hint)
811 {
812 	return hint->block ==
813 	    REISERFS_SB(hint->th->t_super)->s_alloc_options.large_file_size;
814 }
815 
816 #ifdef DISPLACE_NEW_PACKING_LOCALITIES
817 static inline void displace_new_packing_locality(reiserfs_blocknr_hint_t * hint)
818 {
819 	struct in_core_key *key = &hint->key;
820 
821 	hint->th->displace_new_blocks = 0;
822 	hint->search_start =
823 	    hint->beg + keyed_hash((char *)(&key->k_objectid),
824 				   4) % (hint->end - hint->beg);
825 }
826 #endif
827 
828 static inline int old_hashed_relocation(reiserfs_blocknr_hint_t * hint)
829 {
830 	b_blocknr_t border;
831 	u32 hash_in;
832 
833 	if (hint->formatted_node || hint->inode == NULL) {
834 		return 0;
835 	}
836 
837 	hash_in = le32_to_cpu((INODE_PKEY(hint->inode))->k_dir_id);
838 	border =
839 	    hint->beg + (u32) keyed_hash(((char *)(&hash_in)),
840 					 4) % (hint->end - hint->beg - 1);
841 	if (border > hint->search_start)
842 		hint->search_start = border;
843 
844 	return 1;
845 }
846 
847 static inline int old_way(reiserfs_blocknr_hint_t * hint)
848 {
849 	b_blocknr_t border;
850 
851 	if (hint->formatted_node || hint->inode == NULL) {
852 		return 0;
853 	}
854 
855 	border =
856 	    hint->beg +
857 	    le32_to_cpu(INODE_PKEY(hint->inode)->k_dir_id) % (hint->end -
858 							      hint->beg);
859 	if (border > hint->search_start)
860 		hint->search_start = border;
861 
862 	return 1;
863 }
864 
865 static inline void hundredth_slices(reiserfs_blocknr_hint_t * hint)
866 {
867 	struct in_core_key *key = &hint->key;
868 	b_blocknr_t slice_start;
869 
870 	slice_start =
871 	    (keyed_hash((char *)(&key->k_dir_id), 4) % 100) * (hint->end / 100);
872 	if (slice_start > hint->search_start
873 	    || slice_start + (hint->end / 100) <= hint->search_start) {
874 		hint->search_start = slice_start;
875 	}
876 }
877 
878 static void determine_search_start(reiserfs_blocknr_hint_t * hint,
879 				   int amount_needed)
880 {
881 	struct super_block *s = hint->th->t_super;
882 	int unfm_hint;
883 
884 	hint->beg = 0;
885 	hint->end = SB_BLOCK_COUNT(s) - 1;
886 
887 	/* This is former border algorithm. Now with tunable border offset */
888 	if (concentrating_formatted_nodes(s))
889 		set_border_in_hint(s, hint);
890 
891 #ifdef DISPLACE_NEW_PACKING_LOCALITIES
892 	/* whenever we create a new directory, we displace it.  At first we will
893 	   hash for location, later we might look for a moderately empty place for
894 	   it */
895 	if (displacing_new_packing_localities(s)
896 	    && hint->th->displace_new_blocks) {
897 		displace_new_packing_locality(hint);
898 
899 		/* we do not continue determine_search_start,
900 		 * if new packing locality is being displaced */
901 		return;
902 	}
903 #endif
904 
905 	/* all persons should feel encouraged to add more special cases here and
906 	 * test them */
907 
908 	if (displacing_large_files(s) && !hint->formatted_node
909 	    && this_blocknr_allocation_would_make_it_a_large_file(hint)) {
910 		displace_large_file(hint);
911 		return;
912 	}
913 
914 	/* if none of our special cases is relevant, use the left neighbor in the
915 	   tree order of the new node we are allocating for */
916 	if (hint->formatted_node && TEST_OPTION(hashed_formatted_nodes, s)) {
917 		hash_formatted_node(hint);
918 		return;
919 	}
920 
921 	unfm_hint = get_left_neighbor(hint);
922 
923 	/* Mimic old block allocator behaviour, that is if VFS allowed for preallocation,
924 	   new blocks are displaced based on directory ID. Also, if suggested search_start
925 	   is less than last preallocated block, we start searching from it, assuming that
926 	   HDD dataflow is faster in forward direction */
927 	if (TEST_OPTION(old_way, s)) {
928 		if (!hint->formatted_node) {
929 			if (!reiserfs_hashed_relocation(s))
930 				old_way(hint);
931 			else if (!reiserfs_no_unhashed_relocation(s))
932 				old_hashed_relocation(hint);
933 
934 			if (hint->inode
935 			    && hint->search_start <
936 			    REISERFS_I(hint->inode)->i_prealloc_block)
937 				hint->search_start =
938 				    REISERFS_I(hint->inode)->i_prealloc_block;
939 		}
940 		return;
941 	}
942 
943 	/* This is an approach proposed by Hans */
944 	if (TEST_OPTION(hundredth_slices, s)
945 	    && !(displacing_large_files(s) && !hint->formatted_node)) {
946 		hundredth_slices(hint);
947 		return;
948 	}
949 
950 	/* old_hashed_relocation only works on unformatted */
951 	if (!unfm_hint && !hint->formatted_node &&
952 	    TEST_OPTION(old_hashed_relocation, s)) {
953 		old_hashed_relocation(hint);
954 	}
955 	/* new_hashed_relocation works with both formatted/unformatted nodes */
956 	if ((!unfm_hint || hint->formatted_node) &&
957 	    TEST_OPTION(new_hashed_relocation, s)) {
958 		new_hashed_relocation(hint);
959 	}
960 	/* dirid grouping works only on unformatted nodes */
961 	if (!unfm_hint && !hint->formatted_node && TEST_OPTION(dirid_groups, s)) {
962 		dirid_groups(hint);
963 	}
964 #ifdef DISPLACE_NEW_PACKING_LOCALITIES
965 	if (hint->formatted_node && TEST_OPTION(dirid_groups, s)) {
966 		dirid_groups(hint);
967 	}
968 #endif
969 
970 	/* oid grouping works only on unformatted nodes */
971 	if (!unfm_hint && !hint->formatted_node && TEST_OPTION(oid_groups, s)) {
972 		oid_groups(hint);
973 	}
974 	return;
975 }
976 
977 static int determine_prealloc_size(reiserfs_blocknr_hint_t * hint)
978 {
979 	/* make minimum size a mount option and benchmark both ways */
980 	/* we preallocate blocks only for regular files, specific size */
981 	/* benchmark preallocating always and see what happens */
982 
983 	hint->prealloc_size = 0;
984 
985 	if (!hint->formatted_node && hint->preallocate) {
986 		if (S_ISREG(hint->inode->i_mode)
987 		    && hint->inode->i_size >=
988 		    REISERFS_SB(hint->th->t_super)->s_alloc_options.
989 		    preallocmin * hint->inode->i_sb->s_blocksize)
990 			hint->prealloc_size =
991 			    REISERFS_SB(hint->th->t_super)->s_alloc_options.
992 			    preallocsize - 1;
993 	}
994 	return CARRY_ON;
995 }
996 
997 /* XXX I know it could be merged with upper-level function;
998    but may be result function would be too complex. */
999 static inline int allocate_without_wrapping_disk(reiserfs_blocknr_hint_t * hint,
1000 						 b_blocknr_t * new_blocknrs,
1001 						 b_blocknr_t start,
1002 						 b_blocknr_t finish, int min,
1003 						 int amount_needed,
1004 						 int prealloc_size)
1005 {
1006 	int rest = amount_needed;
1007 	int nr_allocated;
1008 
1009 	while (rest > 0 && start <= finish) {
1010 		nr_allocated = scan_bitmap(hint->th, &start, finish, min,
1011 					   rest + prealloc_size,
1012 					   !hint->formatted_node, hint->block);
1013 
1014 		if (nr_allocated == 0)	/* no new blocks allocated, return */
1015 			break;
1016 
1017 		/* fill free_blocknrs array first */
1018 		while (rest > 0 && nr_allocated > 0) {
1019 			*new_blocknrs++ = start++;
1020 			rest--;
1021 			nr_allocated--;
1022 		}
1023 
1024 		/* do we have something to fill prealloc. array also ? */
1025 		if (nr_allocated > 0) {
1026 			/* it means prealloc_size was greater that 0 and we do preallocation */
1027 			list_add(&REISERFS_I(hint->inode)->i_prealloc_list,
1028 				 &SB_JOURNAL(hint->th->t_super)->
1029 				 j_prealloc_list);
1030 			REISERFS_I(hint->inode)->i_prealloc_block = start;
1031 			REISERFS_I(hint->inode)->i_prealloc_count =
1032 			    nr_allocated;
1033 			break;
1034 		}
1035 	}
1036 
1037 	return (amount_needed - rest);
1038 }
1039 
1040 static inline int blocknrs_and_prealloc_arrays_from_search_start
1041     (reiserfs_blocknr_hint_t * hint, b_blocknr_t * new_blocknrs,
1042      int amount_needed) {
1043 	struct super_block *s = hint->th->t_super;
1044 	b_blocknr_t start = hint->search_start;
1045 	b_blocknr_t finish = SB_BLOCK_COUNT(s) - 1;
1046 	int passno = 0;
1047 	int nr_allocated = 0;
1048 
1049 	determine_prealloc_size(hint);
1050 	if (!hint->formatted_node) {
1051 		int quota_ret;
1052 #ifdef REISERQUOTA_DEBUG
1053 		reiserfs_debug(s, REISERFS_DEBUG_CODE,
1054 			       "reiserquota: allocating %d blocks id=%u",
1055 			       amount_needed, hint->inode->i_uid);
1056 #endif
1057 		quota_ret =
1058 		    DQUOT_ALLOC_BLOCK_NODIRTY(hint->inode, amount_needed);
1059 		if (quota_ret)	/* Quota exceeded? */
1060 			return QUOTA_EXCEEDED;
1061 		if (hint->preallocate && hint->prealloc_size) {
1062 #ifdef REISERQUOTA_DEBUG
1063 			reiserfs_debug(s, REISERFS_DEBUG_CODE,
1064 				       "reiserquota: allocating (prealloc) %d blocks id=%u",
1065 				       hint->prealloc_size, hint->inode->i_uid);
1066 #endif
1067 			quota_ret =
1068 			    DQUOT_PREALLOC_BLOCK_NODIRTY(hint->inode,
1069 							 hint->prealloc_size);
1070 			if (quota_ret)
1071 				hint->preallocate = hint->prealloc_size = 0;
1072 		}
1073 		/* for unformatted nodes, force large allocations */
1074 	}
1075 
1076 	do {
1077 		switch (passno++) {
1078 		case 0:	/* Search from hint->search_start to end of disk */
1079 			start = hint->search_start;
1080 			finish = SB_BLOCK_COUNT(s) - 1;
1081 			break;
1082 		case 1:	/* Search from hint->beg to hint->search_start */
1083 			start = hint->beg;
1084 			finish = hint->search_start;
1085 			break;
1086 		case 2:	/* Last chance: Search from 0 to hint->beg */
1087 			start = 0;
1088 			finish = hint->beg;
1089 			break;
1090 		default:	/* We've tried searching everywhere, not enough space */
1091 			/* Free the blocks */
1092 			if (!hint->formatted_node) {
1093 #ifdef REISERQUOTA_DEBUG
1094 				reiserfs_debug(s, REISERFS_DEBUG_CODE,
1095 					       "reiserquota: freeing (nospace) %d blocks id=%u",
1096 					       amount_needed +
1097 					       hint->prealloc_size -
1098 					       nr_allocated,
1099 					       hint->inode->i_uid);
1100 #endif
1101 				DQUOT_FREE_BLOCK_NODIRTY(hint->inode, amount_needed + hint->prealloc_size - nr_allocated);	/* Free not allocated blocks */
1102 			}
1103 			while (nr_allocated--)
1104 				reiserfs_free_block(hint->th, hint->inode,
1105 						    new_blocknrs[nr_allocated],
1106 						    !hint->formatted_node);
1107 
1108 			return NO_DISK_SPACE;
1109 		}
1110 	} while ((nr_allocated += allocate_without_wrapping_disk(hint,
1111 								 new_blocknrs +
1112 								 nr_allocated,
1113 								 start, finish,
1114 								 1,
1115 								 amount_needed -
1116 								 nr_allocated,
1117 								 hint->
1118 								 prealloc_size))
1119 		 < amount_needed);
1120 	if (!hint->formatted_node &&
1121 	    amount_needed + hint->prealloc_size >
1122 	    nr_allocated + REISERFS_I(hint->inode)->i_prealloc_count) {
1123 		/* Some of preallocation blocks were not allocated */
1124 #ifdef REISERQUOTA_DEBUG
1125 		reiserfs_debug(s, REISERFS_DEBUG_CODE,
1126 			       "reiserquota: freeing (failed prealloc) %d blocks id=%u",
1127 			       amount_needed + hint->prealloc_size -
1128 			       nr_allocated -
1129 			       REISERFS_I(hint->inode)->i_prealloc_count,
1130 			       hint->inode->i_uid);
1131 #endif
1132 		DQUOT_FREE_BLOCK_NODIRTY(hint->inode, amount_needed +
1133 					 hint->prealloc_size - nr_allocated -
1134 					 REISERFS_I(hint->inode)->
1135 					 i_prealloc_count);
1136 	}
1137 
1138 	return CARRY_ON;
1139 }
1140 
1141 /* grab new blocknrs from preallocated list */
1142 /* return amount still needed after using them */
1143 static int use_preallocated_list_if_available(reiserfs_blocknr_hint_t * hint,
1144 					      b_blocknr_t * new_blocknrs,
1145 					      int amount_needed)
1146 {
1147 	struct inode *inode = hint->inode;
1148 
1149 	if (REISERFS_I(inode)->i_prealloc_count > 0) {
1150 		while (amount_needed) {
1151 
1152 			*new_blocknrs++ = REISERFS_I(inode)->i_prealloc_block++;
1153 			REISERFS_I(inode)->i_prealloc_count--;
1154 
1155 			amount_needed--;
1156 
1157 			if (REISERFS_I(inode)->i_prealloc_count <= 0) {
1158 				list_del(&REISERFS_I(inode)->i_prealloc_list);
1159 				break;
1160 			}
1161 		}
1162 	}
1163 	/* return amount still needed after using preallocated blocks */
1164 	return amount_needed;
1165 }
1166 
1167 int reiserfs_allocate_blocknrs(reiserfs_blocknr_hint_t * hint, b_blocknr_t * new_blocknrs, int amount_needed, int reserved_by_us	/* Amount of blocks we have
1168 																	   already reserved */ )
1169 {
1170 	int initial_amount_needed = amount_needed;
1171 	int ret;
1172 	struct super_block *s = hint->th->t_super;
1173 
1174 	/* Check if there is enough space, taking into account reserved space */
1175 	if (SB_FREE_BLOCKS(s) - REISERFS_SB(s)->reserved_blocks <
1176 	    amount_needed - reserved_by_us)
1177 		return NO_DISK_SPACE;
1178 	/* should this be if !hint->inode &&  hint->preallocate? */
1179 	/* do you mean hint->formatted_node can be removed ? - Zam */
1180 	/* hint->formatted_node cannot be removed because we try to access
1181 	   inode information here, and there is often no inode assotiated with
1182 	   metadata allocations - green */
1183 
1184 	if (!hint->formatted_node && hint->preallocate) {
1185 		amount_needed = use_preallocated_list_if_available
1186 		    (hint, new_blocknrs, amount_needed);
1187 		if (amount_needed == 0)	/* all blocknrs we need we got from
1188 					   prealloc. list */
1189 			return CARRY_ON;
1190 		new_blocknrs += (initial_amount_needed - amount_needed);
1191 	}
1192 
1193 	/* find search start and save it in hint structure */
1194 	determine_search_start(hint, amount_needed);
1195 	if (hint->search_start >= SB_BLOCK_COUNT(s))
1196 		hint->search_start = SB_BLOCK_COUNT(s) - 1;
1197 
1198 	/* allocation itself; fill new_blocknrs and preallocation arrays */
1199 	ret = blocknrs_and_prealloc_arrays_from_search_start
1200 	    (hint, new_blocknrs, amount_needed);
1201 
1202 	/* we used prealloc. list to fill (partially) new_blocknrs array. If final allocation fails we
1203 	 * need to return blocks back to prealloc. list or just free them. -- Zam (I chose second
1204 	 * variant) */
1205 
1206 	if (ret != CARRY_ON) {
1207 		while (amount_needed++ < initial_amount_needed) {
1208 			reiserfs_free_block(hint->th, hint->inode,
1209 					    *(--new_blocknrs), 1);
1210 		}
1211 	}
1212 	return ret;
1213 }
1214 
1215 void reiserfs_cache_bitmap_metadata(struct super_block *sb,
1216                                     struct buffer_head *bh,
1217                                     struct reiserfs_bitmap_info *info)
1218 {
1219 	unsigned long *cur = (unsigned long *)(bh->b_data + bh->b_size);
1220 
1221 	/* The first bit must ALWAYS be 1 */
1222 	BUG_ON(!reiserfs_test_le_bit(0, (unsigned long *)bh->b_data));
1223 
1224 	info->free_count = 0;
1225 
1226 	while (--cur >= (unsigned long *)bh->b_data) {
1227 		int i;
1228 
1229 		/* 0 and ~0 are special, we can optimize for them */
1230 		if (*cur == 0)
1231 			info->free_count += BITS_PER_LONG;
1232 		else if (*cur != ~0L)	/* A mix, investigate */
1233 			for (i = BITS_PER_LONG - 1; i >= 0; i--)
1234 				if (!reiserfs_test_le_bit(i, cur))
1235 					info->free_count++;
1236 	}
1237 }
1238 
1239 struct buffer_head *reiserfs_read_bitmap_block(struct super_block *sb,
1240                                                unsigned int bitmap)
1241 {
1242 	b_blocknr_t block = (sb->s_blocksize << 3) * bitmap;
1243 	struct reiserfs_bitmap_info *info = SB_AP_BITMAP(sb) + bitmap;
1244 	struct buffer_head *bh;
1245 
1246 	/* Way old format filesystems had the bitmaps packed up front.
1247 	 * I doubt there are any of these left, but just in case... */
1248 	if (unlikely(test_bit(REISERFS_OLD_FORMAT,
1249 	                      &(REISERFS_SB(sb)->s_properties))))
1250 		block = REISERFS_SB(sb)->s_sbh->b_blocknr + 1 + bitmap;
1251 	else if (bitmap == 0)
1252 		block = (REISERFS_DISK_OFFSET_IN_BYTES >> sb->s_blocksize_bits) + 1;
1253 
1254 	bh = sb_bread(sb, block);
1255 	if (bh == NULL)
1256 		reiserfs_warning(sb, "sh-2029: %s: bitmap block (#%u) "
1257 		                 "reading failed", __func__, block);
1258 	else {
1259 		if (buffer_locked(bh)) {
1260 			PROC_INFO_INC(sb, scan_bitmap.wait);
1261 			__wait_on_buffer(bh);
1262 		}
1263 		BUG_ON(!buffer_uptodate(bh));
1264 		BUG_ON(atomic_read(&bh->b_count) == 0);
1265 
1266 		if (info->free_count == UINT_MAX)
1267 			reiserfs_cache_bitmap_metadata(sb, bh, info);
1268 	}
1269 
1270 	return bh;
1271 }
1272 
1273 int reiserfs_init_bitmap_cache(struct super_block *sb)
1274 {
1275 	struct reiserfs_bitmap_info *bitmap;
1276 	unsigned int bmap_nr = reiserfs_bmap_count(sb);
1277 
1278 	bitmap = vmalloc(sizeof(*bitmap) * bmap_nr);
1279 	if (bitmap == NULL)
1280 		return -ENOMEM;
1281 
1282 	memset(bitmap, 0xff, sizeof(*bitmap) * bmap_nr);
1283 
1284 	SB_AP_BITMAP(sb) = bitmap;
1285 
1286 	return 0;
1287 }
1288 
1289 void reiserfs_free_bitmap_cache(struct super_block *sb)
1290 {
1291 	if (SB_AP_BITMAP(sb)) {
1292 		vfree(SB_AP_BITMAP(sb));
1293 		SB_AP_BITMAP(sb) = NULL;
1294 	}
1295 }
1296