~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/reiserfs/bitmap.c

Version: ~ [ linux-5.4-rc7 ] ~ [ linux-5.3.11 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.84 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.154 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.201 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.201 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.77 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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 -- beginning 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_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                 dquot_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                     dquot_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 = dquot_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                                 dquot_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                 dquot_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                 /* 0 and ~0 are special, we can optimize for them */
1226                 if (*cur == 0)
1227                         info->free_count += BITS_PER_LONG;
1228                 else if (*cur != ~0L)   /* A mix, investigate */
1229                         info->free_count += BITS_PER_LONG - hweight_long(*cur);
1230         }
1231 }
1232 
1233 struct buffer_head *reiserfs_read_bitmap_block(struct super_block *sb,
1234                                                unsigned int bitmap)
1235 {
1236         b_blocknr_t block = (sb->s_blocksize << 3) * bitmap;
1237         struct reiserfs_bitmap_info *info = SB_AP_BITMAP(sb) + bitmap;
1238         struct buffer_head *bh;
1239 
1240         /* Way old format filesystems had the bitmaps packed up front.
1241          * I doubt there are any of these left, but just in case... */
1242         if (unlikely(test_bit(REISERFS_OLD_FORMAT,
1243                               &(REISERFS_SB(sb)->s_properties))))
1244                 block = REISERFS_SB(sb)->s_sbh->b_blocknr + 1 + bitmap;
1245         else if (bitmap == 0)
1246                 block = (REISERFS_DISK_OFFSET_IN_BYTES >> sb->s_blocksize_bits) + 1;
1247 
1248         reiserfs_write_unlock(sb);
1249         bh = sb_bread(sb, block);
1250         reiserfs_write_lock(sb);
1251         if (bh == NULL)
1252                 reiserfs_warning(sb, "sh-2029: %s: bitmap block (#%u) "
1253                                  "reading failed", __func__, block);
1254         else {
1255                 if (buffer_locked(bh)) {
1256                         PROC_INFO_INC(sb, scan_bitmap.wait);
1257                         reiserfs_write_unlock(sb);
1258                         __wait_on_buffer(bh);
1259                         reiserfs_write_lock(sb);
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         /* Avoid lock recursion in fault case */
1277         reiserfs_write_unlock(sb);
1278         bitmap = vmalloc(sizeof(*bitmap) * bmap_nr);
1279         reiserfs_write_lock(sb);
1280         if (bitmap == NULL)
1281                 return -ENOMEM;
1282 
1283         memset(bitmap, 0xff, sizeof(*bitmap) * bmap_nr);
1284 
1285         SB_AP_BITMAP(sb) = bitmap;
1286 
1287         return 0;
1288 }
1289 
1290 void reiserfs_free_bitmap_cache(struct super_block *sb)
1291 {
1292         if (SB_AP_BITMAP(sb)) {
1293                 vfree(SB_AP_BITMAP(sb));
1294                 SB_AP_BITMAP(sb) = NULL;
1295         }
1296 }
1297 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp