This source file includes following definitions.
- ext2_get_group_desc
- ext2_valid_block_bitmap
- read_block_bitmap
- group_adjust_blocks
- __rsv_window_dump
- goal_in_my_reservation
- search_reserve_window
- ext2_rsv_window_add
- rsv_window_remove
- rsv_is_empty
- ext2_init_block_alloc_info
- ext2_discard_reservation
- ext2_free_blocks
- bitmap_search_next_usable_block
- find_next_usable_block
- ext2_try_to_allocate
- find_next_reservable_window
- alloc_new_reservation
- try_to_extend_reservation
- ext2_try_to_allocate_with_rsv
- ext2_has_free_blocks
- ext2_data_block_valid
- ext2_new_blocks
- ext2_new_block
- ext2_count_free
- ext2_count_free_blocks
- test_root
- ext2_group_sparse
- ext2_bg_has_super
- ext2_bg_num_gdb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include "ext2.h"
16 #include <linux/quotaops.h>
17 #include <linux/slab.h>
18 #include <linux/sched.h>
19 #include <linux/cred.h>
20 #include <linux/buffer_head.h>
21 #include <linux/capability.h>
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 #define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1)
40
41 struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
42 unsigned int block_group,
43 struct buffer_head ** bh)
44 {
45 unsigned long group_desc;
46 unsigned long offset;
47 struct ext2_group_desc * desc;
48 struct ext2_sb_info *sbi = EXT2_SB(sb);
49
50 if (block_group >= sbi->s_groups_count) {
51 ext2_error (sb, "ext2_get_group_desc",
52 "block_group >= groups_count - "
53 "block_group = %d, groups_count = %lu",
54 block_group, sbi->s_groups_count);
55
56 return NULL;
57 }
58
59 group_desc = block_group >> EXT2_DESC_PER_BLOCK_BITS(sb);
60 offset = block_group & (EXT2_DESC_PER_BLOCK(sb) - 1);
61 if (!sbi->s_group_desc[group_desc]) {
62 ext2_error (sb, "ext2_get_group_desc",
63 "Group descriptor not loaded - "
64 "block_group = %d, group_desc = %lu, desc = %lu",
65 block_group, group_desc, offset);
66 return NULL;
67 }
68
69 desc = (struct ext2_group_desc *) sbi->s_group_desc[group_desc]->b_data;
70 if (bh)
71 *bh = sbi->s_group_desc[group_desc];
72 return desc + offset;
73 }
74
75 static int ext2_valid_block_bitmap(struct super_block *sb,
76 struct ext2_group_desc *desc,
77 unsigned int block_group,
78 struct buffer_head *bh)
79 {
80 ext2_grpblk_t offset;
81 ext2_grpblk_t next_zero_bit;
82 ext2_fsblk_t bitmap_blk;
83 ext2_fsblk_t group_first_block;
84
85 group_first_block = ext2_group_first_block_no(sb, block_group);
86
87
88 bitmap_blk = le32_to_cpu(desc->bg_block_bitmap);
89 offset = bitmap_blk - group_first_block;
90 if (!ext2_test_bit(offset, bh->b_data))
91
92 goto err_out;
93
94
95 bitmap_blk = le32_to_cpu(desc->bg_inode_bitmap);
96 offset = bitmap_blk - group_first_block;
97 if (!ext2_test_bit(offset, bh->b_data))
98
99 goto err_out;
100
101
102 bitmap_blk = le32_to_cpu(desc->bg_inode_table);
103 offset = bitmap_blk - group_first_block;
104 next_zero_bit = ext2_find_next_zero_bit(bh->b_data,
105 offset + EXT2_SB(sb)->s_itb_per_group,
106 offset);
107 if (next_zero_bit >= offset + EXT2_SB(sb)->s_itb_per_group)
108
109 return 1;
110
111 err_out:
112 ext2_error(sb, __func__,
113 "Invalid block bitmap - "
114 "block_group = %d, block = %lu",
115 block_group, bitmap_blk);
116 return 0;
117 }
118
119
120
121
122
123
124
125 static struct buffer_head *
126 read_block_bitmap(struct super_block *sb, unsigned int block_group)
127 {
128 struct ext2_group_desc * desc;
129 struct buffer_head * bh = NULL;
130 ext2_fsblk_t bitmap_blk;
131
132 desc = ext2_get_group_desc(sb, block_group, NULL);
133 if (!desc)
134 return NULL;
135 bitmap_blk = le32_to_cpu(desc->bg_block_bitmap);
136 bh = sb_getblk(sb, bitmap_blk);
137 if (unlikely(!bh)) {
138 ext2_error(sb, __func__,
139 "Cannot read block bitmap - "
140 "block_group = %d, block_bitmap = %u",
141 block_group, le32_to_cpu(desc->bg_block_bitmap));
142 return NULL;
143 }
144 if (likely(bh_uptodate_or_lock(bh)))
145 return bh;
146
147 if (bh_submit_read(bh) < 0) {
148 brelse(bh);
149 ext2_error(sb, __func__,
150 "Cannot read block bitmap - "
151 "block_group = %d, block_bitmap = %u",
152 block_group, le32_to_cpu(desc->bg_block_bitmap));
153 return NULL;
154 }
155
156 ext2_valid_block_bitmap(sb, desc, block_group, bh);
157
158
159
160
161 return bh;
162 }
163
164 static void group_adjust_blocks(struct super_block *sb, int group_no,
165 struct ext2_group_desc *desc, struct buffer_head *bh, int count)
166 {
167 if (count) {
168 struct ext2_sb_info *sbi = EXT2_SB(sb);
169 unsigned free_blocks;
170
171 spin_lock(sb_bgl_lock(sbi, group_no));
172 free_blocks = le16_to_cpu(desc->bg_free_blocks_count);
173 desc->bg_free_blocks_count = cpu_to_le16(free_blocks + count);
174 spin_unlock(sb_bgl_lock(sbi, group_no));
175 mark_buffer_dirty(bh);
176 }
177 }
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200 #if 1
201 static void __rsv_window_dump(struct rb_root *root, int verbose,
202 const char *fn)
203 {
204 struct rb_node *n;
205 struct ext2_reserve_window_node *rsv, *prev;
206 int bad;
207
208 restart:
209 n = rb_first(root);
210 bad = 0;
211 prev = NULL;
212
213 printk("Block Allocation Reservation Windows Map (%s):\n", fn);
214 while (n) {
215 rsv = rb_entry(n, struct ext2_reserve_window_node, rsv_node);
216 if (verbose)
217 printk("reservation window 0x%p "
218 "start: %lu, end: %lu\n",
219 rsv, rsv->rsv_start, rsv->rsv_end);
220 if (rsv->rsv_start && rsv->rsv_start >= rsv->rsv_end) {
221 printk("Bad reservation %p (start >= end)\n",
222 rsv);
223 bad = 1;
224 }
225 if (prev && prev->rsv_end >= rsv->rsv_start) {
226 printk("Bad reservation %p (prev->end >= start)\n",
227 rsv);
228 bad = 1;
229 }
230 if (bad) {
231 if (!verbose) {
232 printk("Restarting reservation walk in verbose mode\n");
233 verbose = 1;
234 goto restart;
235 }
236 }
237 n = rb_next(n);
238 prev = rsv;
239 }
240 printk("Window map complete.\n");
241 BUG_ON(bad);
242 }
243 #define rsv_window_dump(root, verbose) \
244 __rsv_window_dump((root), (verbose), __func__)
245 #else
246 #define rsv_window_dump(root, verbose) do {} while (0)
247 #endif
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265 static int
266 goal_in_my_reservation(struct ext2_reserve_window *rsv, ext2_grpblk_t grp_goal,
267 unsigned int group, struct super_block * sb)
268 {
269 ext2_fsblk_t group_first_block, group_last_block;
270
271 group_first_block = ext2_group_first_block_no(sb, group);
272 group_last_block = group_first_block + EXT2_BLOCKS_PER_GROUP(sb) - 1;
273
274 if ((rsv->_rsv_start > group_last_block) ||
275 (rsv->_rsv_end < group_first_block))
276 return 0;
277 if ((grp_goal >= 0) && ((grp_goal + group_first_block < rsv->_rsv_start)
278 || (grp_goal + group_first_block > rsv->_rsv_end)))
279 return 0;
280 return 1;
281 }
282
283
284
285
286
287
288
289
290
291
292 static struct ext2_reserve_window_node *
293 search_reserve_window(struct rb_root *root, ext2_fsblk_t goal)
294 {
295 struct rb_node *n = root->rb_node;
296 struct ext2_reserve_window_node *rsv;
297
298 if (!n)
299 return NULL;
300
301 do {
302 rsv = rb_entry(n, struct ext2_reserve_window_node, rsv_node);
303
304 if (goal < rsv->rsv_start)
305 n = n->rb_left;
306 else if (goal > rsv->rsv_end)
307 n = n->rb_right;
308 else
309 return rsv;
310 } while (n);
311
312
313
314
315
316
317 if (rsv->rsv_start > goal) {
318 n = rb_prev(&rsv->rsv_node);
319 rsv = rb_entry(n, struct ext2_reserve_window_node, rsv_node);
320 }
321 return rsv;
322 }
323
324
325
326
327
328
329
330
331 void ext2_rsv_window_add(struct super_block *sb,
332 struct ext2_reserve_window_node *rsv)
333 {
334 struct rb_root *root = &EXT2_SB(sb)->s_rsv_window_root;
335 struct rb_node *node = &rsv->rsv_node;
336 ext2_fsblk_t start = rsv->rsv_start;
337
338 struct rb_node ** p = &root->rb_node;
339 struct rb_node * parent = NULL;
340 struct ext2_reserve_window_node *this;
341
342 while (*p)
343 {
344 parent = *p;
345 this = rb_entry(parent, struct ext2_reserve_window_node, rsv_node);
346
347 if (start < this->rsv_start)
348 p = &(*p)->rb_left;
349 else if (start > this->rsv_end)
350 p = &(*p)->rb_right;
351 else {
352 rsv_window_dump(root, 1);
353 BUG();
354 }
355 }
356
357 rb_link_node(node, parent, p);
358 rb_insert_color(node, root);
359 }
360
361
362
363
364
365
366
367
368
369
370 static void rsv_window_remove(struct super_block *sb,
371 struct ext2_reserve_window_node *rsv)
372 {
373 rsv->rsv_start = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
374 rsv->rsv_end = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
375 rsv->rsv_alloc_hit = 0;
376 rb_erase(&rsv->rsv_node, &EXT2_SB(sb)->s_rsv_window_root);
377 }
378
379
380
381
382
383
384
385 static inline int rsv_is_empty(struct ext2_reserve_window *rsv)
386 {
387
388 return (rsv->_rsv_end == EXT2_RESERVE_WINDOW_NOT_ALLOCATED);
389 }
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412 void ext2_init_block_alloc_info(struct inode *inode)
413 {
414 struct ext2_inode_info *ei = EXT2_I(inode);
415 struct ext2_block_alloc_info *block_i;
416 struct super_block *sb = inode->i_sb;
417
418 block_i = kmalloc(sizeof(*block_i), GFP_NOFS);
419 if (block_i) {
420 struct ext2_reserve_window_node *rsv = &block_i->rsv_window_node;
421
422 rsv->rsv_start = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
423 rsv->rsv_end = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
424
425
426
427
428
429
430 if (!test_opt(sb, RESERVATION))
431 rsv->rsv_goal_size = 0;
432 else
433 rsv->rsv_goal_size = EXT2_DEFAULT_RESERVE_BLOCKS;
434 rsv->rsv_alloc_hit = 0;
435 block_i->last_alloc_logical_block = 0;
436 block_i->last_alloc_physical_block = 0;
437 }
438 ei->i_block_alloc_info = block_i;
439 }
440
441
442
443
444
445
446
447
448
449
450
451
452
453 void ext2_discard_reservation(struct inode *inode)
454 {
455 struct ext2_inode_info *ei = EXT2_I(inode);
456 struct ext2_block_alloc_info *block_i = ei->i_block_alloc_info;
457 struct ext2_reserve_window_node *rsv;
458 spinlock_t *rsv_lock = &EXT2_SB(inode->i_sb)->s_rsv_window_lock;
459
460 if (!block_i)
461 return;
462
463 rsv = &block_i->rsv_window_node;
464 if (!rsv_is_empty(&rsv->rsv_window)) {
465 spin_lock(rsv_lock);
466 if (!rsv_is_empty(&rsv->rsv_window))
467 rsv_window_remove(inode->i_sb, rsv);
468 spin_unlock(rsv_lock);
469 }
470 }
471
472
473
474
475
476
477
478 void ext2_free_blocks (struct inode * inode, unsigned long block,
479 unsigned long count)
480 {
481 struct buffer_head *bitmap_bh = NULL;
482 struct buffer_head * bh2;
483 unsigned long block_group;
484 unsigned long bit;
485 unsigned long i;
486 unsigned long overflow;
487 struct super_block * sb = inode->i_sb;
488 struct ext2_sb_info * sbi = EXT2_SB(sb);
489 struct ext2_group_desc * desc;
490 struct ext2_super_block * es = sbi->s_es;
491 unsigned freed = 0, group_freed;
492
493 if (!ext2_data_block_valid(sbi, block, 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
502 do_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 & SB_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 }
560 error_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
578 static ext2_grpblk_t
579 bitmap_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
602 static ext2_grpblk_t
603 find_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
663 static int
664 ext2_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
699 repeat:
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;
738 fail_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
776 static 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
898 static 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
968 retry:
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
1040 static 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
1091 static ext2_grpblk_t
1092 ext2_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
1181 static 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 int ext2_data_block_valid(struct ext2_sb_info *sbi, ext2_fsblk_t start_blk,
1201 unsigned int count)
1202 {
1203 if ((start_blk <= le32_to_cpu(sbi->s_es->s_first_data_block)) ||
1204 (start_blk + count - 1 < start_blk) ||
1205 (start_blk + count - 1 >= le32_to_cpu(sbi->s_es->s_blocks_count)))
1206 return 0;
1207
1208
1209 if ((start_blk <= sbi->s_sb_block) &&
1210 (start_blk + count - 1 >= sbi->s_sb_block))
1211 return 0;
1212
1213 return 1;
1214 }
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230 ext2_fsblk_t ext2_new_blocks(struct inode *inode, ext2_fsblk_t goal,
1231 unsigned long *count, int *errp)
1232 {
1233 struct buffer_head *bitmap_bh = NULL;
1234 struct buffer_head *gdp_bh;
1235 int group_no;
1236 int goal_group;
1237 ext2_grpblk_t grp_target_blk;
1238 ext2_grpblk_t grp_alloc_blk;
1239 ext2_fsblk_t ret_block;
1240 int bgi;
1241 int performed_allocation = 0;
1242 ext2_grpblk_t free_blocks;
1243 struct super_block *sb;
1244 struct ext2_group_desc *gdp;
1245 struct ext2_super_block *es;
1246 struct ext2_sb_info *sbi;
1247 struct ext2_reserve_window_node *my_rsv = NULL;
1248 struct ext2_block_alloc_info *block_i;
1249 unsigned short windowsz = 0;
1250 unsigned long ngroups;
1251 unsigned long num = *count;
1252 int ret;
1253
1254 *errp = -ENOSPC;
1255 sb = inode->i_sb;
1256
1257
1258
1259
1260 ret = dquot_alloc_block(inode, num);
1261 if (ret) {
1262 *errp = ret;
1263 return 0;
1264 }
1265
1266 sbi = EXT2_SB(sb);
1267 es = EXT2_SB(sb)->s_es;
1268 ext2_debug("goal=%lu.\n", goal);
1269
1270
1271
1272
1273
1274
1275
1276
1277 block_i = EXT2_I(inode)->i_block_alloc_info;
1278 if (block_i) {
1279 windowsz = block_i->rsv_window_node.rsv_goal_size;
1280 if (windowsz > 0)
1281 my_rsv = &block_i->rsv_window_node;
1282 }
1283
1284 if (!ext2_has_free_blocks(sbi)) {
1285 *errp = -ENOSPC;
1286 goto out;
1287 }
1288
1289
1290
1291
1292 if (goal < le32_to_cpu(es->s_first_data_block) ||
1293 goal >= le32_to_cpu(es->s_blocks_count))
1294 goal = le32_to_cpu(es->s_first_data_block);
1295 group_no = (goal - le32_to_cpu(es->s_first_data_block)) /
1296 EXT2_BLOCKS_PER_GROUP(sb);
1297 goal_group = group_no;
1298 retry_alloc:
1299 gdp = ext2_get_group_desc(sb, group_no, &gdp_bh);
1300 if (!gdp)
1301 goto io_error;
1302
1303 free_blocks = le16_to_cpu(gdp->bg_free_blocks_count);
1304
1305
1306
1307
1308 if (my_rsv && (free_blocks < windowsz)
1309 && (free_blocks > 0)
1310 && (rsv_is_empty(&my_rsv->rsv_window)))
1311 my_rsv = NULL;
1312
1313 if (free_blocks > 0) {
1314 grp_target_blk = ((goal - le32_to_cpu(es->s_first_data_block)) %
1315 EXT2_BLOCKS_PER_GROUP(sb));
1316 bitmap_bh = read_block_bitmap(sb, group_no);
1317 if (!bitmap_bh)
1318 goto io_error;
1319 grp_alloc_blk = ext2_try_to_allocate_with_rsv(sb, group_no,
1320 bitmap_bh, grp_target_blk,
1321 my_rsv, &num);
1322 if (grp_alloc_blk >= 0)
1323 goto allocated;
1324 }
1325
1326 ngroups = EXT2_SB(sb)->s_groups_count;
1327 smp_rmb();
1328
1329
1330
1331
1332
1333 for (bgi = 0; bgi < ngroups; bgi++) {
1334 group_no++;
1335 if (group_no >= ngroups)
1336 group_no = 0;
1337 gdp = ext2_get_group_desc(sb, group_no, &gdp_bh);
1338 if (!gdp)
1339 goto io_error;
1340
1341 free_blocks = le16_to_cpu(gdp->bg_free_blocks_count);
1342
1343
1344
1345
1346 if (!free_blocks)
1347 continue;
1348
1349
1350
1351
1352
1353 if (my_rsv && (free_blocks <= (windowsz/2)))
1354 continue;
1355
1356 brelse(bitmap_bh);
1357 bitmap_bh = read_block_bitmap(sb, group_no);
1358 if (!bitmap_bh)
1359 goto io_error;
1360
1361
1362
1363 grp_alloc_blk = ext2_try_to_allocate_with_rsv(sb, group_no,
1364 bitmap_bh, -1, my_rsv, &num);
1365 if (grp_alloc_blk >= 0)
1366 goto allocated;
1367 }
1368
1369
1370
1371
1372
1373
1374
1375 if (my_rsv) {
1376 my_rsv = NULL;
1377 windowsz = 0;
1378 group_no = goal_group;
1379 goto retry_alloc;
1380 }
1381
1382 *errp = -ENOSPC;
1383 goto out;
1384
1385 allocated:
1386
1387 ext2_debug("using block group %d(%d)\n",
1388 group_no, gdp->bg_free_blocks_count);
1389
1390 ret_block = grp_alloc_blk + ext2_group_first_block_no(sb, group_no);
1391
1392 if (in_range(le32_to_cpu(gdp->bg_block_bitmap), ret_block, num) ||
1393 in_range(le32_to_cpu(gdp->bg_inode_bitmap), ret_block, num) ||
1394 in_range(ret_block, le32_to_cpu(gdp->bg_inode_table),
1395 EXT2_SB(sb)->s_itb_per_group) ||
1396 in_range(ret_block + num - 1, le32_to_cpu(gdp->bg_inode_table),
1397 EXT2_SB(sb)->s_itb_per_group)) {
1398 ext2_error(sb, "ext2_new_blocks",
1399 "Allocating block in system zone - "
1400 "blocks from "E2FSBLK", length %lu",
1401 ret_block, num);
1402
1403
1404
1405
1406
1407 goto retry_alloc;
1408 }
1409
1410 performed_allocation = 1;
1411
1412 if (ret_block + num - 1 >= le32_to_cpu(es->s_blocks_count)) {
1413 ext2_error(sb, "ext2_new_blocks",
1414 "block("E2FSBLK") >= blocks count(%d) - "
1415 "block_group = %d, es == %p ", ret_block,
1416 le32_to_cpu(es->s_blocks_count), group_no, es);
1417 goto out;
1418 }
1419
1420 group_adjust_blocks(sb, group_no, gdp, gdp_bh, -num);
1421 percpu_counter_sub(&sbi->s_freeblocks_counter, num);
1422
1423 mark_buffer_dirty(bitmap_bh);
1424 if (sb->s_flags & SB_SYNCHRONOUS)
1425 sync_dirty_buffer(bitmap_bh);
1426
1427 *errp = 0;
1428 brelse(bitmap_bh);
1429 if (num < *count) {
1430 dquot_free_block_nodirty(inode, *count-num);
1431 mark_inode_dirty(inode);
1432 *count = num;
1433 }
1434 return ret_block;
1435
1436 io_error:
1437 *errp = -EIO;
1438 out:
1439
1440
1441
1442 if (!performed_allocation) {
1443 dquot_free_block_nodirty(inode, *count);
1444 mark_inode_dirty(inode);
1445 }
1446 brelse(bitmap_bh);
1447 return 0;
1448 }
1449
1450 ext2_fsblk_t ext2_new_block(struct inode *inode, unsigned long goal, int *errp)
1451 {
1452 unsigned long count = 1;
1453
1454 return ext2_new_blocks(inode, goal, &count, errp);
1455 }
1456
1457 #ifdef EXT2FS_DEBUG
1458
1459 unsigned long ext2_count_free(struct buffer_head *map, unsigned int numchars)
1460 {
1461 return numchars * BITS_PER_BYTE - memweight(map->b_data, numchars);
1462 }
1463
1464 #endif
1465
1466 unsigned long ext2_count_free_blocks (struct super_block * sb)
1467 {
1468 struct ext2_group_desc * desc;
1469 unsigned long desc_count = 0;
1470 int i;
1471 #ifdef EXT2FS_DEBUG
1472 unsigned long bitmap_count, x;
1473 struct ext2_super_block *es;
1474
1475 es = EXT2_SB(sb)->s_es;
1476 desc_count = 0;
1477 bitmap_count = 0;
1478 desc = NULL;
1479 for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
1480 struct buffer_head *bitmap_bh;
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 bitmap_bh = read_block_bitmap(sb, i);
1486 if (!bitmap_bh)
1487 continue;
1488
1489 x = ext2_count_free(bitmap_bh, sb->s_blocksize);
1490 printk ("group %d: stored = %d, counted = %lu\n",
1491 i, le16_to_cpu(desc->bg_free_blocks_count), x);
1492 bitmap_count += x;
1493 brelse(bitmap_bh);
1494 }
1495 printk("ext2_count_free_blocks: stored = %lu, computed = %lu, %lu\n",
1496 (long)le32_to_cpu(es->s_free_blocks_count),
1497 desc_count, bitmap_count);
1498 return bitmap_count;
1499 #else
1500 for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
1501 desc = ext2_get_group_desc (sb, i, NULL);
1502 if (!desc)
1503 continue;
1504 desc_count += le16_to_cpu(desc->bg_free_blocks_count);
1505 }
1506 return desc_count;
1507 #endif
1508 }
1509
1510 static inline int test_root(int a, int b)
1511 {
1512 int num = b;
1513
1514 while (a > num)
1515 num *= b;
1516 return num == a;
1517 }
1518
1519 static int ext2_group_sparse(int group)
1520 {
1521 if (group <= 1)
1522 return 1;
1523 return (test_root(group, 3) || test_root(group, 5) ||
1524 test_root(group, 7));
1525 }
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535 int ext2_bg_has_super(struct super_block *sb, int group)
1536 {
1537 if (EXT2_HAS_RO_COMPAT_FEATURE(sb,EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)&&
1538 !ext2_group_sparse(group))
1539 return 0;
1540 return 1;
1541 }
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552 unsigned long ext2_bg_num_gdb(struct super_block *sb, int group)
1553 {
1554 return ext2_bg_has_super(sb, group) ? EXT2_SB(sb)->s_gdb_count : 0;
1555 }
1556