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