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