diff options
Diffstat (limited to 'fs/ext4/ialloc.c')
-rw-r--r-- | fs/ext4/ialloc.c | 324 |
1 files changed, 195 insertions, 129 deletions
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 6e6052879aa2..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,7 +890,7 @@ 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 | if (insert_inode_locked(inode) < 0) { | 894 | if (insert_inode_locked(inode) < 0) { |
830 | err = -EINVAL; | 895 | err = -EINVAL; |
831 | goto fail_drop; | 896 | goto fail_drop; |
@@ -852,7 +917,7 @@ got: | |||
852 | if (err) | 917 | if (err) |
853 | goto fail_free_drop; | 918 | goto fail_free_drop; |
854 | 919 | ||
855 | if (test_opt(sb, EXTENTS)) { | 920 | if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)) { |
856 | /* set extent flag only for directory, file and normal symlink*/ | 921 | /* set extent flag only for directory, file and normal symlink*/ |
857 | if (S_ISDIR(mode) || S_ISREG(mode) || S_ISLNK(mode)) { | 922 | if (S_ISDIR(mode) || S_ISREG(mode) || S_ISLNK(mode)) { |
858 | EXT4_I(inode)->i_flags |= EXT4_EXTENTS_FL; | 923 | EXT4_I(inode)->i_flags |= EXT4_EXTENTS_FL; |
@@ -867,6 +932,8 @@ got: | |||
867 | } | 932 | } |
868 | 933 | ||
869 | 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); | ||
870 | goto really_out; | 937 | goto really_out; |
871 | fail: | 938 | fail: |
872 | ext4_std_error(sb, err); | 939 | ext4_std_error(sb, err); |
@@ -874,7 +941,7 @@ out: | |||
874 | iput(inode); | 941 | iput(inode); |
875 | ret = ERR_PTR(err); | 942 | ret = ERR_PTR(err); |
876 | really_out: | 943 | really_out: |
877 | brelse(bitmap_bh); | 944 | brelse(inode_bitmap_bh); |
878 | return ret; | 945 | return ret; |
879 | 946 | ||
880 | fail_free_drop: | 947 | fail_free_drop: |
@@ -886,7 +953,7 @@ fail_drop: | |||
886 | inode->i_nlink = 0; | 953 | inode->i_nlink = 0; |
887 | unlock_new_inode(inode); | 954 | unlock_new_inode(inode); |
888 | iput(inode); | 955 | iput(inode); |
889 | brelse(bitmap_bh); | 956 | brelse(inode_bitmap_bh); |
890 | return ERR_PTR(err); | 957 | return ERR_PTR(err); |
891 | } | 958 | } |
892 | 959 | ||
@@ -985,7 +1052,7 @@ unsigned long ext4_count_free_inodes(struct super_block *sb) | |||
985 | gdp = ext4_get_group_desc(sb, i, NULL); | 1052 | gdp = ext4_get_group_desc(sb, i, NULL); |
986 | if (!gdp) | 1053 | if (!gdp) |
987 | continue; | 1054 | continue; |
988 | desc_count += le16_to_cpu(gdp->bg_free_inodes_count); | 1055 | desc_count += ext4_free_inodes_count(sb, gdp); |
989 | brelse(bitmap_bh); | 1056 | brelse(bitmap_bh); |
990 | bitmap_bh = ext4_read_inode_bitmap(sb, i); | 1057 | bitmap_bh = ext4_read_inode_bitmap(sb, i); |
991 | if (!bitmap_bh) | 1058 | if (!bitmap_bh) |
@@ -993,7 +1060,7 @@ unsigned long ext4_count_free_inodes(struct super_block *sb) | |||
993 | 1060 | ||
994 | 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); |
995 | printk(KERN_DEBUG "group %lu: stored = %d, counted = %lu\n", | 1062 | printk(KERN_DEBUG "group %lu: stored = %d, counted = %lu\n", |
996 | i, le16_to_cpu(gdp->bg_free_inodes_count), x); | 1063 | i, ext4_free_inodes_count(sb, gdp), x); |
997 | bitmap_count += x; | 1064 | bitmap_count += x; |
998 | } | 1065 | } |
999 | brelse(bitmap_bh); | 1066 | brelse(bitmap_bh); |
@@ -1007,7 +1074,7 @@ unsigned long ext4_count_free_inodes(struct super_block *sb) | |||
1007 | gdp = ext4_get_group_desc(sb, i, NULL); | 1074 | gdp = ext4_get_group_desc(sb, i, NULL); |
1008 | if (!gdp) | 1075 | if (!gdp) |
1009 | continue; | 1076 | continue; |
1010 | desc_count += le16_to_cpu(gdp->bg_free_inodes_count); | 1077 | desc_count += ext4_free_inodes_count(sb, gdp); |
1011 | cond_resched(); | 1078 | cond_resched(); |
1012 | } | 1079 | } |
1013 | return desc_count; | 1080 | return desc_count; |
@@ -1024,8 +1091,7 @@ unsigned long ext4_count_dirs(struct super_block * sb) | |||
1024 | 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); |
1025 | if (!gdp) | 1092 | if (!gdp) |
1026 | continue; | 1093 | continue; |
1027 | count += le16_to_cpu(gdp->bg_used_dirs_count); | 1094 | count += ext4_used_dirs_count(sb, gdp); |
1028 | } | 1095 | } |
1029 | return count; | 1096 | return count; |
1030 | } | 1097 | } |
1031 | |||