0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include "ext2.h"
0016 #include <linux/quotaops.h>
0017 #include <linux/slab.h>
0018 #include <linux/sched.h>
0019 #include <linux/cred.h>
0020 #include <linux/buffer_head.h>
0021 #include <linux/capability.h>
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039 #define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1)
0040
0041 struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
0042 unsigned int block_group,
0043 struct buffer_head ** bh)
0044 {
0045 unsigned long group_desc;
0046 unsigned long offset;
0047 struct ext2_group_desc * desc;
0048 struct ext2_sb_info *sbi = EXT2_SB(sb);
0049
0050 if (block_group >= sbi->s_groups_count) {
0051 WARN(1, "block_group >= groups_count - "
0052 "block_group = %d, groups_count = %lu",
0053 block_group, sbi->s_groups_count);
0054
0055 return NULL;
0056 }
0057
0058 group_desc = block_group >> EXT2_DESC_PER_BLOCK_BITS(sb);
0059 offset = block_group & (EXT2_DESC_PER_BLOCK(sb) - 1);
0060 if (!sbi->s_group_desc[group_desc]) {
0061 WARN(1, "Group descriptor not loaded - "
0062 "block_group = %d, group_desc = %lu, desc = %lu",
0063 block_group, group_desc, offset);
0064 return NULL;
0065 }
0066
0067 desc = (struct ext2_group_desc *) sbi->s_group_desc[group_desc]->b_data;
0068 if (bh)
0069 *bh = sbi->s_group_desc[group_desc];
0070 return desc + offset;
0071 }
0072
0073 static int ext2_valid_block_bitmap(struct super_block *sb,
0074 struct ext2_group_desc *desc,
0075 unsigned int block_group,
0076 struct buffer_head *bh)
0077 {
0078 ext2_grpblk_t offset;
0079 ext2_grpblk_t next_zero_bit;
0080 ext2_fsblk_t bitmap_blk;
0081 ext2_fsblk_t group_first_block;
0082
0083 group_first_block = ext2_group_first_block_no(sb, block_group);
0084
0085
0086 bitmap_blk = le32_to_cpu(desc->bg_block_bitmap);
0087 offset = bitmap_blk - group_first_block;
0088 if (!ext2_test_bit(offset, bh->b_data))
0089
0090 goto err_out;
0091
0092
0093 bitmap_blk = le32_to_cpu(desc->bg_inode_bitmap);
0094 offset = bitmap_blk - group_first_block;
0095 if (!ext2_test_bit(offset, bh->b_data))
0096
0097 goto err_out;
0098
0099
0100 bitmap_blk = le32_to_cpu(desc->bg_inode_table);
0101 offset = bitmap_blk - group_first_block;
0102 next_zero_bit = ext2_find_next_zero_bit(bh->b_data,
0103 offset + EXT2_SB(sb)->s_itb_per_group,
0104 offset);
0105 if (next_zero_bit >= offset + EXT2_SB(sb)->s_itb_per_group)
0106
0107 return 1;
0108
0109 err_out:
0110 ext2_error(sb, __func__,
0111 "Invalid block bitmap - "
0112 "block_group = %d, block = %lu",
0113 block_group, bitmap_blk);
0114 return 0;
0115 }
0116
0117
0118
0119
0120
0121
0122
0123 static struct buffer_head *
0124 read_block_bitmap(struct super_block *sb, unsigned int block_group)
0125 {
0126 struct ext2_group_desc * desc;
0127 struct buffer_head * bh = NULL;
0128 ext2_fsblk_t bitmap_blk;
0129
0130 desc = ext2_get_group_desc(sb, block_group, NULL);
0131 if (!desc)
0132 return NULL;
0133 bitmap_blk = le32_to_cpu(desc->bg_block_bitmap);
0134 bh = sb_getblk(sb, bitmap_blk);
0135 if (unlikely(!bh)) {
0136 ext2_error(sb, __func__,
0137 "Cannot read block bitmap - "
0138 "block_group = %d, block_bitmap = %u",
0139 block_group, le32_to_cpu(desc->bg_block_bitmap));
0140 return NULL;
0141 }
0142 if (likely(bh_uptodate_or_lock(bh)))
0143 return bh;
0144
0145 if (bh_submit_read(bh) < 0) {
0146 brelse(bh);
0147 ext2_error(sb, __func__,
0148 "Cannot read block bitmap - "
0149 "block_group = %d, block_bitmap = %u",
0150 block_group, le32_to_cpu(desc->bg_block_bitmap));
0151 return NULL;
0152 }
0153
0154 ext2_valid_block_bitmap(sb, desc, block_group, bh);
0155
0156
0157
0158
0159 return bh;
0160 }
0161
0162 static void group_adjust_blocks(struct super_block *sb, int group_no,
0163 struct ext2_group_desc *desc, struct buffer_head *bh, int count)
0164 {
0165 if (count) {
0166 struct ext2_sb_info *sbi = EXT2_SB(sb);
0167 unsigned free_blocks;
0168
0169 spin_lock(sb_bgl_lock(sbi, group_no));
0170 free_blocks = le16_to_cpu(desc->bg_free_blocks_count);
0171 desc->bg_free_blocks_count = cpu_to_le16(free_blocks + count);
0172 spin_unlock(sb_bgl_lock(sbi, group_no));
0173 mark_buffer_dirty(bh);
0174 }
0175 }
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198 #if 1
0199 static void __rsv_window_dump(struct rb_root *root, int verbose,
0200 const char *fn)
0201 {
0202 struct rb_node *n;
0203 struct ext2_reserve_window_node *rsv, *prev;
0204 int bad;
0205
0206 restart:
0207 n = rb_first(root);
0208 bad = 0;
0209 prev = NULL;
0210
0211 printk("Block Allocation Reservation Windows Map (%s):\n", fn);
0212 while (n) {
0213 rsv = rb_entry(n, struct ext2_reserve_window_node, rsv_node);
0214 if (verbose)
0215 printk("reservation window 0x%p "
0216 "start: %lu, end: %lu\n",
0217 rsv, rsv->rsv_start, rsv->rsv_end);
0218 if (rsv->rsv_start && rsv->rsv_start >= rsv->rsv_end) {
0219 printk("Bad reservation %p (start >= end)\n",
0220 rsv);
0221 bad = 1;
0222 }
0223 if (prev && prev->rsv_end >= rsv->rsv_start) {
0224 printk("Bad reservation %p (prev->end >= start)\n",
0225 rsv);
0226 bad = 1;
0227 }
0228 if (bad) {
0229 if (!verbose) {
0230 printk("Restarting reservation walk in verbose mode\n");
0231 verbose = 1;
0232 goto restart;
0233 }
0234 }
0235 n = rb_next(n);
0236 prev = rsv;
0237 }
0238 printk("Window map complete.\n");
0239 BUG_ON(bad);
0240 }
0241 #define rsv_window_dump(root, verbose) \
0242 __rsv_window_dump((root), (verbose), __func__)
0243 #else
0244 #define rsv_window_dump(root, verbose) do {} while (0)
0245 #endif
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263 static int
0264 goal_in_my_reservation(struct ext2_reserve_window *rsv, ext2_grpblk_t grp_goal,
0265 unsigned int group, struct super_block * sb)
0266 {
0267 ext2_fsblk_t group_first_block, group_last_block;
0268
0269 group_first_block = ext2_group_first_block_no(sb, group);
0270 group_last_block = ext2_group_last_block_no(sb, group);
0271
0272 if ((rsv->_rsv_start > group_last_block) ||
0273 (rsv->_rsv_end < group_first_block))
0274 return 0;
0275 if ((grp_goal >= 0) && ((grp_goal + group_first_block < rsv->_rsv_start)
0276 || (grp_goal + group_first_block > rsv->_rsv_end)))
0277 return 0;
0278 return 1;
0279 }
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290 static struct ext2_reserve_window_node *
0291 search_reserve_window(struct rb_root *root, ext2_fsblk_t goal)
0292 {
0293 struct rb_node *n = root->rb_node;
0294 struct ext2_reserve_window_node *rsv;
0295
0296 if (!n)
0297 return NULL;
0298
0299 do {
0300 rsv = rb_entry(n, struct ext2_reserve_window_node, rsv_node);
0301
0302 if (goal < rsv->rsv_start)
0303 n = n->rb_left;
0304 else if (goal > rsv->rsv_end)
0305 n = n->rb_right;
0306 else
0307 return rsv;
0308 } while (n);
0309
0310
0311
0312
0313
0314
0315 if (rsv->rsv_start > goal) {
0316 n = rb_prev(&rsv->rsv_node);
0317 rsv = rb_entry(n, struct ext2_reserve_window_node, rsv_node);
0318 }
0319 return rsv;
0320 }
0321
0322
0323
0324
0325
0326
0327
0328
0329 void ext2_rsv_window_add(struct super_block *sb,
0330 struct ext2_reserve_window_node *rsv)
0331 {
0332 struct rb_root *root = &EXT2_SB(sb)->s_rsv_window_root;
0333 struct rb_node *node = &rsv->rsv_node;
0334 ext2_fsblk_t start = rsv->rsv_start;
0335
0336 struct rb_node ** p = &root->rb_node;
0337 struct rb_node * parent = NULL;
0338 struct ext2_reserve_window_node *this;
0339
0340 while (*p)
0341 {
0342 parent = *p;
0343 this = rb_entry(parent, struct ext2_reserve_window_node, rsv_node);
0344
0345 if (start < this->rsv_start)
0346 p = &(*p)->rb_left;
0347 else if (start > this->rsv_end)
0348 p = &(*p)->rb_right;
0349 else {
0350 rsv_window_dump(root, 1);
0351 BUG();
0352 }
0353 }
0354
0355 rb_link_node(node, parent, p);
0356 rb_insert_color(node, root);
0357 }
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368 static void rsv_window_remove(struct super_block *sb,
0369 struct ext2_reserve_window_node *rsv)
0370 {
0371 rsv->rsv_start = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
0372 rsv->rsv_end = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
0373 rsv->rsv_alloc_hit = 0;
0374 rb_erase(&rsv->rsv_node, &EXT2_SB(sb)->s_rsv_window_root);
0375 }
0376
0377
0378
0379
0380
0381
0382
0383 static inline int rsv_is_empty(struct ext2_reserve_window *rsv)
0384 {
0385
0386 return (rsv->_rsv_end == EXT2_RESERVE_WINDOW_NOT_ALLOCATED);
0387 }
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410 void ext2_init_block_alloc_info(struct inode *inode)
0411 {
0412 struct ext2_inode_info *ei = EXT2_I(inode);
0413 struct ext2_block_alloc_info *block_i;
0414 struct super_block *sb = inode->i_sb;
0415
0416 block_i = kmalloc(sizeof(*block_i), GFP_NOFS);
0417 if (block_i) {
0418 struct ext2_reserve_window_node *rsv = &block_i->rsv_window_node;
0419
0420 rsv->rsv_start = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
0421 rsv->rsv_end = EXT2_RESERVE_WINDOW_NOT_ALLOCATED;
0422
0423
0424
0425
0426
0427
0428 if (!test_opt(sb, RESERVATION))
0429 rsv->rsv_goal_size = 0;
0430 else
0431 rsv->rsv_goal_size = EXT2_DEFAULT_RESERVE_BLOCKS;
0432 rsv->rsv_alloc_hit = 0;
0433 block_i->last_alloc_logical_block = 0;
0434 block_i->last_alloc_physical_block = 0;
0435 }
0436 ei->i_block_alloc_info = block_i;
0437 }
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450
0451 void ext2_discard_reservation(struct inode *inode)
0452 {
0453 struct ext2_inode_info *ei = EXT2_I(inode);
0454 struct ext2_block_alloc_info *block_i = ei->i_block_alloc_info;
0455 struct ext2_reserve_window_node *rsv;
0456 spinlock_t *rsv_lock = &EXT2_SB(inode->i_sb)->s_rsv_window_lock;
0457
0458 if (!block_i)
0459 return;
0460
0461 rsv = &block_i->rsv_window_node;
0462 if (!rsv_is_empty(&rsv->rsv_window)) {
0463 spin_lock(rsv_lock);
0464 if (!rsv_is_empty(&rsv->rsv_window))
0465 rsv_window_remove(inode->i_sb, rsv);
0466 spin_unlock(rsv_lock);
0467 }
0468 }
0469
0470
0471
0472
0473
0474
0475
0476 void ext2_free_blocks (struct inode * inode, unsigned long block,
0477 unsigned long count)
0478 {
0479 struct buffer_head *bitmap_bh = NULL;
0480 struct buffer_head * bh2;
0481 unsigned long block_group;
0482 unsigned long bit;
0483 unsigned long i;
0484 unsigned long overflow;
0485 struct super_block * sb = inode->i_sb;
0486 struct ext2_sb_info * sbi = EXT2_SB(sb);
0487 struct ext2_group_desc * desc;
0488 struct ext2_super_block * es = sbi->s_es;
0489 unsigned freed = 0, group_freed;
0490
0491 if (!ext2_data_block_valid(sbi, block, count)) {
0492 ext2_error (sb, "ext2_free_blocks",
0493 "Freeing blocks not in datazone - "
0494 "block = %lu, count = %lu", block, count);
0495 goto error_return;
0496 }
0497
0498 ext2_debug ("freeing block(s) %lu-%lu\n", block, block + count - 1);
0499
0500 do_more:
0501 overflow = 0;
0502 block_group = (block - le32_to_cpu(es->s_first_data_block)) /
0503 EXT2_BLOCKS_PER_GROUP(sb);
0504 bit = (block - le32_to_cpu(es->s_first_data_block)) %
0505 EXT2_BLOCKS_PER_GROUP(sb);
0506
0507
0508
0509
0510 if (bit + count > EXT2_BLOCKS_PER_GROUP(sb)) {
0511 overflow = bit + count - EXT2_BLOCKS_PER_GROUP(sb);
0512 count -= overflow;
0513 }
0514 brelse(bitmap_bh);
0515 bitmap_bh = read_block_bitmap(sb, block_group);
0516 if (!bitmap_bh)
0517 goto error_return;
0518
0519 desc = ext2_get_group_desc (sb, block_group, &bh2);
0520 if (!desc)
0521 goto error_return;
0522
0523 if (in_range (le32_to_cpu(desc->bg_block_bitmap), block, count) ||
0524 in_range (le32_to_cpu(desc->bg_inode_bitmap), block, count) ||
0525 in_range (block, le32_to_cpu(desc->bg_inode_table),
0526 sbi->s_itb_per_group) ||
0527 in_range (block + count - 1, le32_to_cpu(desc->bg_inode_table),
0528 sbi->s_itb_per_group)) {
0529 ext2_error (sb, "ext2_free_blocks",
0530 "Freeing blocks in system zones - "
0531 "Block = %lu, count = %lu",
0532 block, count);
0533 goto error_return;
0534 }
0535
0536 for (i = 0, group_freed = 0; i < count; i++) {
0537 if (!ext2_clear_bit_atomic(sb_bgl_lock(sbi, block_group),
0538 bit + i, bitmap_bh->b_data)) {
0539 ext2_error(sb, __func__,
0540 "bit already cleared for block %lu", block + i);
0541 } else {
0542 group_freed++;
0543 }
0544 }
0545
0546 mark_buffer_dirty(bitmap_bh);
0547 if (sb->s_flags & SB_SYNCHRONOUS)
0548 sync_dirty_buffer(bitmap_bh);
0549
0550 group_adjust_blocks(sb, block_group, desc, bh2, group_freed);
0551 freed += group_freed;
0552
0553 if (overflow) {
0554 block += count;
0555 count = overflow;
0556 goto do_more;
0557 }
0558 error_return:
0559 brelse(bitmap_bh);
0560 if (freed) {
0561 percpu_counter_add(&sbi->s_freeblocks_counter, freed);
0562 dquot_free_block_nodirty(inode, freed);
0563 mark_inode_dirty(inode);
0564 }
0565 }
0566
0567
0568
0569
0570
0571
0572
0573
0574
0575
0576 static ext2_grpblk_t
0577 bitmap_search_next_usable_block(ext2_grpblk_t start, struct buffer_head *bh,
0578 ext2_grpblk_t maxblocks)
0579 {
0580 ext2_grpblk_t next;
0581
0582 next = ext2_find_next_zero_bit(bh->b_data, maxblocks, start);
0583 if (next >= maxblocks)
0584 return -1;
0585 return next;
0586 }
0587
0588
0589
0590
0591
0592
0593
0594
0595
0596
0597
0598
0599
0600 static ext2_grpblk_t
0601 find_next_usable_block(int start, struct buffer_head *bh, int maxblocks)
0602 {
0603 ext2_grpblk_t here, next;
0604 char *p, *r;
0605
0606 if (start > 0) {
0607
0608
0609
0610
0611
0612
0613
0614
0615 ext2_grpblk_t end_goal = (start + 63) & ~63;
0616 if (end_goal > maxblocks)
0617 end_goal = maxblocks;
0618 here = ext2_find_next_zero_bit(bh->b_data, end_goal, start);
0619 if (here < end_goal)
0620 return here;
0621 ext2_debug("Bit not found near goal\n");
0622 }
0623
0624 here = start;
0625 if (here < 0)
0626 here = 0;
0627
0628 p = ((char *)bh->b_data) + (here >> 3);
0629 r = memscan(p, 0, ((maxblocks + 7) >> 3) - (here >> 3));
0630 next = (r - ((char *)bh->b_data)) << 3;
0631
0632 if (next < maxblocks && next >= here)
0633 return next;
0634
0635 here = bitmap_search_next_usable_block(here, bh, maxblocks);
0636 return here;
0637 }
0638
0639
0640
0641
0642
0643
0644
0645
0646
0647
0648
0649
0650
0651
0652
0653
0654
0655
0656
0657
0658
0659
0660
0661 static int
0662 ext2_try_to_allocate(struct super_block *sb, int group,
0663 struct buffer_head *bitmap_bh, ext2_grpblk_t grp_goal,
0664 unsigned long *count,
0665 struct ext2_reserve_window *my_rsv)
0666 {
0667 ext2_fsblk_t group_first_block = ext2_group_first_block_no(sb, group);
0668 ext2_fsblk_t group_last_block = ext2_group_last_block_no(sb, group);
0669 ext2_grpblk_t start, end;
0670 unsigned long num = 0;
0671
0672 start = 0;
0673 end = group_last_block - group_first_block + 1;
0674
0675 if (my_rsv) {
0676 if (my_rsv->_rsv_start >= group_first_block)
0677 start = my_rsv->_rsv_start - group_first_block;
0678 if (my_rsv->_rsv_end < group_last_block)
0679 end = my_rsv->_rsv_end - group_first_block + 1;
0680 if (grp_goal < start || grp_goal >= end)
0681 grp_goal = -1;
0682 }
0683 BUG_ON(start > EXT2_BLOCKS_PER_GROUP(sb));
0684
0685 if (grp_goal < 0) {
0686 grp_goal = find_next_usable_block(start, bitmap_bh, end);
0687 if (grp_goal < 0)
0688 goto fail_access;
0689 if (!my_rsv) {
0690 int i;
0691
0692 for (i = 0; i < 7 && grp_goal > start &&
0693 !ext2_test_bit(grp_goal - 1,
0694 bitmap_bh->b_data);
0695 i++, grp_goal--)
0696 ;
0697 }
0698 }
0699
0700 for (; num < *count && grp_goal < end; grp_goal++) {
0701 if (ext2_set_bit_atomic(sb_bgl_lock(EXT2_SB(sb), group),
0702 grp_goal, bitmap_bh->b_data)) {
0703 if (num == 0)
0704 continue;
0705 break;
0706 }
0707 num++;
0708 }
0709
0710 if (num == 0)
0711 goto fail_access;
0712
0713 *count = num;
0714 return grp_goal - num;
0715 fail_access:
0716 return -1;
0717 }
0718
0719
0720
0721
0722
0723
0724
0725
0726
0727
0728
0729
0730
0731
0732
0733
0734
0735
0736
0737
0738
0739
0740
0741
0742
0743
0744
0745
0746
0747
0748
0749
0750
0751 static int find_next_reservable_window(
0752 struct ext2_reserve_window_node *search_head,
0753 struct ext2_reserve_window_node *my_rsv,
0754 struct super_block * sb,
0755 ext2_fsblk_t start_block,
0756 ext2_fsblk_t last_block)
0757 {
0758 struct rb_node *next;
0759 struct ext2_reserve_window_node *rsv, *prev;
0760 ext2_fsblk_t cur;
0761 int size = my_rsv->rsv_goal_size;
0762
0763
0764
0765 cur = start_block;
0766 rsv = search_head;
0767 if (!rsv)
0768 return -1;
0769
0770 while (1) {
0771 if (cur <= rsv->rsv_end)
0772 cur = rsv->rsv_end + 1;
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783 if (cur > last_block)
0784 return -1;
0785
0786 prev = rsv;
0787 next = rb_next(&rsv->rsv_node);
0788 rsv = rb_entry(next,struct ext2_reserve_window_node,rsv_node);
0789
0790
0791
0792
0793
0794 if (!next)
0795 break;
0796
0797 if (cur + size <= rsv->rsv_start) {
0798
0799
0800
0801
0802 break;
0803 }
0804 }
0805
0806
0807
0808
0809
0810
0811
0812
0813
0814
0815
0816 if ((prev != my_rsv) && (!rsv_is_empty(&my_rsv->rsv_window)))
0817 rsv_window_remove(sb, my_rsv);
0818
0819
0820
0821
0822
0823
0824
0825
0826 my_rsv->rsv_start = cur;
0827 my_rsv->rsv_end = cur + size - 1;
0828 my_rsv->rsv_alloc_hit = 0;
0829
0830 if (prev != my_rsv)
0831 ext2_rsv_window_add(sb, my_rsv);
0832
0833 return 0;
0834 }
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873 static int alloc_new_reservation(struct ext2_reserve_window_node *my_rsv,
0874 ext2_grpblk_t grp_goal, struct super_block *sb,
0875 unsigned int group, struct buffer_head *bitmap_bh)
0876 {
0877 struct ext2_reserve_window_node *search_head;
0878 ext2_fsblk_t group_first_block, group_end_block, start_block;
0879 ext2_grpblk_t first_free_block;
0880 struct rb_root *fs_rsv_root = &EXT2_SB(sb)->s_rsv_window_root;
0881 unsigned long size;
0882 int ret;
0883 spinlock_t *rsv_lock = &EXT2_SB(sb)->s_rsv_window_lock;
0884
0885 group_first_block = ext2_group_first_block_no(sb, group);
0886 group_end_block = ext2_group_last_block_no(sb, group);
0887
0888 if (grp_goal < 0)
0889 start_block = group_first_block;
0890 else
0891 start_block = grp_goal + group_first_block;
0892
0893 size = my_rsv->rsv_goal_size;
0894
0895 if (!rsv_is_empty(&my_rsv->rsv_window)) {
0896
0897
0898
0899
0900
0901
0902
0903
0904
0905
0906
0907
0908
0909
0910 if ((my_rsv->rsv_start <= group_end_block) &&
0911 (my_rsv->rsv_end > group_end_block) &&
0912 (start_block >= my_rsv->rsv_start))
0913 return -1;
0914
0915 if ((my_rsv->rsv_alloc_hit >
0916 (my_rsv->rsv_end - my_rsv->rsv_start + 1) / 2)) {
0917
0918
0919
0920
0921
0922
0923 size = size * 2;
0924 if (size > EXT2_MAX_RESERVE_BLOCKS)
0925 size = EXT2_MAX_RESERVE_BLOCKS;
0926 my_rsv->rsv_goal_size= size;
0927 }
0928 }
0929
0930 spin_lock(rsv_lock);
0931
0932
0933
0934 search_head = search_reserve_window(fs_rsv_root, start_block);
0935
0936
0937
0938
0939
0940
0941
0942
0943 retry:
0944 ret = find_next_reservable_window(search_head, my_rsv, sb,
0945 start_block, group_end_block);
0946
0947 if (ret == -1) {
0948 if (!rsv_is_empty(&my_rsv->rsv_window))
0949 rsv_window_remove(sb, my_rsv);
0950 spin_unlock(rsv_lock);
0951 return -1;
0952 }
0953
0954
0955
0956
0957
0958
0959
0960
0961
0962
0963 spin_unlock(rsv_lock);
0964 first_free_block = bitmap_search_next_usable_block(
0965 my_rsv->rsv_start - group_first_block,
0966 bitmap_bh, group_end_block - group_first_block + 1);
0967
0968 if (first_free_block < 0) {
0969
0970
0971
0972
0973 spin_lock(rsv_lock);
0974 if (!rsv_is_empty(&my_rsv->rsv_window))
0975 rsv_window_remove(sb, my_rsv);
0976 spin_unlock(rsv_lock);
0977 return -1;
0978 }
0979
0980 start_block = first_free_block + group_first_block;
0981
0982
0983
0984
0985 if (start_block >= my_rsv->rsv_start && start_block <= my_rsv->rsv_end)
0986 return 0;
0987
0988
0989
0990
0991
0992
0993 search_head = my_rsv;
0994 spin_lock(rsv_lock);
0995 goto retry;
0996 }
0997
0998
0999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015 static void try_to_extend_reservation(struct ext2_reserve_window_node *my_rsv,
1016 struct super_block *sb, int size)
1017 {
1018 struct ext2_reserve_window_node *next_rsv;
1019 struct rb_node *next;
1020 spinlock_t *rsv_lock = &EXT2_SB(sb)->s_rsv_window_lock;
1021
1022 if (!spin_trylock(rsv_lock))
1023 return;
1024
1025 next = rb_next(&my_rsv->rsv_node);
1026
1027 if (!next)
1028 my_rsv->rsv_end += size;
1029 else {
1030 next_rsv = rb_entry(next, struct ext2_reserve_window_node, rsv_node);
1031
1032 if ((next_rsv->rsv_start - my_rsv->rsv_end - 1) >= size)
1033 my_rsv->rsv_end += size;
1034 else
1035 my_rsv->rsv_end = next_rsv->rsv_start - 1;
1036 }
1037 spin_unlock(rsv_lock);
1038 }
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066 static ext2_grpblk_t
1067 ext2_try_to_allocate_with_rsv(struct super_block *sb, unsigned int group,
1068 struct buffer_head *bitmap_bh, ext2_grpblk_t grp_goal,
1069 struct ext2_reserve_window_node * my_rsv,
1070 unsigned long *count)
1071 {
1072 ext2_fsblk_t group_first_block, group_last_block;
1073 ext2_grpblk_t ret = 0;
1074 unsigned long num = *count;
1075
1076
1077
1078
1079
1080
1081
1082 if (my_rsv == NULL) {
1083 return ext2_try_to_allocate(sb, group, bitmap_bh,
1084 grp_goal, count, NULL);
1085 }
1086
1087
1088
1089
1090
1091
1092 group_first_block = ext2_group_first_block_no(sb, group);
1093 group_last_block = ext2_group_last_block_no(sb, group);
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110 while (1) {
1111 if (rsv_is_empty(&my_rsv->rsv_window) || (ret < 0) ||
1112 !goal_in_my_reservation(&my_rsv->rsv_window,
1113 grp_goal, group, sb)) {
1114 if (my_rsv->rsv_goal_size < *count)
1115 my_rsv->rsv_goal_size = *count;
1116 ret = alloc_new_reservation(my_rsv, grp_goal, sb,
1117 group, bitmap_bh);
1118 if (ret < 0)
1119 break;
1120
1121 if (!goal_in_my_reservation(&my_rsv->rsv_window,
1122 grp_goal, group, sb))
1123 grp_goal = -1;
1124 } else if (grp_goal >= 0) {
1125 int curr = my_rsv->rsv_end -
1126 (grp_goal + group_first_block) + 1;
1127
1128 if (curr < *count)
1129 try_to_extend_reservation(my_rsv, sb,
1130 *count - curr);
1131 }
1132
1133 if ((my_rsv->rsv_start > group_last_block) ||
1134 (my_rsv->rsv_end < group_first_block)) {
1135 rsv_window_dump(&EXT2_SB(sb)->s_rsv_window_root, 1);
1136 BUG();
1137 }
1138 ret = ext2_try_to_allocate(sb, group, bitmap_bh, grp_goal,
1139 &num, &my_rsv->rsv_window);
1140 if (ret >= 0) {
1141 my_rsv->rsv_alloc_hit += num;
1142 *count = num;
1143 break;
1144 }
1145 num = *count;
1146 }
1147 return ret;
1148 }
1149
1150
1151
1152
1153
1154
1155
1156 static int ext2_has_free_blocks(struct ext2_sb_info *sbi)
1157 {
1158 ext2_fsblk_t free_blocks, root_blocks;
1159
1160 free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter);
1161 root_blocks = le32_to_cpu(sbi->s_es->s_r_blocks_count);
1162 if (free_blocks < root_blocks + 1 && !capable(CAP_SYS_RESOURCE) &&
1163 !uid_eq(sbi->s_resuid, current_fsuid()) &&
1164 (gid_eq(sbi->s_resgid, GLOBAL_ROOT_GID) ||
1165 !in_group_p (sbi->s_resgid))) {
1166 return 0;
1167 }
1168 return 1;
1169 }
1170
1171
1172
1173
1174
1175 int ext2_data_block_valid(struct ext2_sb_info *sbi, ext2_fsblk_t start_blk,
1176 unsigned int count)
1177 {
1178 if ((start_blk <= le32_to_cpu(sbi->s_es->s_first_data_block)) ||
1179 (start_blk + count - 1 < start_blk) ||
1180 (start_blk + count - 1 >= le32_to_cpu(sbi->s_es->s_blocks_count)))
1181 return 0;
1182
1183
1184 if ((start_blk <= sbi->s_sb_block) &&
1185 (start_blk + count - 1 >= sbi->s_sb_block))
1186 return 0;
1187
1188 return 1;
1189 }
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205 ext2_fsblk_t ext2_new_blocks(struct inode *inode, ext2_fsblk_t goal,
1206 unsigned long *count, int *errp)
1207 {
1208 struct buffer_head *bitmap_bh = NULL;
1209 struct buffer_head *gdp_bh;
1210 int group_no;
1211 int goal_group;
1212 ext2_grpblk_t grp_target_blk;
1213 ext2_grpblk_t grp_alloc_blk;
1214 ext2_fsblk_t ret_block;
1215 int bgi;
1216 int performed_allocation = 0;
1217 ext2_grpblk_t free_blocks;
1218 struct super_block *sb;
1219 struct ext2_group_desc *gdp;
1220 struct ext2_super_block *es;
1221 struct ext2_sb_info *sbi;
1222 struct ext2_reserve_window_node *my_rsv = NULL;
1223 struct ext2_block_alloc_info *block_i;
1224 unsigned short windowsz = 0;
1225 unsigned long ngroups;
1226 unsigned long num = *count;
1227 int ret;
1228
1229 *errp = -ENOSPC;
1230 sb = inode->i_sb;
1231
1232
1233
1234
1235 ret = dquot_alloc_block(inode, num);
1236 if (ret) {
1237 *errp = ret;
1238 return 0;
1239 }
1240
1241 sbi = EXT2_SB(sb);
1242 es = EXT2_SB(sb)->s_es;
1243 ext2_debug("goal=%lu.\n", goal);
1244
1245
1246
1247
1248
1249
1250
1251
1252 block_i = EXT2_I(inode)->i_block_alloc_info;
1253 if (block_i) {
1254 windowsz = block_i->rsv_window_node.rsv_goal_size;
1255 if (windowsz > 0)
1256 my_rsv = &block_i->rsv_window_node;
1257 }
1258
1259 if (!ext2_has_free_blocks(sbi)) {
1260 *errp = -ENOSPC;
1261 goto out;
1262 }
1263
1264
1265
1266
1267 if (goal < le32_to_cpu(es->s_first_data_block) ||
1268 goal >= le32_to_cpu(es->s_blocks_count))
1269 goal = le32_to_cpu(es->s_first_data_block);
1270 group_no = (goal - le32_to_cpu(es->s_first_data_block)) /
1271 EXT2_BLOCKS_PER_GROUP(sb);
1272 goal_group = group_no;
1273 retry_alloc:
1274 gdp = ext2_get_group_desc(sb, group_no, &gdp_bh);
1275 if (!gdp)
1276 goto io_error;
1277
1278 free_blocks = le16_to_cpu(gdp->bg_free_blocks_count);
1279
1280
1281
1282
1283 if (my_rsv && (free_blocks < windowsz)
1284 && (free_blocks > 0)
1285 && (rsv_is_empty(&my_rsv->rsv_window)))
1286 my_rsv = NULL;
1287
1288 if (free_blocks > 0) {
1289 grp_target_blk = ((goal - le32_to_cpu(es->s_first_data_block)) %
1290 EXT2_BLOCKS_PER_GROUP(sb));
1291
1292
1293
1294
1295
1296
1297 brelse(bitmap_bh);
1298 bitmap_bh = read_block_bitmap(sb, group_no);
1299 if (!bitmap_bh)
1300 goto io_error;
1301 grp_alloc_blk = ext2_try_to_allocate_with_rsv(sb, group_no,
1302 bitmap_bh, grp_target_blk,
1303 my_rsv, &num);
1304 if (grp_alloc_blk >= 0)
1305 goto allocated;
1306 }
1307
1308 ngroups = EXT2_SB(sb)->s_groups_count;
1309 smp_rmb();
1310
1311
1312
1313
1314
1315 for (bgi = 0; bgi < ngroups; bgi++) {
1316 group_no++;
1317 if (group_no >= ngroups)
1318 group_no = 0;
1319 gdp = ext2_get_group_desc(sb, group_no, &gdp_bh);
1320 if (!gdp)
1321 goto io_error;
1322
1323 free_blocks = le16_to_cpu(gdp->bg_free_blocks_count);
1324
1325
1326
1327
1328 if (!free_blocks)
1329 continue;
1330
1331
1332
1333
1334
1335 if (my_rsv && (free_blocks <= (windowsz/2)))
1336 continue;
1337
1338 brelse(bitmap_bh);
1339 bitmap_bh = read_block_bitmap(sb, group_no);
1340 if (!bitmap_bh)
1341 goto io_error;
1342
1343
1344
1345 grp_alloc_blk = ext2_try_to_allocate_with_rsv(sb, group_no,
1346 bitmap_bh, -1, my_rsv, &num);
1347 if (grp_alloc_blk >= 0)
1348 goto allocated;
1349 }
1350
1351
1352
1353
1354
1355
1356
1357 if (my_rsv) {
1358 my_rsv = NULL;
1359 windowsz = 0;
1360 group_no = goal_group;
1361 goto retry_alloc;
1362 }
1363
1364 *errp = -ENOSPC;
1365 goto out;
1366
1367 allocated:
1368
1369 ext2_debug("using block group %d(%d)\n",
1370 group_no, gdp->bg_free_blocks_count);
1371
1372 ret_block = grp_alloc_blk + ext2_group_first_block_no(sb, group_no);
1373
1374 if (in_range(le32_to_cpu(gdp->bg_block_bitmap), ret_block, num) ||
1375 in_range(le32_to_cpu(gdp->bg_inode_bitmap), ret_block, num) ||
1376 in_range(ret_block, le32_to_cpu(gdp->bg_inode_table),
1377 EXT2_SB(sb)->s_itb_per_group) ||
1378 in_range(ret_block + num - 1, le32_to_cpu(gdp->bg_inode_table),
1379 EXT2_SB(sb)->s_itb_per_group)) {
1380 ext2_error(sb, "ext2_new_blocks",
1381 "Allocating block in system zone - "
1382 "blocks from "E2FSBLK", length %lu",
1383 ret_block, num);
1384
1385
1386
1387
1388
1389 num = *count;
1390 goto retry_alloc;
1391 }
1392
1393 performed_allocation = 1;
1394
1395 if (ret_block + num - 1 >= le32_to_cpu(es->s_blocks_count)) {
1396 ext2_error(sb, "ext2_new_blocks",
1397 "block("E2FSBLK") >= blocks count(%d) - "
1398 "block_group = %d, es == %p ", ret_block,
1399 le32_to_cpu(es->s_blocks_count), group_no, es);
1400 goto out;
1401 }
1402
1403 group_adjust_blocks(sb, group_no, gdp, gdp_bh, -num);
1404 percpu_counter_sub(&sbi->s_freeblocks_counter, num);
1405
1406 mark_buffer_dirty(bitmap_bh);
1407 if (sb->s_flags & SB_SYNCHRONOUS)
1408 sync_dirty_buffer(bitmap_bh);
1409
1410 *errp = 0;
1411 brelse(bitmap_bh);
1412 if (num < *count) {
1413 dquot_free_block_nodirty(inode, *count-num);
1414 mark_inode_dirty(inode);
1415 *count = num;
1416 }
1417 return ret_block;
1418
1419 io_error:
1420 *errp = -EIO;
1421 out:
1422
1423
1424
1425 if (!performed_allocation) {
1426 dquot_free_block_nodirty(inode, *count);
1427 mark_inode_dirty(inode);
1428 }
1429 brelse(bitmap_bh);
1430 return 0;
1431 }
1432
1433 ext2_fsblk_t ext2_new_block(struct inode *inode, unsigned long goal, int *errp)
1434 {
1435 unsigned long count = 1;
1436
1437 return ext2_new_blocks(inode, goal, &count, errp);
1438 }
1439
1440 #ifdef EXT2FS_DEBUG
1441
1442 unsigned long ext2_count_free(struct buffer_head *map, unsigned int numchars)
1443 {
1444 return numchars * BITS_PER_BYTE - memweight(map->b_data, numchars);
1445 }
1446
1447 #endif
1448
1449 unsigned long ext2_count_free_blocks (struct super_block * sb)
1450 {
1451 struct ext2_group_desc * desc;
1452 unsigned long desc_count = 0;
1453 int i;
1454 #ifdef EXT2FS_DEBUG
1455 unsigned long bitmap_count, x;
1456 struct ext2_super_block *es;
1457
1458 es = EXT2_SB(sb)->s_es;
1459 desc_count = 0;
1460 bitmap_count = 0;
1461 desc = NULL;
1462 for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
1463 struct buffer_head *bitmap_bh;
1464 desc = ext2_get_group_desc (sb, i, NULL);
1465 if (!desc)
1466 continue;
1467 desc_count += le16_to_cpu(desc->bg_free_blocks_count);
1468 bitmap_bh = read_block_bitmap(sb, i);
1469 if (!bitmap_bh)
1470 continue;
1471
1472 x = ext2_count_free(bitmap_bh, sb->s_blocksize);
1473 printk ("group %d: stored = %d, counted = %lu\n",
1474 i, le16_to_cpu(desc->bg_free_blocks_count), x);
1475 bitmap_count += x;
1476 brelse(bitmap_bh);
1477 }
1478 printk("ext2_count_free_blocks: stored = %lu, computed = %lu, %lu\n",
1479 (long)le32_to_cpu(es->s_free_blocks_count),
1480 desc_count, bitmap_count);
1481 return bitmap_count;
1482 #else
1483 for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
1484 desc = ext2_get_group_desc (sb, i, NULL);
1485 if (!desc)
1486 continue;
1487 desc_count += le16_to_cpu(desc->bg_free_blocks_count);
1488 }
1489 return desc_count;
1490 #endif
1491 }
1492
1493 static inline int test_root(int a, int b)
1494 {
1495 int num = b;
1496
1497 while (a > num)
1498 num *= b;
1499 return num == a;
1500 }
1501
1502 static int ext2_group_sparse(int group)
1503 {
1504 if (group <= 1)
1505 return 1;
1506 return (test_root(group, 3) || test_root(group, 5) ||
1507 test_root(group, 7));
1508 }
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518 int ext2_bg_has_super(struct super_block *sb, int group)
1519 {
1520 if (EXT2_HAS_RO_COMPAT_FEATURE(sb,EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER)&&
1521 !ext2_group_sparse(group))
1522 return 0;
1523 return 1;
1524 }
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535 unsigned long ext2_bg_num_gdb(struct super_block *sb, int group)
1536 {
1537 return ext2_bg_has_super(sb, group) ? EXT2_SB(sb)->s_gdb_count : 0;
1538 }
1539