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_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
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_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
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_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
113
114static 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) {
121 *next = tmp;
122 PROC_INFO_INC(s, scan_bitmap.in_journal_hint);
123 } else {
124 (*next) = off + 1;
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
134
135static 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
151
152
153
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;
170 }
171
172
173 *beg = reiserfs_find_next_zero_le_bit
174 ((unsigned long *)(bh->b_data), boundary, *beg);
175
176 if (*beg + min > boundary) {
177
178 brelse(bh);
179 return 0;
180 }
181
182 if (unfm && is_block_in_journal(s, bmap_n, *beg, beg))
183 continue;
184
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
192
193 if (unfm && is_block_in_journal(s, bmap_n, end, &next))
194 break;
195 }
196
197
198
199 if (end - *beg >= min) {
200 int i;
201 reiserfs_prepare_for_journal(s, bh, 1);
202
203 for (i = *beg; i < end; i++) {
204
205 if (reiserfs_test_and_set_le_bit
206 (i, bh->b_data)) {
207
208
209 PROC_INFO_INC(s, scan_bitmap.stolen);
210 if (i >= *beg + min) {
211
212 end = i;
213 break;
214 }
215
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
222 goto cont;
223 }
224 }
225 bi->free_count -= (end - *beg);
226 journal_mark_dirty(th, s, bh);
227 brelse(bh);
228
229
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
242static 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
258 if (bm >= reiserfs_bmap_count(s))
259 bm = 0;
260 return bm;
261}
262
263
264
265
266
267static 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
273
274
275
276
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
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
298
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
310
311static 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
318
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;
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
338
339
340
341
342
343
344
345
346
347
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
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
381static 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
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
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
431void 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
450 journal_mark_freed(th, s, block);
451 _reiserfs_free_block(th, inode, block, for_unformatted);
452}
453
454
455static 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
466static 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
491void 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
500void 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
521void 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
529int 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;
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
637static 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
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
660
661
662static 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
677 if (hint->inode)
678 hash += sb->s_blocksize / 2;
679 hint->search_start = hash;
680 }
681}
682
683
684
685
686
687static 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
698
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
712
713
714static 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)
724
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
738
739 if (pos_in_item == I_UNFM_NUM(ih))
740 pos_in_item--;
741
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
754 return ret;
755}
756
757
758
759
760
761static 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
773static 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
787static 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
802static inline int
803this_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
811static 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
822static 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
841static 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
859static 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
872static 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
882 if (concentrating_formatted_nodes(s))
883 set_border_in_hint(s, hint);
884
885#ifdef DISPLACE_NEW_PACKING_LOCALITIES
886
887
888
889 if (displacing_new_packing_localities(s)
890 && hint->th->displace_new_blocks) {
891 displace_new_packing_locality(hint);
892
893
894
895 return;
896 }
897#endif
898
899
900
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
909
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
918
919
920
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
938 if (TEST_OPTION(hundredth_slices, s)
939 && !(displacing_large_files(s) && !hint->formatted_node)) {
940 hundredth_slices(hint);
941 return;
942 }
943
944
945 if (!unfm_hint && !hint->formatted_node &&
946 TEST_OPTION(old_hashed_relocation, s)) {
947 old_hashed_relocation(hint);
948 }
949
950 if ((!unfm_hint || hint->formatted_node) &&
951 TEST_OPTION(new_hashed_relocation, s)) {
952 new_hashed_relocation(hint);
953 }
954
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
965 if (!unfm_hint && !hint->formatted_node && TEST_OPTION(oid_groups, s)) {
966 oid_groups(hint);
967 }
968 return;
969}
970
971static int determine_prealloc_size(reiserfs_blocknr_hint_t * hint)
972{
973
974
975
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
992
993static 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)
1009 break;
1010
1011
1012 while (rest > 0 && nr_allocated > 0) {
1013 *new_blocknrs++ = start++;
1014 rest--;
1015 nr_allocated--;
1016 }
1017
1018
1019 if (nr_allocated > 0) {
1020
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
1034static 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)
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
1067 }
1068
1069 do {
1070 switch (passno++) {
1071 case 0:
1072 start = hint->search_start;
1073 finish = SB_BLOCK_COUNT(s) - 1;
1074 break;
1075 case 1:
1076 start = hint->beg;
1077 finish = hint->search_start;
1078 break;
1079 case 2:
1080 start = 0;
1081 finish = hint->beg;
1082 break;
1083 default:
1084
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
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
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
1138
1139static 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
1160 return amount_needed;
1161}
1162
1163int reiserfs_allocate_blocknrs(reiserfs_blocknr_hint_t * hint, b_blocknr_t * new_blocknrs, int amount_needed, int reserved_by_us
1164 )
1165{
1166 int initial_amount_needed = amount_needed;
1167 int ret;
1168 struct super_block *s = hint->th->t_super;
1169
1170
1171 if (SB_FREE_BLOCKS(s) - REISERFS_SB(s)->reserved_blocks <
1172 amount_needed - reserved_by_us)
1173 return NO_DISK_SPACE;
1174
1175
1176
1177
1178
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)
1184
1185 return CARRY_ON;
1186 new_blocknrs += (initial_amount_needed - amount_needed);
1187 }
1188
1189
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
1195 ret = blocknrs_and_prealloc_arrays_from_search_start
1196 (hint, new_blocknrs, amount_needed);
1197
1198
1199
1200
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
1211void 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
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
1226 if (*cur == 0)
1227 info->free_count += BITS_PER_LONG;
1228 else if (*cur != ~0L)
1229 info->free_count += BITS_PER_LONG - hweight_long(*cur);
1230 }
1231}
1232
1233struct 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
1241
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
1271int 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
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
1290void 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