Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ext4: call ext4_mb_mark_context in ext4_group_add_blocks()

Call ext4_mb_mark_context in ext4_group_add_blocks() to remove repeat code.

Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
Reviewed-by: "Ritesh Harjani (IBM)" <ritesh.list@gmail.com>
Link: https://lore.kernel.org/r/20230928160407.142069-10-shikemeng@huaweicloud.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>

authored by

Kemeng Shi and committed by
Theodore Ts'o
5c657db4 03c7fc39

+10 -72
+10 -72
fs/ext4/mballoc.c
··· 6622 6622 int ext4_group_add_blocks(handle_t *handle, struct super_block *sb, 6623 6623 ext4_fsblk_t block, unsigned long count) 6624 6624 { 6625 - struct buffer_head *bitmap_bh = NULL; 6626 - struct buffer_head *gd_bh; 6627 6625 ext4_group_t block_group; 6628 6626 ext4_grpblk_t bit; 6629 - unsigned int i; 6630 - struct ext4_group_desc *desc; 6631 6627 struct ext4_sb_info *sbi = EXT4_SB(sb); 6632 6628 struct ext4_buddy e4b; 6633 - int err = 0, ret, free_clusters_count; 6634 - ext4_grpblk_t clusters_freed; 6629 + int err = 0; 6635 6630 ext4_fsblk_t first_cluster = EXT4_B2C(sbi, block); 6636 6631 ext4_fsblk_t last_cluster = EXT4_B2C(sbi, block + count - 1); 6637 6632 unsigned long cluster_count = last_cluster - first_cluster + 1; 6633 + ext4_grpblk_t changed; 6638 6634 6639 6635 ext4_debug("Adding block(s) %llu-%llu\n", block, block + count - 1); 6640 6636 6641 - if (count == 0) 6637 + if (cluster_count == 0) 6642 6638 return 0; 6643 6639 6644 6640 ext4_get_group_no_and_offset(sb, block, &block_group, &bit); ··· 6661 6665 goto error_clean; 6662 6666 } 6663 6667 6664 - bitmap_bh = ext4_read_block_bitmap(sb, block_group); 6665 - if (IS_ERR(bitmap_bh)) { 6666 - err = PTR_ERR(bitmap_bh); 6667 - bitmap_bh = NULL; 6668 - goto error_clean; 6669 - } 6670 - 6671 - desc = ext4_get_group_desc(sb, block_group, &gd_bh); 6672 - if (!desc) { 6673 - err = -EIO; 6674 - goto error_clean; 6675 - } 6676 - 6677 - BUFFER_TRACE(bitmap_bh, "getting write access"); 6678 - err = ext4_journal_get_write_access(handle, sb, bitmap_bh, 6679 - EXT4_JTR_NONE); 6680 - if (err) 6668 + err = ext4_mb_mark_context(handle, sb, false, block_group, bit, 6669 + cluster_count, EXT4_MB_BITMAP_MARKED_CHECK, 6670 + &changed); 6671 + if (err && changed == 0) 6681 6672 goto error_clean; 6682 6673 6683 - /* 6684 - * We are about to modify some metadata. Call the journal APIs 6685 - * to unshare ->b_data if a currently-committing transaction is 6686 - * using it 6687 - */ 6688 - BUFFER_TRACE(gd_bh, "get_write_access"); 6689 - err = ext4_journal_get_write_access(handle, sb, gd_bh, EXT4_JTR_NONE); 6690 - if (err) 6691 - goto error_clean; 6692 - 6693 - for (i = 0, clusters_freed = 0; i < cluster_count; i++) { 6694 - BUFFER_TRACE(bitmap_bh, "clear bit"); 6695 - if (!mb_test_bit(bit + i, bitmap_bh->b_data)) { 6696 - ext4_error(sb, "bit already cleared for block %llu", 6697 - (ext4_fsblk_t)(block + i)); 6698 - BUFFER_TRACE(bitmap_bh, "bit already cleared"); 6699 - } else { 6700 - clusters_freed++; 6701 - } 6702 - } 6703 - 6704 - ext4_lock_group(sb, block_group); 6705 - mb_clear_bits(bitmap_bh->b_data, bit, cluster_count); 6706 - free_clusters_count = clusters_freed + 6707 - ext4_free_group_clusters(sb, desc); 6708 - ext4_free_group_clusters_set(sb, desc, free_clusters_count); 6709 - ext4_block_bitmap_csum_set(sb, desc, bitmap_bh); 6710 - ext4_group_desc_csum_set(sb, block_group, desc); 6711 - ext4_unlock_group(sb, block_group); 6712 - 6713 - if (sbi->s_log_groups_per_flex) { 6714 - ext4_group_t flex_group = ext4_flex_group(sbi, block_group); 6715 - atomic64_add(clusters_freed, 6716 - &sbi_array_rcu_deref(sbi, s_flex_groups, 6717 - flex_group)->free_clusters); 6718 - } 6719 - 6720 - /* We dirtied the bitmap block */ 6721 - BUFFER_TRACE(bitmap_bh, "dirtied bitmap block"); 6722 - err = ext4_handle_dirty_metadata(handle, NULL, bitmap_bh); 6723 - 6724 - /* And the group descriptor block */ 6725 - BUFFER_TRACE(gd_bh, "dirtied group descriptor block"); 6726 - ret = ext4_handle_dirty_metadata(handle, NULL, gd_bh); 6727 - if (!err) 6728 - err = ret; 6674 + if (changed != cluster_count) 6675 + ext4_error(sb, "bit already cleared in group %u", block_group); 6729 6676 6730 6677 ext4_lock_group(sb, block_group); 6731 6678 mb_free_blocks(NULL, &e4b, bit, cluster_count); 6732 6679 ext4_unlock_group(sb, block_group); 6733 6680 percpu_counter_add(&sbi->s_freeclusters_counter, 6734 - clusters_freed); 6681 + changed); 6735 6682 6736 6683 error_clean: 6737 - brelse(bitmap_bh); 6738 6684 ext4_mb_unload_buddy(&e4b); 6739 6685 error_out: 6740 6686 ext4_std_error(sb, err);