1
2
3
4
5
6
7
8
9
10
11
12
13
14#include "ext2.h"
15#include <linux/quotaops.h>
16#include <linux/slab.h>
17#include <linux/sched.h>
18#include <linux/buffer_head.h>
19#include <linux/capability.h>
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37#define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1)
38
39struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
40 unsigned int block_group,
41 struct buffer_head ** bh)
42{
43 unsigned long group_desc;
44 unsigned long offset;
45 struct ext2_group_desc * desc;
46 struct ext2_sb_info *sbi = EXT2_SB(sb);
47
48 if (block_group >= sbi->s_groups_count) {
49 ext2_error (sb, "ext2_get_group_desc",
50 "block_group >= groups_count - "
51 "block_group = %d, groups_count = %lu",
52 block_group, sbi->s_groups_count);
53
54 return NULL;
55 }
56
57 group_desc = block_group >> EXT2_DESC_PER_BLOCK_BITS(sb);
58 offset = block_group & (EXT2_DESC_PER_BLOCK(sb) - 1);
59 if (!sbi->s_group_desc[group_desc]) {
60 ext2_error (sb, "ext2_get_group_desc",
61 "Group descriptor not loaded - "
62 "block_group = %d, group_desc = %lu, desc = %lu",
63 block_group, group_desc, offset);
64 return NULL;
65 }
66
67 desc = (struct ext2_group_desc *) sbi->s_group_desc[group_desc]->b_data;
68 if (bh)
69 *bh = sbi->s_group_desc[group_desc];
70 return desc + offset;
71}
72
73static int ext2_valid_block_bitmap(struct super_block *sb,
74 struct ext2_group_desc *desc,
75 unsigned int block_group,
76 struct buffer_head *bh)
77{
78 ext2_grpblk_t offset;
79 ext2_grpblk_t next_zero_bit;
80 ext2_fsblk_t bitmap_blk;
81 ext2_fsblk_t group_first_block;
82
83 group_first_block = ext2_group_first_block_no(sb, block_group);
84
85
86 bitmap_blk = le32_to_cpu(desc->bg_block_bitmap);
87 offset = bitmap_blk - group_first_block;
88 if (!ext2_test_bit(offset, bh->b_data))
89
90 goto err_out;
91
92
93 bitmap_blk = le32_to_cpu(desc->bg_inode_bitmap);
94 offset = bitmap_blk - group_first_block;
95 if (!ext2_test_bit(offset, bh->b_data))
96
97 goto err_out;
98
99
100 bitmap_blk = le32_to_cpu(desc->bg_inode_table);
101 offset = bitmap_blk - group_first_block;
102 next_zero_bit = ext2_find_next_zero_bit(bh->b_data,
103 offset + EXT2_SB(sb)->s_itb_per_group,
104 offset);
105 if (next_zero_bit >= offset + EXT2_SB(sb)->s_itb_per_group)
106
107 return 1;
108
109err_out:
110 ext2_error(sb, __func__,
111 "Invalid block bitmap - "
112 "block_group = %d, block = %lu",
113 block_group, bitmap_blk);
114 return 0;
115}
116
117
118
119
120
121
122
123static struct buffer_head *
124read_block_bitmap(struct super_block *sb, unsigned int block_group)
125{
126 struct ext2_group_desc * desc;
127 struct buffer_head * bh = NULL;
128 ext2_fsblk_t bitmap_blk;
129
130 desc = ext2_get_group_desc(sb, block_group, NULL);
131 if (!desc)
132 return NULL;
133 bitmap_blk = le32_to_cpu(desc->bg_block_bitmap);
134 bh = sb_getblk(sb, bitmap_blk);
135 if (unlikely(!bh)) {
136 ext2_error(sb, __func__,
137 "Cannot read block bitmap - "
138 "block_group = %d, block_bitmap = %u",
139 block_group, le32_to_cpu(desc->bg_block_bitmap));
140 return NULL;
141 }
142 if (likely(bh_uptodate_or_lock(bh)))
143 return bh;
144
145 if (bh_submit_read(bh) < 0) {
146 brelse(bh);
147 ext2_error(sb, __func__,
148 "Cannot read block bitmap - "
149 "block_group = %d, block_bitmap = %u",
150 block_group, le32_to_cpu(desc->bg_block_bitmap));
151 return NULL;
152 }
153
154 ext2_valid_block_bitmap(sb, desc, block_group, bh);
155
156
157
158
159 return bh;
160}
161
162static void release_blocks(struct super_block *sb, int count)
163{
164 if (count) {
165 struct ext2_sb_info *sbi = EXT2_SB(sb);
166
167 percpu_counter_add(&sbi->s_freeblocks_counter, count);
168 sb->s_dirt = 1;
169 }
170}
171
172static void group_adjust_blocks(struct super_block *sb, int group_no,
173 struct ext2_group_desc *desc, struct buffer_head *bh, int count)
174{
175 if (count) {
176 struct ext2_sb_info *sbi = EXT2_SB(sb);
177 unsigned free_blocks;
178
179 spin_lock(sb_bgl_lock(sbi, group_no));
180 free_blocks = le16_to_cpu(desc->bg_free_blocks_count);
181 desc->bg_free_blocks_count = cpu_to_le16(free_blocks + count);
182 spin_unlock(sb_bgl_lock(sbi, group_no));
183 sb->s_dirt = 1;
184 mark_buffer_dirty(bh);
185 }
186}
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209#if 1
210static void __rsv_window_dump(struct rb_root *root, int verbose,
211 const char *fn)
212{
213 struct rb_node *n;
214 struct ext2_reserve_window_node *rsv, *prev;
215 int bad;
216
217restart:
218 n = rb_first(root);
219 bad = 0;
220 prev = NULL;
221
222 printk("Block Allocation Reservation Windows Map (%s):\n", fn);
223 while (n) {
224 rsv = rb_entry(n, struct ext2_reserve_window_node, rsv_node);
225 if (verbose)
226 printk("reservation window 0x%p "
227 "start: %lu, end: %lu\n",
228 rsv, rsv->rsv_start, rsv->rsv_end);
229 if (rsv->rsv_start && rsv->rsv_start >= rsv->rsv_end) {
230 printk("Bad reservation %p (start >= end)\n",
231 rsv);
232 bad = 1;
233 }
234 if (prev && prev->rsv_end >= rsv->rsv_start) {
235 printk("Bad reservation %p (prev->end >= start)\n",
236 rsv);
237 bad = 1;
238 }
239 if (bad) {
240 if (!verbose) {
241 printk("Restarting reservation walk in verbose mode\n");
242 verbose = 1;
243 goto restart;
244 }
245 }
246 n = rb_next(n);
247 prev = rsv;
248 }
249 printk("Window map complete.\n");
250 BUG_ON(bad);
251}
252#define rsv_window_dump(root, verbose) \
253 __rsv_window_dump((root), (verbose), __func__)
254#else
255#define rsv_window_dump(root, verbose) do {} while (0)
256#endif
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274static int
275goal_in_my_reservation(struct ext2_reserve_window *rsv, ext2_grpblk_t grp_goal,
276 unsigned int group, struct super_block * sb)
277{
278 ext2_fsblk_t group_first_block, group_last_block;
279
280 group_first_block = ext2_group_first_block_no(sb, group);
281 group_last_block = group_first_block + EXT2_BLOCKS_PER_GROUP(sb) - 1;
282
283 if ((rsv->_rsv_start > group_last_block) ||
284 (rsv->_rsv_end < group_first_block))
285 return 0;
286 if ((grp_goal >= 0) && ((grp_goal + group_first_block < rsv->_rsv_start)
287 || (grp_goal + group_first_block > rsv->_rsv_end)))
288 return 0;
289 return 1;
290}
291
292
293
294
295
296
297
298
299
300
301static struct ext2_reserve_window_node *
302search_reserve_window(struct rb_root *root, ext2_fsblk_t goal)
303{
304 struct rb_node *n = root->rb_node;
305 struct ext2_reserve_window_node *rsv;
306
307 if (!n)
308 return NULL;
309
310 do {
311 rsv = rb_entry(n, struct ext2_reserve_window_node, rsv_node);
312
313 if (goal < rsv->rsv_start)
314 n = n->rb_left;
315 else if (goal > rsv->rsv_end)
316 n = n->rb_right;
317 else
318 return rsv;
319 } while (n);
320
321
322
323
324
325
326 if (rsv->rsv_start > goal) {
327 n = rb_prev(&rsv->rsv_node);
328 rsv = rb_entry(n, struct ext2_reserve_window_node, rsv_node);
329 }
330 return rsv;
331}
332
333
334
335
336
337
338
339
340void ext2_rsv_window_add(struct super_block *sb,
341 struct ext2_reserve_window_node *rsv)
342{
343 struct rb_root *root = &EXT2_SB(sb)->s_rsv_window_root;
344 struct rb_node *node = &rsv->rsv_node;
345 ext2_fsblk_t start = rsv->rsv_start;
346
347 struct rb_node ** p = &root->rb_node;
348 struct rb_node * parent = NULL;
349 struct ext2_reserve_window_node *this;
350
351 while (*p)
352 {
353 parent = *p;
354 this = rb_entry(parent, struct ext2_reserve_window_node, rsv_node);
355
356 if (start < this->rsv_start)
357 p = &(*p)->rb_left;
358 else if (start > this->rsv_end)
359 p = &(*p)->rb_right;
360 else {
361 rsv_window_dump(root, 1);
362 BUG();
363 }
364 }
365
366 rb_link_node(node, parent, p);
367 rb_insert_color(node, root);
368}
369
370
371
372
373
374
375
376
377
378
379static void rsv_window_remove(struct super_block *sb,
380 struct ext2_reserve_window_node *rsv)
381{
382 rsv->rsv_start = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
383 rsv->rsv_end = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
384 rsv->rsv_alloc_hit = 0;
385 rb_erase(&rsv->rsv_node, &EXT2_SB(sb)->s_rsv_window_root);
386}
387
388
389
390
391
392
393
394static inline int rsv_is_empty(struct ext2_reserve_window *rsv)
395{
396
397 return (rsv->_rsv_end == EXT2_RESERVE_WINDOW_NOT_ALLOCATED);
398}
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421void ext2_init_block_alloc_info(struct inode *inode)
422{
423 struct ext2_inode_info *ei = EXT2_I(inode);
424 struct ext2_block_alloc_info *block_i = ei->i_block_alloc_info;
425 struct super_block *sb = inode->i_sb;
426
427 block_i = kmalloc(sizeof(*block_i), GFP_NOFS);
428 if (block_i) {
429 struct ext2_reserve_window_node *rsv = &block_i->rsv_window_node;
430
431 rsv->rsv_start = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
432 rsv->rsv_end = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
433
434
435
436
437
438
439 if (!test_opt(sb, RESERVATION))
440 rsv->rsv_goal_size = 0;
441 else
442 rsv->rsv_goal_size = EXT2_DEFAULT_RESERVE_BLOCKS;
443 rsv->rsv_alloc_hit = 0;
444 block_i->last_alloc_logical_block = 0;
445 block_i->last_alloc_physical_block = 0;
446 }
447 ei->i_block_alloc_info = block_i;
448}
449
450
451
452
453
454
455
456
457
458
459
460
461
462void ext2_discard_reservation(struct inode *inode)
463{
464 struct ext2_inode_info *ei = EXT2_I(inode);
465 struct ext2_block_alloc_info *block_i = ei->i_block_alloc_info;
466 struct ext2_reserve_window_node *rsv;
467 spinlock_t *rsv_lock = &EXT2_SB(inode->i_sb)->s_rsv_window_lock;
468
469 if (!block_i)
470 return;
471
472 rsv = &block_i->rsv_window_node;
473 if (!rsv_is_empty(&rsv->rsv_window)) {
474 spin_lock(rsv_lock);
475 if (!rsv_is_empty(&rsv->rsv_window))
476 rsv_window_remove(inode->i_sb, rsv);
477 spin_unlock(rsv_lock);
478 }
479}
480
481
482
483
484
485
486
487void ext2_free_blocks (struct inode * inode, unsigned long block,
488 unsigned long count)
489{
490 struct buffer_head *bitmap_bh = NULL;
491 struct buffer_head * bh2;
492 unsigned long block_group;
493 unsigned long bit;
494 unsigned long i;
495 unsigned long overflow;
496 struct super_block * sb = inode->i_sb;
497 struct ext2_sb_info * sbi = EXT2_SB(sb);
498 struct ext2_group_desc * desc;
499 struct ext2_super_block * es = sbi->s_es;
500 unsigned freed = 0, group_freed;
501
502 if (block < le32_to_cpu(es->s_first_data_block) ||
503 block + count < block ||
504 block + count > le32_to_cpu(es->s_blocks_count)) {
505 ext2_error (sb, "ext2_free_blocks",
506 "Freeing blocks not in datazone - "
507 "block = %lu, count = %lu", block, count);
508 goto error_return;
509 }
510
511 ext2_debug ("freeing block(s) %lu-%lu\n", block, block + count - 1);
512
513do_more:
514 overflow = 0;
515 block_group = (block - le32_to_cpu(es->s_first_data_block)) /
516 EXT2_BLOCKS_PER_GROUP(sb);
517 bit = (block - le32_to_cpu(es->s_first_data_block)) %
518 EXT2_BLOCKS_PER_GROUP(sb);
519
520
521
522
523 if (bit + count > EXT2_BLOCKS_PER_GROUP(sb)) {
524 overflow = bit + count - EXT2_BLOCKS_PER_GROUP(sb);
525 count -= overflow;
526 }
527 brelse(bitmap_bh);
528 bitmap_bh = read_block_bitmap(sb, block_group);
529 if (!bitmap_bh)
530 goto error_return;
531
532 desc = ext2_get_group_desc (sb, block_group, &bh2);
533 if (!desc)
534 goto error_return;
535
536 if (in_range (le32_to_cpu(desc->bg_block_bitmap), block, count) ||
537 in_range (le32_to_cpu(desc->bg_inode_bitmap), block, count) ||
538 in_range (block, le32_to_cpu(desc->bg_inode_table),
539 sbi->s_itb_per_group) ||
540 in_range (block + count - 1, le32_to_cpu(desc->bg_inode_table),
541 sbi->s_itb_per_group)) {
542 ext2_error (sb, "ext2_free_blocks",
543 "Freeing blocks in system zones - "
544 "Block = %lu, count = %lu",
545 block, count);
546 goto error_return;
547 }
548
549 for (i = 0, group_freed = 0; i < count; i++) {
550 if (!ext2_clear_bit_atomic(sb_bgl_lock(sbi, block_group),
551 bit + i, bitmap_bh->b_data)) {
552 ext2_error(sb, __func__,
553 "bit already cleared for block %lu", block + i);
554 } else {
555 group_freed++;
556 }
557 }
558
559 mark_buffer_dirty(bitmap_bh);
560 if (sb->s_flags & MS_SYNCHRONOUS)
561 sync_dirty_buffer(bitmap_bh);
562
563 group_adjust_blocks(sb, block_group, desc, bh2, group_freed);
564 freed += group_freed;
565
566 if (overflow) {
567 block += count;
568 count = overflow;
569 goto do_more;
570 }
571error_return:
572 brelse(bitmap_bh);
573 release_blocks(sb, freed);
574 dquot_free_block(inode, freed);
575}
576
577
578
579
580
581
582
583
584
585
586static ext2_grpblk_t
587bitmap_search_next_usable_block(ext2_grpblk_t start, struct buffer_head *bh,
588 ext2_grpblk_t maxblocks)
589{
590 ext2_grpblk_t next;
591
592 next = ext2_find_next_zero_bit(bh->b_data, maxblocks, start);
593 if (next >= maxblocks)
594 return -1;
595 return next;
596}
597
598
599
600
601
602
603
604
605
606
607
608
609
610static ext2_grpblk_t
611find_next_usable_block(int start, struct buffer_head *bh, int maxblocks)
612{
613 ext2_grpblk_t here, next;
614 char *p, *r;
615
616 if (start > 0) {
617
618
619
620
621
622
623
624
625 ext2_grpblk_t end_goal = (start + 63) & ~63;
626 if (end_goal > maxblocks)
627 end_goal = maxblocks;
628 here = ext2_find_next_zero_bit(bh->b_data, end_goal, start);
629 if (here < end_goal)
630 return here;
631 ext2_debug("Bit not found near goal\n");
632 }
633
634 here = start;
635 if (here < 0)
636 here = 0;
637
638 p = ((char *)bh->b_data) + (here >> 3);
639 r = memscan(p, 0, ((maxblocks + 7) >> 3) - (here >> 3));
640 next = (r - ((char *)bh->b_data)) << 3;
641
642 if (next < maxblocks && next >= here)
643 return next;
644
645 here = bitmap_search_next_usable_block(here, bh, maxblocks);
646 return here;
647}
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672static int
673ext2_try_to_allocate(struct super_block *sb, int group,
674 struct buffer_head *bitmap_bh, ext2_grpblk_t grp_goal,
675 unsigned long *count,
676 struct ext2_reserve_window *my_rsv)
677{
678 ext2_fsblk_t group_first_block;
679 ext2_grpblk_t start, end;
680 unsigned long num = 0;
681
682
683 if (my_rsv) {
684 group_first_block = ext2_group_first_block_no(sb, group);
685 if (my_rsv->_rsv_start >= group_first_block)
686 start = my_rsv->_rsv_start - group_first_block;
687 else
688
689 start = 0;
690 end = my_rsv->_rsv_end - group_first_block + 1;
691 if (end > EXT2_BLOCKS_PER_GROUP(sb))
692
693 end = EXT2_BLOCKS_PER_GROUP(sb);
694 if ((start <= grp_goal) && (grp_goal < end))
695 start = grp_goal;
696 else
697 grp_goal = -1;
698 } else {
699 if (grp_goal > 0)
700 start = grp_goal;
701 else
702 start = 0;
703 end = EXT2_BLOCKS_PER_GROUP(sb);
704 }
705
706 BUG_ON(start > EXT2_BLOCKS_PER_GROUP(sb));
707
708repeat:
709 if (grp_goal < 0) {
710 grp_goal = find_next_usable_block(start, bitmap_bh, end);
711 if (grp_goal < 0)
712 goto fail_access;
713 if (!my_rsv) {
714 int i;
715
716 for (i = 0; i < 7 && grp_goal > start &&
717 !ext2_test_bit(grp_goal - 1,
718 bitmap_bh->b_data);
719 i++, grp_goal--)
720 ;
721 }
722 }
723 start = grp_goal;
724
725 if (ext2_set_bit_atomic(sb_bgl_lock(EXT2_SB(sb), group), grp_goal,
726 bitmap_bh->b_data)) {
727
728
729
730
731 start++;
732 grp_goal++;
733 if (start >= end)
734 goto fail_access;
735 goto repeat;
736 }
737 num++;
738 grp_goal++;
739 while (num < *count && grp_goal < end
740 && !ext2_set_bit_atomic(sb_bgl_lock(EXT2_SB(sb), group),
741 grp_goal, bitmap_bh->b_data)) {
742 num++;
743 grp_goal++;
744 }
745 *count = num;
746 return grp_goal - num;
747fail_access:
748 *count = num;
749 return -1;
750}
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785static int find_next_reservable_window(
786 struct ext2_reserve_window_node *search_head,
787 struct ext2_reserve_window_node *my_rsv,
788 struct super_block * sb,
789 ext2_fsblk_t start_block,
790 ext2_fsblk_t last_block)
791{
792 struct rb_node *next;
793 struct ext2_reserve_window_node *rsv, *prev;
794 ext2_fsblk_t cur;
795 int size = my_rsv->rsv_goal_size;
796
797
798
799 cur = start_block;
800 rsv = search_head;
801 if (!rsv)
802 return -1;
803
804 while (1) {
805 if (cur <= rsv->rsv_end)
806 cur = rsv->rsv_end + 1;
807
808
809
810
811
812
813
814
815
816
817 if (cur > last_block)
818 return -1;
819
820 prev = rsv;
821 next = rb_next(&rsv->rsv_node);
822 rsv = rb_entry(next,struct ext2_reserve_window_node,rsv_node);
823
824
825
826
827
828 if (!next)
829 break;
830
831 if (cur + size <= rsv->rsv_start) {
832
833
834
835
836 break;
837 }
838 }
839
840
841
842
843
844
845
846
847
848
849
850 if ((prev != my_rsv) && (!rsv_is_empty(&my_rsv->rsv_window)))
851 rsv_window_remove(sb, my_rsv);
852
853
854
855
856
857
858
859
860 my_rsv->rsv_start = cur;
861 my_rsv->rsv_end = cur + size - 1;
862 my_rsv->rsv_alloc_hit = 0;
863
864 if (prev != my_rsv)
865 ext2_rsv_window_add(sb, my_rsv);
866
867 return 0;
868}
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907static int alloc_new_reservation(struct ext2_reserve_window_node *my_rsv,
908 ext2_grpblk_t grp_goal, struct super_block *sb,
909 unsigned int group, struct buffer_head *bitmap_bh)
910{
911 struct ext2_reserve_window_node *search_head;
912 ext2_fsblk_t group_first_block, group_end_block, start_block;
913 ext2_grpblk_t first_free_block;
914 struct rb_root *fs_rsv_root = &EXT2_SB(sb)->s_rsv_window_root;
915 unsigned long size;
916 int ret;
917 spinlock_t *rsv_lock = &EXT2_SB(sb)->s_rsv_window_lock;
918
919 group_first_block = ext2_group_first_block_no(sb, group);
920 group_end_block = group_first_block + (EXT2_BLOCKS_PER_GROUP(sb) - 1);
921
922 if (grp_goal < 0)
923 start_block = group_first_block;
924 else
925 start_block = grp_goal + group_first_block;
926
927 size = my_rsv->rsv_goal_size;
928
929 if (!rsv_is_empty(&my_rsv->rsv_window)) {
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944 if ((my_rsv->rsv_start <= group_end_block) &&
945 (my_rsv->rsv_end > group_end_block) &&
946 (start_block >= my_rsv->rsv_start))
947 return -1;
948
949 if ((my_rsv->rsv_alloc_hit >
950 (my_rsv->rsv_end - my_rsv->rsv_start + 1) / 2)) {
951
952
953
954
955
956
957 size = size * 2;
958 if (size > EXT2_MAX_RESERVE_BLOCKS)
959 size = EXT2_MAX_RESERVE_BLOCKS;
960 my_rsv->rsv_goal_size= size;
961 }
962 }
963
964 spin_lock(rsv_lock);
965
966
967
968 search_head = search_reserve_window(fs_rsv_root, start_block);
969
970
971
972
973
974
975
976
977retry:
978 ret = find_next_reservable_window(search_head, my_rsv, sb,
979 start_block, group_end_block);
980
981 if (ret == -1) {
982 if (!rsv_is_empty(&my_rsv->rsv_window))
983 rsv_window_remove(sb, my_rsv);
984 spin_unlock(rsv_lock);
985 return -1;
986 }
987
988
989
990
991
992
993
994
995
996
997 spin_unlock(rsv_lock);
998 first_free_block = bitmap_search_next_usable_block(
999 my_rsv->rsv_start - group_first_block,
1000 bitmap_bh, group_end_block - group_first_block + 1);
1001
1002 if (first_free_block < 0) {
1003
1004
1005
1006
1007 spin_lock(rsv_lock);
1008 if (!rsv_is_empty(&my_rsv->rsv_window))
1009 rsv_window_remove(sb, my_rsv);
1010 spin_unlock(rsv_lock);
1011 return -1;
1012 }
1013
1014 start_block = first_free_block + group_first_block;
1015
1016
1017
1018
1019 if (start_block >= my_rsv->rsv_start && start_block <= my_rsv->rsv_end)
1020 return 0;
1021
1022
1023
1024
1025
1026
1027 search_head = my_rsv;
1028 spin_lock(rsv_lock);
1029 goto retry;
1030}
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049static void try_to_extend_reservation(struct ext2_reserve_window_node *my_rsv,
1050 struct super_block *sb, int size)
1051{
1052 struct ext2_reserve_window_node *next_rsv;
1053 struct rb_node *next;
1054 spinlock_t *rsv_lock = &EXT2_SB(sb)->s_rsv_window_lock;
1055
1056 if (!spin_trylock(rsv_lock))
1057 return;
1058
1059 next = rb_next(&my_rsv->rsv_node);
1060
1061 if (!next)
1062 my_rsv->rsv_end += size;
1063 else {
1064 next_rsv = rb_entry(next, struct ext2_reserve_window_node, rsv_node);
1065
1066 if ((next_rsv->rsv_start - my_rsv->rsv_end - 1) >= size)
1067 my_rsv->rsv_end += size;
1068 else
1069 my_rsv->rsv_end = next_rsv->rsv_start - 1;
1070 }
1071 spin_unlock(rsv_lock);
1072}
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100static ext2_grpblk_t
1101ext2_try_to_allocate_with_rsv(struct super_block *sb, unsigned int group,
1102 struct buffer_head *bitmap_bh, ext2_grpblk_t grp_goal,
1103 struct ext2_reserve_window_node * my_rsv,
1104 unsigned long *count)
1105{
1106 ext2_fsblk_t group_first_block, group_last_block;
1107 ext2_grpblk_t ret = 0;
1108 unsigned long num = *count;
1109
1110
1111
1112
1113
1114
1115
1116 if (my_rsv == NULL) {
1117 return ext2_try_to_allocate(sb, group, bitmap_bh,
1118 grp_goal, count, NULL);
1119 }
1120
1121
1122
1123
1124
1125
1126 group_first_block = ext2_group_first_block_no(sb, group);
1127 group_last_block = group_first_block + (EXT2_BLOCKS_PER_GROUP(sb) - 1);
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144 while (1) {
1145 if (rsv_is_empty(&my_rsv->rsv_window) || (ret < 0) ||
1146 !goal_in_my_reservation(&my_rsv->rsv_window,
1147 grp_goal, group, sb)) {
1148 if (my_rsv->rsv_goal_size < *count)
1149 my_rsv->rsv_goal_size = *count;
1150 ret = alloc_new_reservation(my_rsv, grp_goal, sb,
1151 group, bitmap_bh);
1152 if (ret < 0)
1153 break;
1154
1155 if (!goal_in_my_reservation(&my_rsv->rsv_window,
1156 grp_goal, group, sb))
1157 grp_goal = -1;
1158 } else if (grp_goal >= 0) {
1159 int curr = my_rsv->rsv_end -
1160 (grp_goal + group_first_block) + 1;
1161
1162 if (curr < *count)
1163 try_to_extend_reservation(my_rsv, sb,
1164 *count - curr);
1165 }
1166
1167 if ((my_rsv->rsv_start > group_last_block) ||
1168 (my_rsv->rsv_end < group_first_block)) {
1169 rsv_window_dump(&EXT2_SB(sb)->s_rsv_window_root, 1);
1170 BUG();
1171 }
1172 ret = ext2_try_to_allocate(sb, group, bitmap_bh, grp_goal,
1173 &num, &my_rsv->rsv_window);
1174 if (ret >= 0) {
1175 my_rsv->rsv_alloc_hit += num;
1176 *count = num;
1177 break;
1178 }
1179 num = *count;
1180 }
1181 return ret;
1182}
1183
1184
1185
1186
1187
1188
1189
1190static int ext2_has_free_blocks(struct ext2_sb_info *sbi)
1191{
1192 ext2_fsblk_t free_blocks, root_blocks;
1193
1194 free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter);
1195 root_blocks = le32_to_cpu(sbi->s_es->s_r_blocks_count);
1196 if (free_blocks < root_blocks + 1 && !capable(CAP_SYS_RESOURCE) &&
1197 sbi->s_resuid != current_fsuid() &&
1198 (sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))) {
1199 return 0;
1200 }
1201 return 1;
1202}
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218ext2_fsblk_t ext2_new_blocks(struct inode *inode, ext2_fsblk_t goal,
1219 unsigned long *count, int *errp)
1220{
1221 struct buffer_head *bitmap_bh = NULL;
1222 struct buffer_head *gdp_bh;
1223 int group_no;
1224 int goal_group;
1225 ext2_grpblk_t grp_target_blk;
1226 ext2_grpblk_t grp_alloc_blk;
1227 ext2_fsblk_t ret_block;
1228 int bgi;
1229 int performed_allocation = 0;
1230 ext2_grpblk_t free_blocks;
1231 struct super_block *sb;
1232 struct ext2_group_desc *gdp;
1233 struct ext2_super_block *es;
1234 struct ext2_sb_info *sbi;
1235 struct ext2_reserve_window_node *my_rsv = NULL;
1236 struct ext2_block_alloc_info *block_i;
1237 unsigned short windowsz = 0;
1238 unsigned long ngroups;
1239 unsigned long num = *count;
1240 int ret;
1241
1242 *errp = -ENOSPC;
1243 sb = inode->i_sb;
1244 if (!sb) {
1245 printk("ext2_new_blocks: nonexistent device");
1246 return 0;
1247 }
1248
1249
1250
1251
1252 ret = dquot_alloc_block(inode, num);
1253 if (ret) {
1254 *errp = ret;
1255 return 0;
1256 }
1257
1258 sbi = EXT2_SB(sb);
1259 es = EXT2_SB(sb)->s_es;
1260 ext2_debug("goal=%lu.\n", goal);
1261
1262
1263
1264
1265
1266
1267
1268
1269 block_i = EXT2_I(inode)->i_block_alloc_info;
1270 if (block_i) {
1271 windowsz = block_i->rsv_window_node.rsv_goal_size;
1272 if (windowsz > 0)
1273 my_rsv = &block_i->rsv_window_node;
1274 }
1275
1276 if (!ext2_has_free_blocks(sbi)) {
1277 *errp = -ENOSPC;
1278 goto out;
1279 }
1280
1281
1282
1283
1284 if (goal < le32_to_cpu(es->s_first_data_block) ||
1285 goal >= le32_to_cpu(es->s_blocks_count))
1286 goal = le32_to_cpu(es->s_first_data_block);
1287 group_no = (goal - le32_to_cpu(es->s_first_data_block)) /
1288 EXT2_BLOCKS_PER_GROUP(sb);
1289 goal_group = group_no;
1290retry_alloc:
1291 gdp = ext2_get_group_desc(sb, group_no, &gdp_bh);
1292 if (!gdp)
1293 goto io_error;
1294
1295 free_blocks = le16_to_cpu(gdp->bg_free_blocks_count);
1296
1297
1298
1299
1300 if (my_rsv && (free_blocks < windowsz)
1301 && (free_blocks > 0)
1302 && (rsv_is_empty(&my_rsv->rsv_window)))
1303 my_rsv = NULL;
1304
1305 if (free_blocks > 0) {
1306 grp_target_blk = ((goal - le32_to_cpu(es->s_first_data_block)) %
1307 EXT2_BLOCKS_PER_GROUP(sb));
1308 bitmap_bh = read_block_bitmap(sb, group_no);
1309 if (!bitmap_bh)
1310 goto io_error;
1311 grp_alloc_blk = ext2_try_to_allocate_with_rsv(sb, group_no,
1312 bitmap_bh, grp_target_blk,
1313 my_rsv, &num);
1314 if (grp_alloc_blk >= 0)
1315 goto allocated;
1316 }
1317
1318 ngroups = EXT2_SB(sb)->s_groups_count;
1319 smp_rmb();
1320
1321
1322
1323
1324
1325 for (bgi = 0; bgi < ngroups; bgi++) {
1326 group_no++;
1327 if (group_no >= ngroups)
1328 group_no = 0;
1329 gdp = ext2_get_group_desc(sb, group_no, &gdp_bh);
1330 if (!gdp)
1331 goto io_error;
1332
1333 free_blocks = le16_to_cpu(gdp->bg_free_blocks_count);
1334
1335
1336
1337
1338 if (!free_blocks)
1339 continue;
1340
1341
1342
1343
1344
1345 if (my_rsv && (free_blocks <= (windowsz/2)))
1346 continue;
1347
1348 brelse(bitmap_bh);
1349 bitmap_bh = read_block_bitmap(sb, group_no);
1350 if (!bitmap_bh)
1351 goto io_error;
1352
1353
1354
1355 grp_alloc_blk = ext2_try_to_allocate_with_rsv(sb, group_no,
1356 bitmap_bh, -1, my_rsv, &num);
1357 if (grp_alloc_blk >= 0)
1358 goto allocated;
1359 }
1360
1361
1362
1363
1364
1365
1366
1367 if (my_rsv) {
1368 my_rsv = NULL;
1369 windowsz = 0;
1370 group_no = goal_group;
1371 goto retry_alloc;
1372 }
1373
1374 *errp = -ENOSPC;
1375 goto out;
1376
1377allocated:
1378
1379 ext2_debug("using block group %d(%d)\n",
1380 group_no, gdp->bg_free_blocks_count);
1381
1382 ret_block = grp_alloc_blk + ext2_group_first_block_no(sb, group_no);
1383
1384 if (in_range(le32_to_cpu(gdp->bg_block_bitmap), ret_block, num) ||
1385 in_range(le32_to_cpu(gdp->bg_inode_bitmap), ret_block, num) ||
1386 in_range(ret_block, le32_to_cpu(gdp->bg_inode_table),
1387 EXT2_SB(sb)->s_itb_per_group) ||
1388 in_range(ret_block + num - 1, le32_to_cpu(gdp->bg_inode_table),
1389 EXT2_SB(sb)->s_itb_per_group)) {
1390 ext2_error(sb, "ext2_new_blocks",
1391 "Allocating block in system zone - "
1392 "blocks from "E2FSBLK", length %lu",
1393 ret_block, num);
1394
1395
1396
1397
1398
1399 goto retry_alloc;
1400 }
1401
1402 performed_allocation = 1;
1403
1404 if (ret_block + num - 1 >= le32_to_cpu(es->s_blocks_count)) {
1405 ext2_error(sb, "ext2_new_blocks",
1406 "block("E2FSBLK") >= blocks count(%d) - "
1407 "block_group = %d, es == %p ", ret_block,
1408 le32_to_cpu(es->s_blocks_count), group_no, es);
1409 goto out;
1410 }
1411
1412 group_adjust_blocks(sb, group_no, gdp, gdp_bh, -num);
1413 percpu_counter_sub(&sbi->s_freeblocks_counter, num);
1414
1415 mark_buffer_dirty(bitmap_bh);
1416 if (sb->s_flags & MS_SYNCHRONOUS)
1417 sync_dirty_buffer(bitmap_bh);
1418
1419 *errp = 0;
1420 brelse(bitmap_bh);
1421 dquot_free_block(inode, *count-num);
1422 *count = num;
1423 return ret_block;
1424
1425io_error:
1426 *errp = -EIO;
1427out:
1428
1429
1430
1431 if (!performed_allocation)
1432 dquot_free_block(inode, *count);
1433 brelse(bitmap_bh);
1434 return 0;
1435}
1436
1437ext2_fsblk_t ext2_new_block(struct inode *inode, unsigned long goal, int *errp)
1438{
1439 unsigned long count = 1;
1440
1441 return ext2_new_blocks(inode, goal, &count, errp);
1442}
1443
1444#ifdef EXT2FS_DEBUG
1445
1446static const int nibblemap[] = {4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0};
1447
1448unsigned long ext2_count_free (struct buffer_head * map, unsigned int numchars)
1449{
1450 unsigned int i;
1451 unsigned long sum = 0;
1452
1453 if (!map)
1454 return (0);
1455 for (i = 0; i < numchars; i++)
1456 sum += nibblemap[map->b_data[i] & 0xf] +
1457 nibblemap[(map->b_data[i] >> 4) & 0xf];
1458 return (sum);
1459}
1460
1461#endif
1462
1463unsigned long ext2_count_free_blocks (struct super_block * sb)
1464{
1465 struct ext2_group_desc * desc;
1466 unsigned long desc_count = 0;
1467 int i;
1468#ifdef EXT2FS_DEBUG
1469 unsigned long bitmap_count, x;
1470 struct ext2_super_block *es;
1471
1472 es = EXT2_SB(sb)->s_es;
1473 desc_count = 0;
1474 bitmap_count = 0;
1475 desc = NULL;
1476 for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
1477 struct buffer_head *bitmap_bh;
1478 desc = ext2_get_group_desc (sb, i, NULL);
1479 if (!desc)
1480 continue;
1481 desc_count += le16_to_cpu(desc->bg_free_blocks_count);
1482 bitmap_bh = read_block_bitmap(sb, i);
1483 if (!bitmap_bh)
1484 continue;
1485
1486 x = ext2_count_free(bitmap_bh, sb->s_blocksize);
1487 printk ("group %d: stored = %d, counted = %lu\n",
1488 i, le16_to_cpu(desc->bg_free_blocks_count), x);
1489 bitmap_count += x;
1490 brelse(bitmap_bh);
1491 }
1492 printk("ext2_count_free_blocks: stored = %lu, computed = %lu, %lu\n",
1493 (long)le32_to_cpu(es->s_free_blocks_count),
1494 desc_count, bitmap_count);
1495 return bitmap_count;
1496#else
1497 for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
1498 desc = ext2_get_group_desc (sb, i, NULL);
1499 if (!desc)
1500 continue;
1501 desc_count += le16_to_cpu(desc->bg_free_blocks_count);
1502 }
1503 return desc_count;
1504#endif
1505}
1506
1507static inline int test_root(int a, int b)
1508{
1509 int num = b;
1510
1511 while (a > num)
1512 num *= b;
1513 return num == a;
1514}
1515
1516static int ext2_group_sparse(int group)
1517{
1518 if (group <= 1)
1519 return 1;
1520 return (test_root(group, 3) || test_root(group, 5) ||
1521 test_root(group, 7));
1522}
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532int ext2_bg_has_super(struct super_block *sb, int group)
1533{
1534 if (EXT2_HAS_RO_COMPAT_FEATURE(sb,EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)&&
1535 !ext2_group_sparse(group))
1536 return 0;
1537 return 1;
1538}
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549unsigned long ext2_bg_num_gdb(struct super_block *sb, int group)
1550{
1551 return ext2_bg_has_super(sb, group) ? EXT2_SB(sb)->s_gdb_count : 0;
1552}
1553
1554