diff options
Diffstat (limited to 'fs/ext4/ialloc.c')
| -rw-r--r-- | fs/ext4/ialloc.c | 330 |
1 files changed, 200 insertions, 130 deletions
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 08cac9fcace2..4fb86a0061d0 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c | |||
| @@ -74,17 +74,17 @@ unsigned ext4_init_inode_bitmap(struct super_block *sb, struct buffer_head *bh, | |||
| 74 | /* If checksum is bad mark all blocks and inodes use to prevent | 74 | /* If checksum is bad mark all blocks and inodes use to prevent |
| 75 | * allocation, essentially implementing a per-group read-only flag. */ | 75 | * allocation, essentially implementing a per-group read-only flag. */ |
| 76 | if (!ext4_group_desc_csum_verify(sbi, block_group, gdp)) { | 76 | if (!ext4_group_desc_csum_verify(sbi, block_group, gdp)) { |
| 77 | ext4_error(sb, __func__, "Checksum bad for group %lu\n", | 77 | ext4_error(sb, __func__, "Checksum bad for group %u", |
| 78 | block_group); | 78 | block_group); |
| 79 | gdp->bg_free_blocks_count = 0; | 79 | ext4_free_blks_set(sb, gdp, 0); |
| 80 | gdp->bg_free_inodes_count = 0; | 80 | ext4_free_inodes_set(sb, gdp, 0); |
| 81 | gdp->bg_itable_unused = 0; | 81 | ext4_itable_unused_set(sb, gdp, 0); |
| 82 | memset(bh->b_data, 0xff, sb->s_blocksize); | 82 | memset(bh->b_data, 0xff, sb->s_blocksize); |
| 83 | return 0; | 83 | return 0; |
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | memset(bh->b_data, 0, (EXT4_INODES_PER_GROUP(sb) + 7) / 8); | 86 | memset(bh->b_data, 0, (EXT4_INODES_PER_GROUP(sb) + 7) / 8); |
| 87 | mark_bitmap_end(EXT4_INODES_PER_GROUP(sb), EXT4_BLOCKS_PER_GROUP(sb), | 87 | mark_bitmap_end(EXT4_INODES_PER_GROUP(sb), sb->s_blocksize * 8, |
| 88 | bh->b_data); | 88 | bh->b_data); |
| 89 | 89 | ||
| 90 | return EXT4_INODES_PER_GROUP(sb); | 90 | return EXT4_INODES_PER_GROUP(sb); |
| @@ -111,29 +111,49 @@ ext4_read_inode_bitmap(struct super_block *sb, ext4_group_t block_group) | |||
| 111 | if (unlikely(!bh)) { | 111 | if (unlikely(!bh)) { |
| 112 | ext4_error(sb, __func__, | 112 | ext4_error(sb, __func__, |
| 113 | "Cannot read inode bitmap - " | 113 | "Cannot read inode bitmap - " |
| 114 | "block_group = %lu, inode_bitmap = %llu", | 114 | "block_group = %u, inode_bitmap = %llu", |
| 115 | block_group, bitmap_blk); | 115 | block_group, bitmap_blk); |
| 116 | return NULL; | 116 | return NULL; |
| 117 | } | 117 | } |
| 118 | if (buffer_uptodate(bh) && | 118 | if (bitmap_uptodate(bh)) |
| 119 | !(desc->bg_flags & cpu_to_le16(EXT4_BG_INODE_UNINIT))) | ||
| 120 | return bh; | 119 | return bh; |
| 121 | 120 | ||
| 122 | lock_buffer(bh); | 121 | lock_buffer(bh); |
| 122 | if (bitmap_uptodate(bh)) { | ||
| 123 | unlock_buffer(bh); | ||
| 124 | return bh; | ||
| 125 | } | ||
| 123 | spin_lock(sb_bgl_lock(EXT4_SB(sb), block_group)); | 126 | spin_lock(sb_bgl_lock(EXT4_SB(sb), block_group)); |
| 124 | if (desc->bg_flags & cpu_to_le16(EXT4_BG_INODE_UNINIT)) { | 127 | if (desc->bg_flags & cpu_to_le16(EXT4_BG_INODE_UNINIT)) { |
| 125 | ext4_init_inode_bitmap(sb, bh, block_group, desc); | 128 | ext4_init_inode_bitmap(sb, bh, block_group, desc); |
| 129 | set_bitmap_uptodate(bh); | ||
| 126 | set_buffer_uptodate(bh); | 130 | set_buffer_uptodate(bh); |
| 127 | unlock_buffer(bh); | ||
| 128 | spin_unlock(sb_bgl_lock(EXT4_SB(sb), block_group)); | 131 | spin_unlock(sb_bgl_lock(EXT4_SB(sb), block_group)); |
| 132 | unlock_buffer(bh); | ||
| 129 | return bh; | 133 | return bh; |
| 130 | } | 134 | } |
| 131 | spin_unlock(sb_bgl_lock(EXT4_SB(sb), block_group)); | 135 | spin_unlock(sb_bgl_lock(EXT4_SB(sb), block_group)); |
| 136 | if (buffer_uptodate(bh)) { | ||
| 137 | /* | ||
| 138 | * if not uninit if bh is uptodate, | ||
| 139 | * bitmap is also uptodate | ||
| 140 | */ | ||
| 141 | set_bitmap_uptodate(bh); | ||
| 142 | unlock_buffer(bh); | ||
| 143 | return bh; | ||
| 144 | } | ||
| 145 | /* | ||
| 146 | * submit the buffer_head for read. We can | ||
| 147 | * safely mark the bitmap as uptodate now. | ||
| 148 | * We do it here so the bitmap uptodate bit | ||
| 149 | * get set with buffer lock held. | ||
| 150 | */ | ||
| 151 | set_bitmap_uptodate(bh); | ||
| 132 | if (bh_submit_read(bh) < 0) { | 152 | if (bh_submit_read(bh) < 0) { |
| 133 | put_bh(bh); | 153 | put_bh(bh); |
| 134 | ext4_error(sb, __func__, | 154 | ext4_error(sb, __func__, |
| 135 | "Cannot read inode bitmap - " | 155 | "Cannot read inode bitmap - " |
| 136 | "block_group = %lu, inode_bitmap = %llu", | 156 | "block_group = %u, inode_bitmap = %llu", |
| 137 | block_group, bitmap_blk); | 157 | block_group, bitmap_blk); |
| 138 | return NULL; | 158 | return NULL; |
| 139 | } | 159 | } |
| @@ -168,7 +188,7 @@ void ext4_free_inode(handle_t *handle, struct inode *inode) | |||
| 168 | struct ext4_group_desc *gdp; | 188 | struct ext4_group_desc *gdp; |
| 169 | struct ext4_super_block *es; | 189 | struct ext4_super_block *es; |
| 170 | struct ext4_sb_info *sbi; | 190 | struct ext4_sb_info *sbi; |
| 171 | int fatal = 0, err; | 191 | int fatal = 0, err, count; |
| 172 | ext4_group_t flex_group; | 192 | ext4_group_t flex_group; |
| 173 | 193 | ||
| 174 | if (atomic_read(&inode->i_count) > 1) { | 194 | if (atomic_read(&inode->i_count) > 1) { |
| @@ -190,6 +210,11 @@ void ext4_free_inode(handle_t *handle, struct inode *inode) | |||
| 190 | 210 | ||
| 191 | ino = inode->i_ino; | 211 | ino = inode->i_ino; |
| 192 | ext4_debug("freeing inode %lu\n", ino); | 212 | ext4_debug("freeing inode %lu\n", ino); |
| 213 | trace_mark(ext4_free_inode, | ||
| 214 | "dev %s ino %lu mode %d uid %lu gid %lu bocks %llu", | ||
| 215 | sb->s_id, inode->i_ino, inode->i_mode, | ||
| 216 | (unsigned long) inode->i_uid, (unsigned long) inode->i_gid, | ||
| 217 | (unsigned long long) inode->i_blocks); | ||
| 193 | 218 | ||
| 194 | /* | 219 | /* |
| 195 | * Note: we must free any quota before locking the superblock, | 220 | * Note: we must free any quota before locking the superblock, |
| @@ -236,9 +261,12 @@ void ext4_free_inode(handle_t *handle, struct inode *inode) | |||
| 236 | 261 | ||
| 237 | if (gdp) { | 262 | if (gdp) { |
| 238 | spin_lock(sb_bgl_lock(sbi, block_group)); | 263 | spin_lock(sb_bgl_lock(sbi, block_group)); |
| 239 | le16_add_cpu(&gdp->bg_free_inodes_count, 1); | 264 | count = ext4_free_inodes_count(sb, gdp) + 1; |
| 240 | if (is_directory) | 265 | ext4_free_inodes_set(sb, gdp, count); |
| 241 | le16_add_cpu(&gdp->bg_used_dirs_count, -1); | 266 | if (is_directory) { |
| 267 | count = ext4_used_dirs_count(sb, gdp) - 1; | ||
| 268 | ext4_used_dirs_set(sb, gdp, count); | ||
| 269 | } | ||
| 242 | gdp->bg_checksum = ext4_group_desc_csum(sbi, | 270 | gdp->bg_checksum = ext4_group_desc_csum(sbi, |
| 243 | block_group, gdp); | 271 | block_group, gdp); |
| 244 | spin_unlock(sb_bgl_lock(sbi, block_group)); | 272 | spin_unlock(sb_bgl_lock(sbi, block_group)); |
| @@ -253,12 +281,12 @@ void ext4_free_inode(handle_t *handle, struct inode *inode) | |||
| 253 | spin_unlock(sb_bgl_lock(sbi, flex_group)); | 281 | spin_unlock(sb_bgl_lock(sbi, flex_group)); |
| 254 | } | 282 | } |
| 255 | } | 283 | } |
| 256 | BUFFER_TRACE(bh2, "call ext4_journal_dirty_metadata"); | 284 | BUFFER_TRACE(bh2, "call ext4_handle_dirty_metadata"); |
| 257 | err = ext4_journal_dirty_metadata(handle, bh2); | 285 | err = ext4_handle_dirty_metadata(handle, NULL, bh2); |
| 258 | if (!fatal) fatal = err; | 286 | if (!fatal) fatal = err; |
| 259 | } | 287 | } |
| 260 | BUFFER_TRACE(bitmap_bh, "call ext4_journal_dirty_metadata"); | 288 | BUFFER_TRACE(bitmap_bh, "call ext4_handle_dirty_metadata"); |
| 261 | err = ext4_journal_dirty_metadata(handle, bitmap_bh); | 289 | err = ext4_handle_dirty_metadata(handle, NULL, bitmap_bh); |
| 262 | if (!fatal) | 290 | if (!fatal) |
| 263 | fatal = err; | 291 | fatal = err; |
| 264 | sb->s_dirt = 1; | 292 | sb->s_dirt = 1; |
| @@ -291,13 +319,13 @@ static int find_group_dir(struct super_block *sb, struct inode *parent, | |||
| 291 | 319 | ||
| 292 | for (group = 0; group < ngroups; group++) { | 320 | for (group = 0; group < ngroups; group++) { |
| 293 | desc = ext4_get_group_desc(sb, group, NULL); | 321 | desc = ext4_get_group_desc(sb, group, NULL); |
| 294 | if (!desc || !desc->bg_free_inodes_count) | 322 | if (!desc || !ext4_free_inodes_count(sb, desc)) |
| 295 | continue; | 323 | continue; |
| 296 | if (le16_to_cpu(desc->bg_free_inodes_count) < avefreei) | 324 | if (ext4_free_inodes_count(sb, desc) < avefreei) |
| 297 | continue; | 325 | continue; |
| 298 | if (!best_desc || | 326 | if (!best_desc || |
| 299 | (le16_to_cpu(desc->bg_free_blocks_count) > | 327 | (ext4_free_blks_count(sb, desc) > |
| 300 | le16_to_cpu(best_desc->bg_free_blocks_count))) { | 328 | ext4_free_blks_count(sb, best_desc))) { |
| 301 | *best_group = group; | 329 | *best_group = group; |
| 302 | best_desc = desc; | 330 | best_desc = desc; |
| 303 | ret = 0; | 331 | ret = 0; |
| @@ -369,7 +397,7 @@ found_flexbg: | |||
| 369 | for (i = best_flex * flex_size; i < ngroups && | 397 | for (i = best_flex * flex_size; i < ngroups && |
| 370 | i < (best_flex + 1) * flex_size; i++) { | 398 | i < (best_flex + 1) * flex_size; i++) { |
| 371 | desc = ext4_get_group_desc(sb, i, &bh); | 399 | desc = ext4_get_group_desc(sb, i, &bh); |
| 372 | if (le16_to_cpu(desc->bg_free_inodes_count)) { | 400 | if (ext4_free_inodes_count(sb, desc)) { |
| 373 | *best_group = i; | 401 | *best_group = i; |
| 374 | goto out; | 402 | goto out; |
| 375 | } | 403 | } |
| @@ -443,17 +471,17 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent, | |||
| 443 | for (i = 0; i < ngroups; i++) { | 471 | for (i = 0; i < ngroups; i++) { |
| 444 | grp = (parent_group + i) % ngroups; | 472 | grp = (parent_group + i) % ngroups; |
| 445 | desc = ext4_get_group_desc(sb, grp, NULL); | 473 | desc = ext4_get_group_desc(sb, grp, NULL); |
| 446 | if (!desc || !desc->bg_free_inodes_count) | 474 | if (!desc || !ext4_free_inodes_count(sb, desc)) |
| 447 | continue; | 475 | continue; |
| 448 | if (le16_to_cpu(desc->bg_used_dirs_count) >= best_ndir) | 476 | if (ext4_used_dirs_count(sb, desc) >= best_ndir) |
| 449 | continue; | 477 | continue; |
| 450 | if (le16_to_cpu(desc->bg_free_inodes_count) < avefreei) | 478 | if (ext4_free_inodes_count(sb, desc) < avefreei) |
| 451 | continue; | 479 | continue; |
| 452 | if (le16_to_cpu(desc->bg_free_blocks_count) < avefreeb) | 480 | if (ext4_free_blks_count(sb, desc) < avefreeb) |
| 453 | continue; | 481 | continue; |
| 454 | *group = grp; | 482 | *group = grp; |
| 455 | ret = 0; | 483 | ret = 0; |
| 456 | best_ndir = le16_to_cpu(desc->bg_used_dirs_count); | 484 | best_ndir = ext4_used_dirs_count(sb, desc); |
| 457 | } | 485 | } |
| 458 | if (ret == 0) | 486 | if (ret == 0) |
| 459 | return ret; | 487 | return ret; |
| @@ -479,13 +507,13 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent, | |||
| 479 | for (i = 0; i < ngroups; i++) { | 507 | for (i = 0; i < ngroups; i++) { |
| 480 | *group = (parent_group + i) % ngroups; | 508 | *group = (parent_group + i) % ngroups; |
| 481 | desc = ext4_get_group_desc(sb, *group, NULL); | 509 | desc = ext4_get_group_desc(sb, *group, NULL); |
| 482 | if (!desc || !desc->bg_free_inodes_count) | 510 | if (!desc || !ext4_free_inodes_count(sb, desc)) |
| 483 | continue; | 511 | continue; |
| 484 | if (le16_to_cpu(desc->bg_used_dirs_count) >= max_dirs) | 512 | if (ext4_used_dirs_count(sb, desc) >= max_dirs) |
| 485 | continue; | 513 | continue; |
| 486 | if (le16_to_cpu(desc->bg_free_inodes_count) < min_inodes) | 514 | if (ext4_free_inodes_count(sb, desc) < min_inodes) |
| 487 | continue; | 515 | continue; |
| 488 | if (le16_to_cpu(desc->bg_free_blocks_count) < min_blocks) | 516 | if (ext4_free_blks_count(sb, desc) < min_blocks) |
| 489 | continue; | 517 | continue; |
| 490 | return 0; | 518 | return 0; |
| 491 | } | 519 | } |
| @@ -494,8 +522,8 @@ fallback: | |||
| 494 | for (i = 0; i < ngroups; i++) { | 522 | for (i = 0; i < ngroups; i++) { |
| 495 | *group = (parent_group + i) % ngroups; | 523 | *group = (parent_group + i) % ngroups; |
| 496 | desc = ext4_get_group_desc(sb, *group, NULL); | 524 | desc = ext4_get_group_desc(sb, *group, NULL); |
| 497 | if (desc && desc->bg_free_inodes_count && | 525 | if (desc && ext4_free_inodes_count(sb, desc) && |
| 498 | le16_to_cpu(desc->bg_free_inodes_count) >= avefreei) | 526 | ext4_free_inodes_count(sb, desc) >= avefreei) |
| 499 | return 0; | 527 | return 0; |
| 500 | } | 528 | } |
| 501 | 529 | ||
| @@ -524,8 +552,8 @@ static int find_group_other(struct super_block *sb, struct inode *parent, | |||
| 524 | */ | 552 | */ |
| 525 | *group = parent_group; | 553 | *group = parent_group; |
| 526 | desc = ext4_get_group_desc(sb, *group, NULL); | 554 | desc = ext4_get_group_desc(sb, *group, NULL); |
| 527 | if (desc && le16_to_cpu(desc->bg_free_inodes_count) && | 555 | if (desc && ext4_free_inodes_count(sb, desc) && |
| 528 | le16_to_cpu(desc->bg_free_blocks_count)) | 556 | ext4_free_blks_count(sb, desc)) |
| 529 | return 0; | 557 | return 0; |
| 530 | 558 | ||
| 531 | /* | 559 | /* |
| @@ -548,8 +576,8 @@ static int find_group_other(struct super_block *sb, struct inode *parent, | |||
| 548 | if (*group >= ngroups) | 576 | if (*group >= ngroups) |
| 549 | *group -= ngroups; | 577 | *group -= ngroups; |
| 550 | desc = ext4_get_group_desc(sb, *group, NULL); | 578 | desc = ext4_get_group_desc(sb, *group, NULL); |
| 551 | if (desc && le16_to_cpu(desc->bg_free_inodes_count) && | 579 | if (desc && ext4_free_inodes_count(sb, desc) && |
| 552 | le16_to_cpu(desc->bg_free_blocks_count)) | 580 | ext4_free_blks_count(sb, desc)) |
| 553 | return 0; | 581 | return 0; |
| 554 | } | 582 | } |
| 555 | 583 | ||
| @@ -562,7 +590,7 @@ static int find_group_other(struct super_block *sb, struct inode *parent, | |||
| 562 | if (++*group >= ngroups) | 590 | if (++*group >= ngroups) |
| 563 | *group = 0; | 591 | *group = 0; |
| 564 | desc = ext4_get_group_desc(sb, *group, NULL); | 592 | desc = ext4_get_group_desc(sb, *group, NULL); |
| 565 | if (desc && le16_to_cpu(desc->bg_free_inodes_count)) | 593 | if (desc && ext4_free_inodes_count(sb, desc)) |
| 566 | return 0; | 594 | return 0; |
| 567 | } | 595 | } |
| 568 | 596 | ||
| @@ -570,6 +598,79 @@ static int find_group_other(struct super_block *sb, struct inode *parent, | |||
| 570 | } | 598 | } |
| 571 | 599 | ||
| 572 | /* | 600 | /* |
| 601 | * claim the inode from the inode bitmap. If the group | ||
| 602 | * is uninit we need to take the groups's sb_bgl_lock | ||
| 603 | * and clear the uninit flag. The inode bitmap update | ||
| 604 | * and group desc uninit flag clear should be done | ||
| 605 | * after holding sb_bgl_lock so that ext4_read_inode_bitmap | ||
| 606 | * doesn't race with the ext4_claim_inode | ||
| 607 | */ | ||
| 608 | static int ext4_claim_inode(struct super_block *sb, | ||
| 609 | struct buffer_head *inode_bitmap_bh, | ||
| 610 | unsigned long ino, ext4_group_t group, int mode) | ||
| 611 | { | ||
| 612 | int free = 0, retval = 0, count; | ||
| 613 | struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
| 614 | struct ext4_group_desc *gdp = ext4_get_group_desc(sb, group, NULL); | ||
| 615 | |||
| 616 | spin_lock(sb_bgl_lock(sbi, group)); | ||
| 617 | if (ext4_set_bit(ino, inode_bitmap_bh->b_data)) { | ||
| 618 | /* not a free inode */ | ||
| 619 | retval = 1; | ||
| 620 | goto err_ret; | ||
| 621 | } | ||
| 622 | ino++; | ||
| 623 | if ((group == 0 && ino < EXT4_FIRST_INO(sb)) || | ||
| 624 | ino > EXT4_INODES_PER_GROUP(sb)) { | ||
| 625 | spin_unlock(sb_bgl_lock(sbi, group)); | ||
| 626 | ext4_error(sb, __func__, | ||
| 627 | "reserved inode or inode > inodes count - " | ||
| 628 | "block_group = %u, inode=%lu", group, | ||
| 629 | ino + group * EXT4_INODES_PER_GROUP(sb)); | ||
| 630 | return 1; | ||
| 631 | } | ||
| 632 | /* If we didn't allocate from within the initialized part of the inode | ||
| 633 | * table then we need to initialize up to this inode. */ | ||
| 634 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) { | ||
| 635 | |||
| 636 | if (gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_UNINIT)) { | ||
| 637 | gdp->bg_flags &= cpu_to_le16(~EXT4_BG_INODE_UNINIT); | ||
| 638 | /* When marking the block group with | ||
| 639 | * ~EXT4_BG_INODE_UNINIT we don't want to depend | ||
| 640 | * on the value of bg_itable_unused even though | ||
| 641 | * mke2fs could have initialized the same for us. | ||
| 642 | * Instead we calculated the value below | ||
| 643 | */ | ||
| 644 | |||
| 645 | free = 0; | ||
| 646 | } else { | ||
| 647 | free = EXT4_INODES_PER_GROUP(sb) - | ||
| 648 | ext4_itable_unused_count(sb, gdp); | ||
| 649 | } | ||
| 650 | |||
| 651 | /* | ||
| 652 | * Check the relative inode number against the last used | ||
| 653 | * relative inode number in this group. if it is greater | ||
| 654 | * we need to update the bg_itable_unused count | ||
| 655 | * | ||
| 656 | */ | ||
| 657 | if (ino > free) | ||
| 658 | ext4_itable_unused_set(sb, gdp, | ||
| 659 | (EXT4_INODES_PER_GROUP(sb) - ino)); | ||
| 660 | } | ||
| 661 | count = ext4_free_inodes_count(sb, gdp) - 1; | ||
| 662 | ext4_free_inodes_set(sb, gdp, count); | ||
| 663 | if (S_ISDIR(mode)) { | ||
| 664 | count = ext4_used_dirs_count(sb, gdp) + 1; | ||
| 665 | ext4_used_dirs_set(sb, gdp, count); | ||
| 666 | } | ||
| 667 | gdp->bg_checksum = ext4_group_desc_csum(sbi, group, gdp); | ||
| 668 | err_ret: | ||
| 669 | spin_unlock(sb_bgl_lock(sbi, group)); | ||
| 670 | return retval; | ||
| 671 | } | ||
| 672 | |||
| 673 | /* | ||
| 573 | * There are two policies for allocating an inode. If the new inode is | 674 | * There are two policies for allocating an inode. If the new inode is |
| 574 | * a directory, then a forward search is made for a block group with both | 675 | * a directory, then a forward search is made for a block group with both |
| 575 | * free space and a low directory-to-inode ratio; if that fails, then of | 676 | * free space and a low directory-to-inode ratio; if that fails, then of |
| @@ -582,8 +683,8 @@ static int find_group_other(struct super_block *sb, struct inode *parent, | |||
| 582 | struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode) | 683 | struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode) |
| 583 | { | 684 | { |
| 584 | struct super_block *sb; | 685 | struct super_block *sb; |
| 585 | struct buffer_head *bitmap_bh = NULL; | 686 | struct buffer_head *inode_bitmap_bh = NULL; |
| 586 | struct buffer_head *bh2; | 687 | struct buffer_head *group_desc_bh; |
| 587 | ext4_group_t group = 0; | 688 | ext4_group_t group = 0; |
| 588 | unsigned long ino = 0; | 689 | unsigned long ino = 0; |
| 589 | struct inode *inode; | 690 | struct inode *inode; |
| @@ -602,6 +703,8 @@ struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode) | |||
| 602 | return ERR_PTR(-EPERM); | 703 | return ERR_PTR(-EPERM); |
| 603 | 704 | ||
| 604 | sb = dir->i_sb; | 705 | sb = dir->i_sb; |
| 706 | trace_mark(ext4_request_inode, "dev %s dir %lu mode %d", sb->s_id, | ||
| 707 | dir->i_ino, mode); | ||
| 605 | inode = new_inode(sb); | 708 | inode = new_inode(sb); |
| 606 | if (!inode) | 709 | if (!inode) |
| 607 | return ERR_PTR(-ENOMEM); | 710 | return ERR_PTR(-ENOMEM); |
| @@ -631,40 +734,52 @@ got_group: | |||
| 631 | for (i = 0; i < sbi->s_groups_count; i++) { | 734 | for (i = 0; i < sbi->s_groups_count; i++) { |
| 632 | err = -EIO; | 735 | err = -EIO; |
| 633 | 736 | ||
| 634 | gdp = ext4_get_group_desc(sb, group, &bh2); | 737 | gdp = ext4_get_group_desc(sb, group, &group_desc_bh); |
| 635 | if (!gdp) | 738 | if (!gdp) |
| 636 | goto fail; | 739 | goto fail; |
| 637 | 740 | ||
| 638 | brelse(bitmap_bh); | 741 | brelse(inode_bitmap_bh); |
| 639 | bitmap_bh = ext4_read_inode_bitmap(sb, group); | 742 | inode_bitmap_bh = ext4_read_inode_bitmap(sb, group); |
| 640 | if (!bitmap_bh) | 743 | if (!inode_bitmap_bh) |
| 641 | goto fail; | 744 | goto fail; |
| 642 | 745 | ||
| 643 | ino = 0; | 746 | ino = 0; |
| 644 | 747 | ||
| 645 | repeat_in_this_group: | 748 | repeat_in_this_group: |
| 646 | ino = ext4_find_next_zero_bit((unsigned long *) | 749 | ino = ext4_find_next_zero_bit((unsigned long *) |
| 647 | bitmap_bh->b_data, EXT4_INODES_PER_GROUP(sb), ino); | 750 | inode_bitmap_bh->b_data, |
| 751 | EXT4_INODES_PER_GROUP(sb), ino); | ||
| 752 | |||
| 648 | if (ino < EXT4_INODES_PER_GROUP(sb)) { | 753 | if (ino < EXT4_INODES_PER_GROUP(sb)) { |
| 649 | 754 | ||
| 650 | BUFFER_TRACE(bitmap_bh, "get_write_access"); | 755 | BUFFER_TRACE(inode_bitmap_bh, "get_write_access"); |
| 651 | err = ext4_journal_get_write_access(handle, bitmap_bh); | 756 | err = ext4_journal_get_write_access(handle, |
| 757 | inode_bitmap_bh); | ||
| 652 | if (err) | 758 | if (err) |
| 653 | goto fail; | 759 | goto fail; |
| 654 | 760 | ||
| 655 | if (!ext4_set_bit_atomic(sb_bgl_lock(sbi, group), | 761 | BUFFER_TRACE(group_desc_bh, "get_write_access"); |
| 656 | ino, bitmap_bh->b_data)) { | 762 | err = ext4_journal_get_write_access(handle, |
| 763 | group_desc_bh); | ||
| 764 | if (err) | ||
| 765 | goto fail; | ||
| 766 | if (!ext4_claim_inode(sb, inode_bitmap_bh, | ||
| 767 | ino, group, mode)) { | ||
| 657 | /* we won it */ | 768 | /* we won it */ |
| 658 | BUFFER_TRACE(bitmap_bh, | 769 | BUFFER_TRACE(inode_bitmap_bh, |
| 659 | "call ext4_journal_dirty_metadata"); | 770 | "call ext4_handle_dirty_metadata"); |
| 660 | err = ext4_journal_dirty_metadata(handle, | 771 | err = ext4_handle_dirty_metadata(handle, |
| 661 | bitmap_bh); | 772 | inode, |
| 773 | inode_bitmap_bh); | ||
| 662 | if (err) | 774 | if (err) |
| 663 | goto fail; | 775 | goto fail; |
| 776 | /* zero bit is inode number 1*/ | ||
| 777 | ino++; | ||
| 664 | goto got; | 778 | goto got; |
| 665 | } | 779 | } |
| 666 | /* we lost it */ | 780 | /* we lost it */ |
| 667 | jbd2_journal_release_buffer(handle, bitmap_bh); | 781 | ext4_handle_release_buffer(handle, inode_bitmap_bh); |
| 782 | ext4_handle_release_buffer(handle, group_desc_bh); | ||
| 668 | 783 | ||
| 669 | if (++ino < EXT4_INODES_PER_GROUP(sb)) | 784 | if (++ino < EXT4_INODES_PER_GROUP(sb)) |
| 670 | goto repeat_in_this_group; | 785 | goto repeat_in_this_group; |
| @@ -684,30 +799,16 @@ repeat_in_this_group: | |||
| 684 | goto out; | 799 | goto out; |
| 685 | 800 | ||
| 686 | got: | 801 | got: |
| 687 | ino++; | ||
| 688 | if ((group == 0 && ino < EXT4_FIRST_INO(sb)) || | ||
| 689 | ino > EXT4_INODES_PER_GROUP(sb)) { | ||
| 690 | ext4_error(sb, __func__, | ||
| 691 | "reserved inode or inode > inodes count - " | ||
| 692 | "block_group = %lu, inode=%lu", group, | ||
| 693 | ino + group * EXT4_INODES_PER_GROUP(sb)); | ||
| 694 | err = -EIO; | ||
| 695 | goto fail; | ||
| 696 | } | ||
| 697 | |||
| 698 | BUFFER_TRACE(bh2, "get_write_access"); | ||
| 699 | err = ext4_journal_get_write_access(handle, bh2); | ||
| 700 | if (err) goto fail; | ||
| 701 | |||
| 702 | /* We may have to initialize the block bitmap if it isn't already */ | 802 | /* We may have to initialize the block bitmap if it isn't already */ |
| 703 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM) && | 803 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM) && |
| 704 | gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) { | 804 | gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) { |
| 705 | struct buffer_head *block_bh = ext4_read_block_bitmap(sb, group); | 805 | struct buffer_head *block_bitmap_bh; |
| 706 | 806 | ||
| 707 | BUFFER_TRACE(block_bh, "get block bitmap access"); | 807 | block_bitmap_bh = ext4_read_block_bitmap(sb, group); |
| 708 | err = ext4_journal_get_write_access(handle, block_bh); | 808 | BUFFER_TRACE(block_bitmap_bh, "get block bitmap access"); |
| 809 | err = ext4_journal_get_write_access(handle, block_bitmap_bh); | ||
| 709 | if (err) { | 810 | if (err) { |
| 710 | brelse(block_bh); | 811 | brelse(block_bitmap_bh); |
| 711 | goto fail; | 812 | goto fail; |
| 712 | } | 813 | } |
| 713 | 814 | ||
| @@ -715,9 +816,9 @@ got: | |||
| 715 | spin_lock(sb_bgl_lock(sbi, group)); | 816 | spin_lock(sb_bgl_lock(sbi, group)); |
| 716 | /* recheck and clear flag under lock if we still need to */ | 817 | /* recheck and clear flag under lock if we still need to */ |
| 717 | if (gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) { | 818 | if (gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) { |
| 718 | gdp->bg_flags &= cpu_to_le16(~EXT4_BG_BLOCK_UNINIT); | ||
| 719 | free = ext4_free_blocks_after_init(sb, group, gdp); | 819 | free = ext4_free_blocks_after_init(sb, group, gdp); |
| 720 | gdp->bg_free_blocks_count = cpu_to_le16(free); | 820 | gdp->bg_flags &= cpu_to_le16(~EXT4_BG_BLOCK_UNINIT); |
| 821 | ext4_free_blks_set(sb, gdp, free); | ||
| 721 | gdp->bg_checksum = ext4_group_desc_csum(sbi, group, | 822 | gdp->bg_checksum = ext4_group_desc_csum(sbi, group, |
| 722 | gdp); | 823 | gdp); |
| 723 | } | 824 | } |
| @@ -725,55 +826,19 @@ got: | |||
| 725 | 826 | ||
| 726 | /* Don't need to dirty bitmap block if we didn't change it */ | 827 | /* Don't need to dirty bitmap block if we didn't change it */ |
| 727 | if (free) { | 828 | if (free) { |
| 728 | BUFFER_TRACE(block_bh, "dirty block bitmap"); | 829 | BUFFER_TRACE(block_bitmap_bh, "dirty block bitmap"); |
| 729 | err = ext4_journal_dirty_metadata(handle, block_bh); | 830 | err = ext4_handle_dirty_metadata(handle, |
| 831 | NULL, block_bitmap_bh); | ||
| 730 | } | 832 | } |
| 731 | 833 | ||
| 732 | brelse(block_bh); | 834 | brelse(block_bitmap_bh); |
| 733 | if (err) | 835 | if (err) |
| 734 | goto fail; | 836 | goto fail; |
| 735 | } | 837 | } |
| 736 | 838 | BUFFER_TRACE(group_desc_bh, "call ext4_handle_dirty_metadata"); | |
| 737 | spin_lock(sb_bgl_lock(sbi, group)); | 839 | err = ext4_handle_dirty_metadata(handle, NULL, group_desc_bh); |
| 738 | /* If we didn't allocate from within the initialized part of the inode | 840 | if (err) |
| 739 | * table then we need to initialize up to this inode. */ | 841 | goto fail; |
| 740 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) { | ||
| 741 | if (gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_UNINIT)) { | ||
| 742 | gdp->bg_flags &= cpu_to_le16(~EXT4_BG_INODE_UNINIT); | ||
| 743 | |||
| 744 | /* When marking the block group with | ||
| 745 | * ~EXT4_BG_INODE_UNINIT we don't want to depend | ||
| 746 | * on the value of bg_itable_unused even though | ||
| 747 | * mke2fs could have initialized the same for us. | ||
| 748 | * Instead we calculated the value below | ||
| 749 | */ | ||
| 750 | |||
| 751 | free = 0; | ||
| 752 | } else { | ||
| 753 | free = EXT4_INODES_PER_GROUP(sb) - | ||
| 754 | le16_to_cpu(gdp->bg_itable_unused); | ||
| 755 | } | ||
| 756 | |||
| 757 | /* | ||
| 758 | * Check the relative inode number against the last used | ||
| 759 | * relative inode number in this group. if it is greater | ||
| 760 | * we need to update the bg_itable_unused count | ||
| 761 | * | ||
| 762 | */ | ||
| 763 | if (ino > free) | ||
| 764 | gdp->bg_itable_unused = | ||
| 765 | cpu_to_le16(EXT4_INODES_PER_GROUP(sb) - ino); | ||
| 766 | } | ||
| 767 | |||
| 768 | le16_add_cpu(&gdp->bg_free_inodes_count, -1); | ||
| 769 | if (S_ISDIR(mode)) { | ||
| 770 | le16_add_cpu(&gdp->bg_used_dirs_count, 1); | ||
| 771 | } | ||
| 772 | gdp->bg_checksum = ext4_group_desc_csum(sbi, group, gdp); | ||
| 773 | spin_unlock(sb_bgl_lock(sbi, group)); | ||
| 774 | BUFFER_TRACE(bh2, "call ext4_journal_dirty_metadata"); | ||
| 775 | err = ext4_journal_dirty_metadata(handle, bh2); | ||
| 776 | if (err) goto fail; | ||
| 777 | 842 | ||
| 778 | percpu_counter_dec(&sbi->s_freeinodes_counter); | 843 | percpu_counter_dec(&sbi->s_freeinodes_counter); |
| 779 | if (S_ISDIR(mode)) | 844 | if (S_ISDIR(mode)) |
| @@ -825,8 +890,11 @@ got: | |||
| 825 | 890 | ||
| 826 | ext4_set_inode_flags(inode); | 891 | ext4_set_inode_flags(inode); |
| 827 | if (IS_DIRSYNC(inode)) | 892 | if (IS_DIRSYNC(inode)) |
| 828 | handle->h_sync = 1; | 893 | ext4_handle_sync(handle); |
| 829 | insert_inode_hash(inode); | 894 | if (insert_inode_locked(inode) < 0) { |
| 895 | err = -EINVAL; | ||
| 896 | goto fail_drop; | ||
| 897 | } | ||
| 830 | spin_lock(&sbi->s_next_gen_lock); | 898 | spin_lock(&sbi->s_next_gen_lock); |
| 831 | inode->i_generation = sbi->s_next_generation++; | 899 | inode->i_generation = sbi->s_next_generation++; |
| 832 | spin_unlock(&sbi->s_next_gen_lock); | 900 | spin_unlock(&sbi->s_next_gen_lock); |
| @@ -849,7 +917,7 @@ got: | |||
| 849 | if (err) | 917 | if (err) |
| 850 | goto fail_free_drop; | 918 | goto fail_free_drop; |
| 851 | 919 | ||
| 852 | if (test_opt(sb, EXTENTS)) { | 920 | if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)) { |
| 853 | /* set extent flag only for directory, file and normal symlink*/ | 921 | /* set extent flag only for directory, file and normal symlink*/ |
| 854 | if (S_ISDIR(mode) || S_ISREG(mode) || S_ISLNK(mode)) { | 922 | if (S_ISDIR(mode) || S_ISREG(mode) || S_ISLNK(mode)) { |
| 855 | EXT4_I(inode)->i_flags |= EXT4_EXTENTS_FL; | 923 | EXT4_I(inode)->i_flags |= EXT4_EXTENTS_FL; |
| @@ -864,6 +932,8 @@ got: | |||
| 864 | } | 932 | } |
| 865 | 933 | ||
| 866 | ext4_debug("allocating inode %lu\n", inode->i_ino); | 934 | ext4_debug("allocating inode %lu\n", inode->i_ino); |
| 935 | trace_mark(ext4_allocate_inode, "dev %s ino %lu dir %lu mode %d", | ||
| 936 | sb->s_id, inode->i_ino, dir->i_ino, mode); | ||
| 867 | goto really_out; | 937 | goto really_out; |
| 868 | fail: | 938 | fail: |
| 869 | ext4_std_error(sb, err); | 939 | ext4_std_error(sb, err); |
| @@ -871,7 +941,7 @@ out: | |||
| 871 | iput(inode); | 941 | iput(inode); |
| 872 | ret = ERR_PTR(err); | 942 | ret = ERR_PTR(err); |
| 873 | really_out: | 943 | really_out: |
| 874 | brelse(bitmap_bh); | 944 | brelse(inode_bitmap_bh); |
| 875 | return ret; | 945 | return ret; |
| 876 | 946 | ||
| 877 | fail_free_drop: | 947 | fail_free_drop: |
| @@ -881,8 +951,9 @@ fail_drop: | |||
| 881 | DQUOT_DROP(inode); | 951 | DQUOT_DROP(inode); |
| 882 | inode->i_flags |= S_NOQUOTA; | 952 | inode->i_flags |= S_NOQUOTA; |
| 883 | inode->i_nlink = 0; | 953 | inode->i_nlink = 0; |
| 954 | unlock_new_inode(inode); | ||
| 884 | iput(inode); | 955 | iput(inode); |
| 885 | brelse(bitmap_bh); | 956 | brelse(inode_bitmap_bh); |
| 886 | return ERR_PTR(err); | 957 | return ERR_PTR(err); |
| 887 | } | 958 | } |
| 888 | 959 | ||
| @@ -981,7 +1052,7 @@ unsigned long ext4_count_free_inodes(struct super_block *sb) | |||
| 981 | gdp = ext4_get_group_desc(sb, i, NULL); | 1052 | gdp = ext4_get_group_desc(sb, i, NULL); |
| 982 | if (!gdp) | 1053 | if (!gdp) |
| 983 | continue; | 1054 | continue; |
| 984 | desc_count += le16_to_cpu(gdp->bg_free_inodes_count); | 1055 | desc_count += ext4_free_inodes_count(sb, gdp); |
| 985 | brelse(bitmap_bh); | 1056 | brelse(bitmap_bh); |
| 986 | bitmap_bh = ext4_read_inode_bitmap(sb, i); | 1057 | bitmap_bh = ext4_read_inode_bitmap(sb, i); |
| 987 | if (!bitmap_bh) | 1058 | if (!bitmap_bh) |
| @@ -989,7 +1060,7 @@ unsigned long ext4_count_free_inodes(struct super_block *sb) | |||
| 989 | 1060 | ||
| 990 | x = ext4_count_free(bitmap_bh, EXT4_INODES_PER_GROUP(sb) / 8); | 1061 | x = ext4_count_free(bitmap_bh, EXT4_INODES_PER_GROUP(sb) / 8); |
| 991 | printk(KERN_DEBUG "group %lu: stored = %d, counted = %lu\n", | 1062 | printk(KERN_DEBUG "group %lu: stored = %d, counted = %lu\n", |
| 992 | i, le16_to_cpu(gdp->bg_free_inodes_count), x); | 1063 | i, ext4_free_inodes_count(sb, gdp), x); |
| 993 | bitmap_count += x; | 1064 | bitmap_count += x; |
| 994 | } | 1065 | } |
| 995 | brelse(bitmap_bh); | 1066 | brelse(bitmap_bh); |
| @@ -1003,7 +1074,7 @@ unsigned long ext4_count_free_inodes(struct super_block *sb) | |||
| 1003 | gdp = ext4_get_group_desc(sb, i, NULL); | 1074 | gdp = ext4_get_group_desc(sb, i, NULL); |
| 1004 | if (!gdp) | 1075 | if (!gdp) |
| 1005 | continue; | 1076 | continue; |
| 1006 | desc_count += le16_to_cpu(gdp->bg_free_inodes_count); | 1077 | desc_count += ext4_free_inodes_count(sb, gdp); |
| 1007 | cond_resched(); | 1078 | cond_resched(); |
| 1008 | } | 1079 | } |
| 1009 | return desc_count; | 1080 | return desc_count; |
| @@ -1020,8 +1091,7 @@ unsigned long ext4_count_dirs(struct super_block * sb) | |||
| 1020 | struct ext4_group_desc *gdp = ext4_get_group_desc(sb, i, NULL); | 1091 | struct ext4_group_desc *gdp = ext4_get_group_desc(sb, i, NULL); |
| 1021 | if (!gdp) | 1092 | if (!gdp) |
| 1022 | continue; | 1093 | continue; |
| 1023 | count += le16_to_cpu(gdp->bg_used_dirs_count); | 1094 | count += ext4_used_dirs_count(sb, gdp); |
| 1024 | } | 1095 | } |
| 1025 | return count; | 1096 | return count; |
| 1026 | } | 1097 | } |
| 1027 | |||
