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