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