xref: /openbmc/linux/fs/reiserfs/bitmap.c (revision 3eb66e91a25497065c5322b1268cbc3953642227)
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  
get_bit_address(struct super_block * s,b_blocknr_t block,unsigned int * bmap_nr,unsigned int * offset)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  
is_reusable(struct super_block * s,b_blocknr_t block,int bit_value)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   */
is_block_in_journal(struct super_block * s,unsigned int bmap,int off,int * next)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   */
scan_bitmap_block(struct reiserfs_transaction_handle * th,unsigned int bmap_n,int * beg,int boundary,int min,int max,int unfm)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  
bmap_hash_id(struct super_block * s,u32 id)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   */
block_group_used(struct super_block * s,u32 id)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   */
reiserfs_choose_packing(struct inode * dir)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   */
scan_bitmap(struct reiserfs_transaction_handle * th,b_blocknr_t * start,b_blocknr_t finish,int min,int max,int unfm,sector_t file_block)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  
_reiserfs_free_block(struct reiserfs_transaction_handle * th,struct inode * inode,b_blocknr_t block,int for_unformatted)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  
reiserfs_free_block(struct reiserfs_transaction_handle * th,struct inode * inode,b_blocknr_t block,int for_unformatted)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 */
reiserfs_free_prealloc_block(struct reiserfs_transaction_handle * th,struct inode * inode,b_blocknr_t block)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  
__discard_prealloc(struct reiserfs_transaction_handle * th,struct reiserfs_inode_info * ei)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  		b_blocknr_t block_to_free;
517  
518  		/*
519  		 * reiserfs_free_prealloc_block can drop the write lock,
520  		 * which could allow another caller to free the same block.
521  		 * We can protect against it by modifying the prealloc
522  		 * state before calling it.
523  		 */
524  		block_to_free = ei->i_prealloc_block++;
525  		ei->i_prealloc_count--;
526  		reiserfs_free_prealloc_block(th, inode, block_to_free);
527  		dirty = 1;
528  	}
529  	if (dirty)
530  		reiserfs_update_sd(th, inode);
531  	ei->i_prealloc_block = save;
532  	list_del_init(&ei->i_prealloc_list);
533  }
534  
535  /* FIXME: It should be inline function */
reiserfs_discard_prealloc(struct reiserfs_transaction_handle * th,struct inode * inode)536  void reiserfs_discard_prealloc(struct reiserfs_transaction_handle *th,
537  			       struct inode *inode)
538  {
539  	struct reiserfs_inode_info *ei = REISERFS_I(inode);
540  
541  	BUG_ON(!th->t_trans_id);
542  	if (ei->i_prealloc_count)
543  		__discard_prealloc(th, ei);
544  }
545  
reiserfs_discard_all_prealloc(struct reiserfs_transaction_handle * th)546  void reiserfs_discard_all_prealloc(struct reiserfs_transaction_handle *th)
547  {
548  	struct list_head *plist = &SB_JOURNAL(th->t_super)->j_prealloc_list;
549  
550  	BUG_ON(!th->t_trans_id);
551  	while (!list_empty(plist)) {
552  		struct reiserfs_inode_info *ei;
553  		ei = list_entry(plist->next, struct reiserfs_inode_info,
554  				i_prealloc_list);
555  #ifdef CONFIG_REISERFS_CHECK
556  		if (!ei->i_prealloc_count) {
557  			reiserfs_error(th->t_super, "zam-4001",
558  				       "inode is in prealloc list but has "
559  				       "no preallocated blocks.");
560  		}
561  #endif
562  		__discard_prealloc(th, ei);
563  	}
564  }
565  
reiserfs_init_alloc_options(struct super_block * s)566  void reiserfs_init_alloc_options(struct super_block *s)
567  {
568  	set_bit(_ALLOC_skip_busy, &SB_ALLOC_OPTS(s));
569  	set_bit(_ALLOC_dirid_groups, &SB_ALLOC_OPTS(s));
570  	set_bit(_ALLOC_packing_groups, &SB_ALLOC_OPTS(s));
571  }
572  
573  /* block allocator related options are parsed here */
reiserfs_parse_alloc_options(struct super_block * s,char * options)574  int reiserfs_parse_alloc_options(struct super_block *s, char *options)
575  {
576  	char *this_char, *value;
577  
578  	/* clear default settings */
579  	REISERFS_SB(s)->s_alloc_options.bits = 0;
580  
581  	while ((this_char = strsep(&options, ":")) != NULL) {
582  		if ((value = strchr(this_char, '=')) != NULL)
583  			*value++ = 0;
584  
585  		if (!strcmp(this_char, "concentrating_formatted_nodes")) {
586  			int temp;
587  			SET_OPTION(concentrating_formatted_nodes);
588  			temp = (value
589  				&& *value) ? simple_strtoul(value, &value,
590  							    0) : 10;
591  			if (temp <= 0 || temp > 100) {
592  				REISERFS_SB(s)->s_alloc_options.border = 10;
593  			} else {
594  				REISERFS_SB(s)->s_alloc_options.border =
595  				    100 / temp;
596  			}
597  			continue;
598  		}
599  		if (!strcmp(this_char, "displacing_large_files")) {
600  			SET_OPTION(displacing_large_files);
601  			REISERFS_SB(s)->s_alloc_options.large_file_size =
602  			    (value
603  			     && *value) ? simple_strtoul(value, &value, 0) : 16;
604  			continue;
605  		}
606  		if (!strcmp(this_char, "displacing_new_packing_localities")) {
607  			SET_OPTION(displacing_new_packing_localities);
608  			continue;
609  		}
610  
611  		if (!strcmp(this_char, "old_hashed_relocation")) {
612  			SET_OPTION(old_hashed_relocation);
613  			continue;
614  		}
615  
616  		if (!strcmp(this_char, "new_hashed_relocation")) {
617  			SET_OPTION(new_hashed_relocation);
618  			continue;
619  		}
620  
621  		if (!strcmp(this_char, "dirid_groups")) {
622  			SET_OPTION(dirid_groups);
623  			continue;
624  		}
625  		if (!strcmp(this_char, "oid_groups")) {
626  			SET_OPTION(oid_groups);
627  			continue;
628  		}
629  		if (!strcmp(this_char, "packing_groups")) {
630  			SET_OPTION(packing_groups);
631  			continue;
632  		}
633  		if (!strcmp(this_char, "hashed_formatted_nodes")) {
634  			SET_OPTION(hashed_formatted_nodes);
635  			continue;
636  		}
637  
638  		if (!strcmp(this_char, "skip_busy")) {
639  			SET_OPTION(skip_busy);
640  			continue;
641  		}
642  
643  		if (!strcmp(this_char, "hundredth_slices")) {
644  			SET_OPTION(hundredth_slices);
645  			continue;
646  		}
647  
648  		if (!strcmp(this_char, "old_way")) {
649  			SET_OPTION(old_way);
650  			continue;
651  		}
652  
653  		if (!strcmp(this_char, "displace_based_on_dirid")) {
654  			SET_OPTION(displace_based_on_dirid);
655  			continue;
656  		}
657  
658  		if (!strcmp(this_char, "preallocmin")) {
659  			REISERFS_SB(s)->s_alloc_options.preallocmin =
660  			    (value
661  			     && *value) ? simple_strtoul(value, &value, 0) : 4;
662  			continue;
663  		}
664  
665  		if (!strcmp(this_char, "preallocsize")) {
666  			REISERFS_SB(s)->s_alloc_options.preallocsize =
667  			    (value
668  			     && *value) ? simple_strtoul(value, &value,
669  							 0) :
670  			    PREALLOCATION_SIZE;
671  			continue;
672  		}
673  
674  		reiserfs_warning(s, "zam-4001", "unknown option - %s",
675  				 this_char);
676  		return 1;
677  	}
678  
679  	reiserfs_info(s, "allocator options = [%08x]\n", SB_ALLOC_OPTS(s));
680  	return 0;
681  }
682  
print_sep(struct seq_file * seq,int * first)683  static void print_sep(struct seq_file *seq, int *first)
684  {
685  	if (!*first)
686  		seq_puts(seq, ":");
687  	else
688  		*first = 0;
689  }
690  
show_alloc_options(struct seq_file * seq,struct super_block * s)691  void show_alloc_options(struct seq_file *seq, struct super_block *s)
692  {
693  	int first = 1;
694  
695  	if (SB_ALLOC_OPTS(s) == ((1 << _ALLOC_skip_busy) |
696  		(1 << _ALLOC_dirid_groups) | (1 << _ALLOC_packing_groups)))
697  		return;
698  
699  	seq_puts(seq, ",alloc=");
700  
701  	if (TEST_OPTION(concentrating_formatted_nodes, s)) {
702  		print_sep(seq, &first);
703  		if (REISERFS_SB(s)->s_alloc_options.border != 10) {
704  			seq_printf(seq, "concentrating_formatted_nodes=%d",
705  				100 / REISERFS_SB(s)->s_alloc_options.border);
706  		} else
707  			seq_puts(seq, "concentrating_formatted_nodes");
708  	}
709  	if (TEST_OPTION(displacing_large_files, s)) {
710  		print_sep(seq, &first);
711  		if (REISERFS_SB(s)->s_alloc_options.large_file_size != 16) {
712  			seq_printf(seq, "displacing_large_files=%lu",
713  			    REISERFS_SB(s)->s_alloc_options.large_file_size);
714  		} else
715  			seq_puts(seq, "displacing_large_files");
716  	}
717  	if (TEST_OPTION(displacing_new_packing_localities, s)) {
718  		print_sep(seq, &first);
719  		seq_puts(seq, "displacing_new_packing_localities");
720  	}
721  	if (TEST_OPTION(old_hashed_relocation, s)) {
722  		print_sep(seq, &first);
723  		seq_puts(seq, "old_hashed_relocation");
724  	}
725  	if (TEST_OPTION(new_hashed_relocation, s)) {
726  		print_sep(seq, &first);
727  		seq_puts(seq, "new_hashed_relocation");
728  	}
729  	if (TEST_OPTION(dirid_groups, s)) {
730  		print_sep(seq, &first);
731  		seq_puts(seq, "dirid_groups");
732  	}
733  	if (TEST_OPTION(oid_groups, s)) {
734  		print_sep(seq, &first);
735  		seq_puts(seq, "oid_groups");
736  	}
737  	if (TEST_OPTION(packing_groups, s)) {
738  		print_sep(seq, &first);
739  		seq_puts(seq, "packing_groups");
740  	}
741  	if (TEST_OPTION(hashed_formatted_nodes, s)) {
742  		print_sep(seq, &first);
743  		seq_puts(seq, "hashed_formatted_nodes");
744  	}
745  	if (TEST_OPTION(skip_busy, s)) {
746  		print_sep(seq, &first);
747  		seq_puts(seq, "skip_busy");
748  	}
749  	if (TEST_OPTION(hundredth_slices, s)) {
750  		print_sep(seq, &first);
751  		seq_puts(seq, "hundredth_slices");
752  	}
753  	if (TEST_OPTION(old_way, s)) {
754  		print_sep(seq, &first);
755  		seq_puts(seq, "old_way");
756  	}
757  	if (TEST_OPTION(displace_based_on_dirid, s)) {
758  		print_sep(seq, &first);
759  		seq_puts(seq, "displace_based_on_dirid");
760  	}
761  	if (REISERFS_SB(s)->s_alloc_options.preallocmin != 0) {
762  		print_sep(seq, &first);
763  		seq_printf(seq, "preallocmin=%d",
764  				REISERFS_SB(s)->s_alloc_options.preallocmin);
765  	}
766  	if (REISERFS_SB(s)->s_alloc_options.preallocsize != 17) {
767  		print_sep(seq, &first);
768  		seq_printf(seq, "preallocsize=%d",
769  				REISERFS_SB(s)->s_alloc_options.preallocsize);
770  	}
771  }
772  
new_hashed_relocation(reiserfs_blocknr_hint_t * hint)773  static inline void new_hashed_relocation(reiserfs_blocknr_hint_t * hint)
774  {
775  	char *hash_in;
776  
777  	if (hint->formatted_node) {
778  		hash_in = (char *)&hint->key.k_dir_id;
779  	} else {
780  		if (!hint->inode) {
781  			/*hint->search_start = hint->beg;*/
782  			hash_in = (char *)&hint->key.k_dir_id;
783  		} else
784  		    if (TEST_OPTION(displace_based_on_dirid, hint->th->t_super))
785  			hash_in = (char *)(&INODE_PKEY(hint->inode)->k_dir_id);
786  		else
787  			hash_in =
788  			    (char *)(&INODE_PKEY(hint->inode)->k_objectid);
789  	}
790  
791  	hint->search_start =
792  	    hint->beg + keyed_hash(hash_in, 4) % (hint->end - hint->beg);
793  }
794  
795  /*
796   * Relocation based on dirid, hashing them into a given bitmap block
797   * files. Formatted nodes are unaffected, a separate policy covers them
798   */
dirid_groups(reiserfs_blocknr_hint_t * hint)799  static void dirid_groups(reiserfs_blocknr_hint_t * hint)
800  {
801  	unsigned long hash;
802  	__u32 dirid = 0;
803  	int bm = 0;
804  	struct super_block *sb = hint->th->t_super;
805  
806  	if (hint->inode)
807  		dirid = le32_to_cpu(INODE_PKEY(hint->inode)->k_dir_id);
808  	else if (hint->formatted_node)
809  		dirid = hint->key.k_dir_id;
810  
811  	if (dirid) {
812  		bm = bmap_hash_id(sb, dirid);
813  		hash = bm * (sb->s_blocksize << 3);
814  		/* give a portion of the block group to metadata */
815  		if (hint->inode)
816  			hash += sb->s_blocksize / 2;
817  		hint->search_start = hash;
818  	}
819  }
820  
821  /*
822   * Relocation based on oid, hashing them into a given bitmap block
823   * files. Formatted nodes are unaffected, a separate policy covers them
824   */
oid_groups(reiserfs_blocknr_hint_t * hint)825  static void oid_groups(reiserfs_blocknr_hint_t * hint)
826  {
827  	if (hint->inode) {
828  		unsigned long hash;
829  		__u32 oid;
830  		__u32 dirid;
831  		int bm;
832  
833  		dirid = le32_to_cpu(INODE_PKEY(hint->inode)->k_dir_id);
834  
835  		/*
836  		 * keep the root dir and it's first set of subdirs close to
837  		 * the start of the disk
838  		 */
839  		if (dirid <= 2)
840  			hash = (hint->inode->i_sb->s_blocksize << 3);
841  		else {
842  			oid = le32_to_cpu(INODE_PKEY(hint->inode)->k_objectid);
843  			bm = bmap_hash_id(hint->inode->i_sb, oid);
844  			hash = bm * (hint->inode->i_sb->s_blocksize << 3);
845  		}
846  		hint->search_start = hash;
847  	}
848  }
849  
850  /*
851   * returns 1 if it finds an indirect item and gets valid hint info
852   * from it, otherwise 0
853   */
get_left_neighbor(reiserfs_blocknr_hint_t * hint)854  static int get_left_neighbor(reiserfs_blocknr_hint_t * hint)
855  {
856  	struct treepath *path;
857  	struct buffer_head *bh;
858  	struct item_head *ih;
859  	int pos_in_item;
860  	__le32 *item;
861  	int ret = 0;
862  
863  	/*
864  	 * reiserfs code can call this function w/o pointer to path
865  	 * structure supplied; then we rely on supplied search_start
866  	 */
867  	if (!hint->path)
868  		return 0;
869  
870  	path = hint->path;
871  	bh = get_last_bh(path);
872  	RFALSE(!bh, "green-4002: Illegal path specified to get_left_neighbor");
873  	ih = tp_item_head(path);
874  	pos_in_item = path->pos_in_item;
875  	item = tp_item_body(path);
876  
877  	hint->search_start = bh->b_blocknr;
878  
879  	/*
880  	 * for indirect item: go to left and look for the first non-hole entry
881  	 * in the indirect item
882  	 */
883  	if (!hint->formatted_node && is_indirect_le_ih(ih)) {
884  		if (pos_in_item == I_UNFM_NUM(ih))
885  			pos_in_item--;
886  		while (pos_in_item >= 0) {
887  			int t = get_block_num(item, pos_in_item);
888  			if (t) {
889  				hint->search_start = t;
890  				ret = 1;
891  				break;
892  			}
893  			pos_in_item--;
894  		}
895  	}
896  
897  	/* does result value fit into specified region? */
898  	return ret;
899  }
900  
901  /*
902   * should be, if formatted node, then try to put on first part of the device
903   * specified as number of percent with mount option device, else try to put
904   * on last of device.  This is not to say it is good code to do so,
905   * but the effect should be measured.
906   */
set_border_in_hint(struct super_block * s,reiserfs_blocknr_hint_t * hint)907  static inline void set_border_in_hint(struct super_block *s,
908  				      reiserfs_blocknr_hint_t * hint)
909  {
910  	b_blocknr_t border =
911  	    SB_BLOCK_COUNT(s) / REISERFS_SB(s)->s_alloc_options.border;
912  
913  	if (hint->formatted_node)
914  		hint->end = border - 1;
915  	else
916  		hint->beg = border;
917  }
918  
displace_large_file(reiserfs_blocknr_hint_t * hint)919  static inline void displace_large_file(reiserfs_blocknr_hint_t * hint)
920  {
921  	if (TEST_OPTION(displace_based_on_dirid, hint->th->t_super))
922  		hint->search_start =
923  		    hint->beg +
924  		    keyed_hash((char *)(&INODE_PKEY(hint->inode)->k_dir_id),
925  			       4) % (hint->end - hint->beg);
926  	else
927  		hint->search_start =
928  		    hint->beg +
929  		    keyed_hash((char *)(&INODE_PKEY(hint->inode)->k_objectid),
930  			       4) % (hint->end - hint->beg);
931  }
932  
hash_formatted_node(reiserfs_blocknr_hint_t * hint)933  static inline void hash_formatted_node(reiserfs_blocknr_hint_t * hint)
934  {
935  	char *hash_in;
936  
937  	if (!hint->inode)
938  		hash_in = (char *)&hint->key.k_dir_id;
939  	else if (TEST_OPTION(displace_based_on_dirid, hint->th->t_super))
940  		hash_in = (char *)(&INODE_PKEY(hint->inode)->k_dir_id);
941  	else
942  		hash_in = (char *)(&INODE_PKEY(hint->inode)->k_objectid);
943  
944  	hint->search_start =
945  	    hint->beg + keyed_hash(hash_in, 4) % (hint->end - hint->beg);
946  }
947  
948  static inline int
this_blocknr_allocation_would_make_it_a_large_file(reiserfs_blocknr_hint_t * hint)949  this_blocknr_allocation_would_make_it_a_large_file(reiserfs_blocknr_hint_t *
950  						   hint)
951  {
952  	return hint->block ==
953  	    REISERFS_SB(hint->th->t_super)->s_alloc_options.large_file_size;
954  }
955  
956  #ifdef DISPLACE_NEW_PACKING_LOCALITIES
displace_new_packing_locality(reiserfs_blocknr_hint_t * hint)957  static inline void displace_new_packing_locality(reiserfs_blocknr_hint_t * hint)
958  {
959  	struct in_core_key *key = &hint->key;
960  
961  	hint->th->displace_new_blocks = 0;
962  	hint->search_start =
963  	    hint->beg + keyed_hash((char *)(&key->k_objectid),
964  				   4) % (hint->end - hint->beg);
965  }
966  #endif
967  
old_hashed_relocation(reiserfs_blocknr_hint_t * hint)968  static inline int old_hashed_relocation(reiserfs_blocknr_hint_t * hint)
969  {
970  	b_blocknr_t border;
971  	u32 hash_in;
972  
973  	if (hint->formatted_node || hint->inode == NULL) {
974  		return 0;
975  	}
976  
977  	hash_in = le32_to_cpu((INODE_PKEY(hint->inode))->k_dir_id);
978  	border =
979  	    hint->beg + (u32) keyed_hash(((char *)(&hash_in)),
980  					 4) % (hint->end - hint->beg - 1);
981  	if (border > hint->search_start)
982  		hint->search_start = border;
983  
984  	return 1;
985  }
986  
old_way(reiserfs_blocknr_hint_t * hint)987  static inline int old_way(reiserfs_blocknr_hint_t * hint)
988  {
989  	b_blocknr_t border;
990  
991  	if (hint->formatted_node || hint->inode == NULL) {
992  		return 0;
993  	}
994  
995  	border =
996  	    hint->beg +
997  	    le32_to_cpu(INODE_PKEY(hint->inode)->k_dir_id) % (hint->end -
998  							      hint->beg);
999  	if (border > hint->search_start)
1000  		hint->search_start = border;
1001  
1002  	return 1;
1003  }
1004  
hundredth_slices(reiserfs_blocknr_hint_t * hint)1005  static inline void hundredth_slices(reiserfs_blocknr_hint_t * hint)
1006  {
1007  	struct in_core_key *key = &hint->key;
1008  	b_blocknr_t slice_start;
1009  
1010  	slice_start =
1011  	    (keyed_hash((char *)(&key->k_dir_id), 4) % 100) * (hint->end / 100);
1012  	if (slice_start > hint->search_start
1013  	    || slice_start + (hint->end / 100) <= hint->search_start) {
1014  		hint->search_start = slice_start;
1015  	}
1016  }
1017  
determine_search_start(reiserfs_blocknr_hint_t * hint,int amount_needed)1018  static void determine_search_start(reiserfs_blocknr_hint_t * hint,
1019  				   int amount_needed)
1020  {
1021  	struct super_block *s = hint->th->t_super;
1022  	int unfm_hint;
1023  
1024  	hint->beg = 0;
1025  	hint->end = SB_BLOCK_COUNT(s) - 1;
1026  
1027  	/* This is former border algorithm. Now with tunable border offset */
1028  	if (concentrating_formatted_nodes(s))
1029  		set_border_in_hint(s, hint);
1030  
1031  #ifdef DISPLACE_NEW_PACKING_LOCALITIES
1032  	/*
1033  	 * whenever we create a new directory, we displace it.  At first
1034  	 * we will hash for location, later we might look for a moderately
1035  	 * empty place for it
1036  	 */
1037  	if (displacing_new_packing_localities(s)
1038  	    && hint->th->displace_new_blocks) {
1039  		displace_new_packing_locality(hint);
1040  
1041  		/*
1042  		 * we do not continue determine_search_start,
1043  		 * if new packing locality is being displaced
1044  		 */
1045  		return;
1046  	}
1047  #endif
1048  
1049  	/*
1050  	 * all persons should feel encouraged to add more special cases
1051  	 * here and test them
1052  	 */
1053  
1054  	if (displacing_large_files(s) && !hint->formatted_node
1055  	    && this_blocknr_allocation_would_make_it_a_large_file(hint)) {
1056  		displace_large_file(hint);
1057  		return;
1058  	}
1059  
1060  	/*
1061  	 * if none of our special cases is relevant, use the left
1062  	 * neighbor in the tree order of the new node we are allocating for
1063  	 */
1064  	if (hint->formatted_node && TEST_OPTION(hashed_formatted_nodes, s)) {
1065  		hash_formatted_node(hint);
1066  		return;
1067  	}
1068  
1069  	unfm_hint = get_left_neighbor(hint);
1070  
1071  	/*
1072  	 * Mimic old block allocator behaviour, that is if VFS allowed for
1073  	 * preallocation, new blocks are displaced based on directory ID.
1074  	 * Also, if suggested search_start is less than last preallocated
1075  	 * block, we start searching from it, assuming that HDD dataflow
1076  	 * is faster in forward direction
1077  	 */
1078  	if (TEST_OPTION(old_way, s)) {
1079  		if (!hint->formatted_node) {
1080  			if (!reiserfs_hashed_relocation(s))
1081  				old_way(hint);
1082  			else if (!reiserfs_no_unhashed_relocation(s))
1083  				old_hashed_relocation(hint);
1084  
1085  			if (hint->inode
1086  			    && hint->search_start <
1087  			    REISERFS_I(hint->inode)->i_prealloc_block)
1088  				hint->search_start =
1089  				    REISERFS_I(hint->inode)->i_prealloc_block;
1090  		}
1091  		return;
1092  	}
1093  
1094  	/* This is an approach proposed by Hans */
1095  	if (TEST_OPTION(hundredth_slices, s)
1096  	    && !(displacing_large_files(s) && !hint->formatted_node)) {
1097  		hundredth_slices(hint);
1098  		return;
1099  	}
1100  
1101  	/* old_hashed_relocation only works on unformatted */
1102  	if (!unfm_hint && !hint->formatted_node &&
1103  	    TEST_OPTION(old_hashed_relocation, s)) {
1104  		old_hashed_relocation(hint);
1105  	}
1106  
1107  	/* new_hashed_relocation works with both formatted/unformatted nodes */
1108  	if ((!unfm_hint || hint->formatted_node) &&
1109  	    TEST_OPTION(new_hashed_relocation, s)) {
1110  		new_hashed_relocation(hint);
1111  	}
1112  
1113  	/* dirid grouping works only on unformatted nodes */
1114  	if (!unfm_hint && !hint->formatted_node && TEST_OPTION(dirid_groups, s)) {
1115  		dirid_groups(hint);
1116  	}
1117  #ifdef DISPLACE_NEW_PACKING_LOCALITIES
1118  	if (hint->formatted_node && TEST_OPTION(dirid_groups, s)) {
1119  		dirid_groups(hint);
1120  	}
1121  #endif
1122  
1123  	/* oid grouping works only on unformatted nodes */
1124  	if (!unfm_hint && !hint->formatted_node && TEST_OPTION(oid_groups, s)) {
1125  		oid_groups(hint);
1126  	}
1127  	return;
1128  }
1129  
determine_prealloc_size(reiserfs_blocknr_hint_t * hint)1130  static int determine_prealloc_size(reiserfs_blocknr_hint_t * hint)
1131  {
1132  	/* make minimum size a mount option and benchmark both ways */
1133  	/* we preallocate blocks only for regular files, specific size */
1134  	/* benchmark preallocating always and see what happens */
1135  
1136  	hint->prealloc_size = 0;
1137  
1138  	if (!hint->formatted_node && hint->preallocate) {
1139  		if (S_ISREG(hint->inode->i_mode) && !IS_PRIVATE(hint->inode)
1140  		    && hint->inode->i_size >=
1141  		    REISERFS_SB(hint->th->t_super)->s_alloc_options.
1142  		    preallocmin * hint->inode->i_sb->s_blocksize)
1143  			hint->prealloc_size =
1144  			    REISERFS_SB(hint->th->t_super)->s_alloc_options.
1145  			    preallocsize - 1;
1146  	}
1147  	return CARRY_ON;
1148  }
1149  
allocate_without_wrapping_disk(reiserfs_blocknr_hint_t * hint,b_blocknr_t * new_blocknrs,b_blocknr_t start,b_blocknr_t finish,int min,int amount_needed,int prealloc_size)1150  static inline int allocate_without_wrapping_disk(reiserfs_blocknr_hint_t * hint,
1151  						 b_blocknr_t * new_blocknrs,
1152  						 b_blocknr_t start,
1153  						 b_blocknr_t finish, int min,
1154  						 int amount_needed,
1155  						 int prealloc_size)
1156  {
1157  	int rest = amount_needed;
1158  	int nr_allocated;
1159  
1160  	while (rest > 0 && start <= finish) {
1161  		nr_allocated = scan_bitmap(hint->th, &start, finish, min,
1162  					   rest + prealloc_size,
1163  					   !hint->formatted_node, hint->block);
1164  
1165  		if (nr_allocated == 0)	/* no new blocks allocated, return */
1166  			break;
1167  
1168  		/* fill free_blocknrs array first */
1169  		while (rest > 0 && nr_allocated > 0) {
1170  			*new_blocknrs++ = start++;
1171  			rest--;
1172  			nr_allocated--;
1173  		}
1174  
1175  		/* do we have something to fill prealloc. array also ? */
1176  		if (nr_allocated > 0) {
1177  			/*
1178  			 * it means prealloc_size was greater that 0 and
1179  			 * we do preallocation
1180  			 */
1181  			list_add(&REISERFS_I(hint->inode)->i_prealloc_list,
1182  				 &SB_JOURNAL(hint->th->t_super)->
1183  				 j_prealloc_list);
1184  			REISERFS_I(hint->inode)->i_prealloc_block = start;
1185  			REISERFS_I(hint->inode)->i_prealloc_count =
1186  			    nr_allocated;
1187  			break;
1188  		}
1189  	}
1190  
1191  	return (amount_needed - rest);
1192  }
1193  
blocknrs_and_prealloc_arrays_from_search_start(reiserfs_blocknr_hint_t * hint,b_blocknr_t * new_blocknrs,int amount_needed)1194  static inline int blocknrs_and_prealloc_arrays_from_search_start
1195      (reiserfs_blocknr_hint_t * hint, b_blocknr_t * new_blocknrs,
1196       int amount_needed) {
1197  	struct super_block *s = hint->th->t_super;
1198  	b_blocknr_t start = hint->search_start;
1199  	b_blocknr_t finish = SB_BLOCK_COUNT(s) - 1;
1200  	int passno = 0;
1201  	int nr_allocated = 0;
1202  	int depth;
1203  
1204  	determine_prealloc_size(hint);
1205  	if (!hint->formatted_node) {
1206  		int quota_ret;
1207  #ifdef REISERQUOTA_DEBUG
1208  		reiserfs_debug(s, REISERFS_DEBUG_CODE,
1209  			       "reiserquota: allocating %d blocks id=%u",
1210  			       amount_needed, hint->inode->i_uid);
1211  #endif
1212  		depth = reiserfs_write_unlock_nested(s);
1213  		quota_ret =
1214  		    dquot_alloc_block_nodirty(hint->inode, amount_needed);
1215  		if (quota_ret) {	/* Quota exceeded? */
1216  			reiserfs_write_lock_nested(s, depth);
1217  			return QUOTA_EXCEEDED;
1218  		}
1219  		if (hint->preallocate && hint->prealloc_size) {
1220  #ifdef REISERQUOTA_DEBUG
1221  			reiserfs_debug(s, REISERFS_DEBUG_CODE,
1222  				       "reiserquota: allocating (prealloc) %d blocks id=%u",
1223  				       hint->prealloc_size, hint->inode->i_uid);
1224  #endif
1225  			quota_ret = dquot_prealloc_block_nodirty(hint->inode,
1226  							 hint->prealloc_size);
1227  			if (quota_ret)
1228  				hint->preallocate = hint->prealloc_size = 0;
1229  		}
1230  		/* for unformatted nodes, force large allocations */
1231  		reiserfs_write_lock_nested(s, depth);
1232  	}
1233  
1234  	do {
1235  		switch (passno++) {
1236  		case 0:	/* Search from hint->search_start to end of disk */
1237  			start = hint->search_start;
1238  			finish = SB_BLOCK_COUNT(s) - 1;
1239  			break;
1240  		case 1:	/* Search from hint->beg to hint->search_start */
1241  			start = hint->beg;
1242  			finish = hint->search_start;
1243  			break;
1244  		case 2:	/* Last chance: Search from 0 to hint->beg */
1245  			start = 0;
1246  			finish = hint->beg;
1247  			break;
1248  		default:
1249  			/* We've tried searching everywhere, not enough space */
1250  			/* Free the blocks */
1251  			if (!hint->formatted_node) {
1252  #ifdef REISERQUOTA_DEBUG
1253  				reiserfs_debug(s, REISERFS_DEBUG_CODE,
1254  					       "reiserquota: freeing (nospace) %d blocks id=%u",
1255  					       amount_needed +
1256  					       hint->prealloc_size -
1257  					       nr_allocated,
1258  					       hint->inode->i_uid);
1259  #endif
1260  				/* Free not allocated blocks */
1261  				depth = reiserfs_write_unlock_nested(s);
1262  				dquot_free_block_nodirty(hint->inode,
1263  					amount_needed + hint->prealloc_size -
1264  					nr_allocated);
1265  				reiserfs_write_lock_nested(s, depth);
1266  			}
1267  			while (nr_allocated--)
1268  				reiserfs_free_block(hint->th, hint->inode,
1269  						    new_blocknrs[nr_allocated],
1270  						    !hint->formatted_node);
1271  
1272  			return NO_DISK_SPACE;
1273  		}
1274  	} while ((nr_allocated += allocate_without_wrapping_disk(hint,
1275  								 new_blocknrs +
1276  								 nr_allocated,
1277  								 start, finish,
1278  								 1,
1279  								 amount_needed -
1280  								 nr_allocated,
1281  								 hint->
1282  								 prealloc_size))
1283  		 < amount_needed);
1284  	if (!hint->formatted_node &&
1285  	    amount_needed + hint->prealloc_size >
1286  	    nr_allocated + REISERFS_I(hint->inode)->i_prealloc_count) {
1287  		/* Some of preallocation blocks were not allocated */
1288  #ifdef REISERQUOTA_DEBUG
1289  		reiserfs_debug(s, REISERFS_DEBUG_CODE,
1290  			       "reiserquota: freeing (failed prealloc) %d blocks id=%u",
1291  			       amount_needed + hint->prealloc_size -
1292  			       nr_allocated -
1293  			       REISERFS_I(hint->inode)->i_prealloc_count,
1294  			       hint->inode->i_uid);
1295  #endif
1296  
1297  		depth = reiserfs_write_unlock_nested(s);
1298  		dquot_free_block_nodirty(hint->inode, amount_needed +
1299  					 hint->prealloc_size - nr_allocated -
1300  					 REISERFS_I(hint->inode)->
1301  					 i_prealloc_count);
1302  		reiserfs_write_lock_nested(s, depth);
1303  	}
1304  
1305  	return CARRY_ON;
1306  }
1307  
1308  /* grab new blocknrs from preallocated list */
1309  /* return amount still needed after using them */
use_preallocated_list_if_available(reiserfs_blocknr_hint_t * hint,b_blocknr_t * new_blocknrs,int amount_needed)1310  static int use_preallocated_list_if_available(reiserfs_blocknr_hint_t * hint,
1311  					      b_blocknr_t * new_blocknrs,
1312  					      int amount_needed)
1313  {
1314  	struct inode *inode = hint->inode;
1315  
1316  	if (REISERFS_I(inode)->i_prealloc_count > 0) {
1317  		while (amount_needed) {
1318  
1319  			*new_blocknrs++ = REISERFS_I(inode)->i_prealloc_block++;
1320  			REISERFS_I(inode)->i_prealloc_count--;
1321  
1322  			amount_needed--;
1323  
1324  			if (REISERFS_I(inode)->i_prealloc_count <= 0) {
1325  				list_del(&REISERFS_I(inode)->i_prealloc_list);
1326  				break;
1327  			}
1328  		}
1329  	}
1330  	/* return amount still needed after using preallocated blocks */
1331  	return amount_needed;
1332  }
1333  
reiserfs_allocate_blocknrs(reiserfs_blocknr_hint_t * hint,b_blocknr_t * new_blocknrs,int amount_needed,int reserved_by_us)1334  int reiserfs_allocate_blocknrs(reiserfs_blocknr_hint_t *hint,
1335  			       b_blocknr_t *new_blocknrs,
1336  			       int amount_needed,
1337  			       /* Amount of blocks we have already reserved */
1338  			       int reserved_by_us)
1339  {
1340  	int initial_amount_needed = amount_needed;
1341  	int ret;
1342  	struct super_block *s = hint->th->t_super;
1343  
1344  	/* Check if there is enough space, taking into account reserved space */
1345  	if (SB_FREE_BLOCKS(s) - REISERFS_SB(s)->reserved_blocks <
1346  	    amount_needed - reserved_by_us)
1347  		return NO_DISK_SPACE;
1348  	/* should this be if !hint->inode &&  hint->preallocate? */
1349  	/* do you mean hint->formatted_node can be removed ? - Zam */
1350  	/*
1351  	 * hint->formatted_node cannot be removed because we try to access
1352  	 * inode information here, and there is often no inode associated with
1353  	 * metadata allocations - green
1354  	 */
1355  
1356  	if (!hint->formatted_node && hint->preallocate) {
1357  		amount_needed = use_preallocated_list_if_available
1358  		    (hint, new_blocknrs, amount_needed);
1359  
1360  		/*
1361  		 * We have all the block numbers we need from the
1362  		 * prealloc list
1363  		 */
1364  		if (amount_needed == 0)
1365  			return CARRY_ON;
1366  		new_blocknrs += (initial_amount_needed - amount_needed);
1367  	}
1368  
1369  	/* find search start and save it in hint structure */
1370  	determine_search_start(hint, amount_needed);
1371  	if (hint->search_start >= SB_BLOCK_COUNT(s))
1372  		hint->search_start = SB_BLOCK_COUNT(s) - 1;
1373  
1374  	/* allocation itself; fill new_blocknrs and preallocation arrays */
1375  	ret = blocknrs_and_prealloc_arrays_from_search_start
1376  	    (hint, new_blocknrs, amount_needed);
1377  
1378  	/*
1379  	 * We used prealloc. list to fill (partially) new_blocknrs array.
1380  	 * If final allocation fails we need to return blocks back to
1381  	 * prealloc. list or just free them. -- Zam (I chose second
1382  	 * variant)
1383  	 */
1384  	if (ret != CARRY_ON) {
1385  		while (amount_needed++ < initial_amount_needed) {
1386  			reiserfs_free_block(hint->th, hint->inode,
1387  					    *(--new_blocknrs), 1);
1388  		}
1389  	}
1390  	return ret;
1391  }
1392  
reiserfs_cache_bitmap_metadata(struct super_block * sb,struct buffer_head * bh,struct reiserfs_bitmap_info * info)1393  void reiserfs_cache_bitmap_metadata(struct super_block *sb,
1394                                      struct buffer_head *bh,
1395                                      struct reiserfs_bitmap_info *info)
1396  {
1397  	unsigned long *cur = (unsigned long *)(bh->b_data + bh->b_size);
1398  
1399  	/* The first bit must ALWAYS be 1 */
1400  	if (!reiserfs_test_le_bit(0, (unsigned long *)bh->b_data))
1401  		reiserfs_error(sb, "reiserfs-2025", "bitmap block %lu is "
1402  			       "corrupted: first bit must be 1", bh->b_blocknr);
1403  
1404  	info->free_count = 0;
1405  
1406  	while (--cur >= (unsigned long *)bh->b_data) {
1407  		/* 0 and ~0 are special, we can optimize for them */
1408  		if (*cur == 0)
1409  			info->free_count += BITS_PER_LONG;
1410  		else if (*cur != ~0L)	/* A mix, investigate */
1411  			info->free_count += BITS_PER_LONG - hweight_long(*cur);
1412  	}
1413  }
1414  
reiserfs_read_bitmap_block(struct super_block * sb,unsigned int bitmap)1415  struct buffer_head *reiserfs_read_bitmap_block(struct super_block *sb,
1416                                                 unsigned int bitmap)
1417  {
1418  	b_blocknr_t block = (sb->s_blocksize << 3) * bitmap;
1419  	struct reiserfs_bitmap_info *info = SB_AP_BITMAP(sb) + bitmap;
1420  	struct buffer_head *bh;
1421  
1422  	/*
1423  	 * Way old format filesystems had the bitmaps packed up front.
1424  	 * I doubt there are any of these left, but just in case...
1425  	 */
1426  	if (unlikely(test_bit(REISERFS_OLD_FORMAT,
1427  			      &REISERFS_SB(sb)->s_properties)))
1428  		block = REISERFS_SB(sb)->s_sbh->b_blocknr + 1 + bitmap;
1429  	else if (bitmap == 0)
1430  		block = (REISERFS_DISK_OFFSET_IN_BYTES >> sb->s_blocksize_bits) + 1;
1431  
1432  	bh = sb_bread(sb, block);
1433  	if (bh == NULL)
1434  		reiserfs_warning(sb, "sh-2029: %s: bitmap block (#%u) "
1435  		                 "reading failed", __func__, block);
1436  	else {
1437  		if (buffer_locked(bh)) {
1438  			int depth;
1439  			PROC_INFO_INC(sb, scan_bitmap.wait);
1440  			depth = reiserfs_write_unlock_nested(sb);
1441  			__wait_on_buffer(bh);
1442  			reiserfs_write_lock_nested(sb, depth);
1443  		}
1444  		BUG_ON(!buffer_uptodate(bh));
1445  		BUG_ON(atomic_read(&bh->b_count) == 0);
1446  
1447  		if (info->free_count == UINT_MAX)
1448  			reiserfs_cache_bitmap_metadata(sb, bh, info);
1449  	}
1450  
1451  	return bh;
1452  }
1453  
reiserfs_init_bitmap_cache(struct super_block * sb)1454  int reiserfs_init_bitmap_cache(struct super_block *sb)
1455  {
1456  	struct reiserfs_bitmap_info *bitmap;
1457  	unsigned int bmap_nr = reiserfs_bmap_count(sb);
1458  
1459  	bitmap = vmalloc(array_size(bmap_nr, sizeof(*bitmap)));
1460  	if (bitmap == NULL)
1461  		return -ENOMEM;
1462  
1463  	memset(bitmap, 0xff, sizeof(*bitmap) * bmap_nr);
1464  
1465  	SB_AP_BITMAP(sb) = bitmap;
1466  
1467  	return 0;
1468  }
1469  
reiserfs_free_bitmap_cache(struct super_block * sb)1470  void reiserfs_free_bitmap_cache(struct super_block *sb)
1471  {
1472  	if (SB_AP_BITMAP(sb)) {
1473  		vfree(SB_AP_BITMAP(sb));
1474  		SB_AP_BITMAP(sb) = NULL;
1475  	}
1476  }
1477