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