ext4: introduce ext4_get_group_number()
authorLukas Czerner <lczerner@redhat.com>
Thu, 4 Apr 2013 03:32:34 +0000 (23:32 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 4 Apr 2013 03:32:34 +0000 (23:32 -0400)
Currently on many places in ext4 we're using
ext4_get_group_no_and_offset() even though we're only interested in
knowing the block group of the particular block, not the offset within
the block group so we can use more efficient way to compute block
group.

This patch introduces ext4_get_group_number() which computes block
group for a given block much more efficiently. Use this function
instead of ext4_get_group_no_and_offset() everywhere where we're only
interested in knowing the block group.

Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/balloc.c
fs/ext4/ext4.h
fs/ext4/mballoc.c
fs/ext4/resize.c

index d6babf94907e02d0b3a2f67e3cd96264b26e0c74..9e8d8ffb063f8d7b7346391bcc9fe7c552b44a35 100644 (file)
@@ -29,6 +29,23 @@ static unsigned ext4_num_base_meta_clusters(struct super_block *sb,
  * balloc.c contains the blocks allocation and deallocation routines
  */
 
+/*
+ * Calculate block group number for a given block number
+ */
+ext4_group_t ext4_get_group_number(struct super_block *sb,
+                                  ext4_fsblk_t block)
+{
+       ext4_group_t group;
+
+       if (test_opt2(sb, STD_GROUP_SIZE))
+               group = (le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block) +
+                        block) >>
+                       (EXT4_BLOCK_SIZE_BITS(sb) + EXT4_CLUSTER_BITS(sb) + 3);
+       else
+               ext4_get_group_no_and_offset(sb, block, &group, NULL);
+       return group;
+}
+
 /*
  * Calculate the block group number and offset into the block/cluster
  * allocation bitmap, given a block number
@@ -59,13 +76,7 @@ static inline int ext4_block_in_group(struct super_block *sb,
 {
        ext4_group_t actual_group;
 
-       if (test_opt2(sb, STD_GROUP_SIZE))
-               actual_group =
-                       (le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block) +
-                       block) >>
-                       (EXT4_BLOCK_SIZE_BITS(sb) + EXT4_CLUSTER_BITS(sb) + 3);
-       else
-               ext4_get_group_no_and_offset(sb, block, &actual_group, NULL);
+       actual_group = ext4_get_group_number(sb, block);
        return (actual_group == block_group) ? 1 : 0;
 }
 
index cc58aa8e98692cdb4b5f75118aea05f04587cd58..a0637e5057aee0488c9fe0d5c58d72c5b98f684a 100644 (file)
@@ -1793,9 +1793,6 @@ ext4_group_first_block_no(struct super_block *sb, ext4_group_t group_no)
  */
 #define ERR_BAD_DX_DIR -75000
 
-void ext4_get_group_no_and_offset(struct super_block *sb, ext4_fsblk_t blocknr,
-                       ext4_group_t *blockgrpp, ext4_grpblk_t *offsetp);
-
 /*
  * Timeout and state flag for lazy initialization inode thread.
  */
@@ -1917,6 +1914,13 @@ int ext4_block_bitmap_csum_verify(struct super_block *sb, ext4_group_t group,
                                  struct buffer_head *bh);
 
 /* balloc.c */
+extern void ext4_get_group_no_and_offset(struct super_block *sb,
+                                        ext4_fsblk_t blocknr,
+                                        ext4_group_t *blockgrpp,
+                                        ext4_grpblk_t *offsetp);
+extern ext4_group_t ext4_get_group_number(struct super_block *sb,
+                                         ext4_fsblk_t block);
+
 extern void ext4_validate_block_bitmap(struct super_block *sb,
                                       struct ext4_group_desc *desc,
                                       unsigned int block_group,
index 580aada3d1bb23cdb9eb7e0451e3faddddb2791b..8c8d05218021d1113e864cc1ddd68320f2f6a216 100644 (file)
@@ -3344,7 +3344,7 @@ static void ext4_mb_put_pa(struct ext4_allocation_context *ac,
        if (pa->pa_type == MB_GROUP_PA)
                grp_blk--;
 
-       ext4_get_group_no_and_offset(sb, grp_blk, &grp, NULL);
+       grp = ext4_get_group_number(sb, grp_blk);
 
        /*
         * possible race:
@@ -3809,7 +3809,7 @@ repeat:
 
        list_for_each_entry_safe(pa, tmp, &list, u.pa_tmp_list) {
                BUG_ON(pa->pa_type != MB_INODE_PA);
-               ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, NULL);
+               group = ext4_get_group_number(sb, pa->pa_pstart);
 
                err = ext4_mb_load_buddy(sb, group, &e4b);
                if (err) {
@@ -4071,7 +4071,7 @@ ext4_mb_discard_lg_preallocations(struct super_block *sb,
 
        list_for_each_entry_safe(pa, tmp, &discard_list, u.pa_tmp_list) {
 
-               ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, NULL);
+               group = ext4_get_group_number(sb, pa->pa_pstart);
                if (ext4_mb_load_buddy(sb, group, &e4b)) {
                        ext4_error(sb, "Error loading buddy information for %u",
                                        group);
index c169477a62c987a1ba2d3362dde6bd8d3cd0f260..e3498534a2c1a7da840cd7fe8846ed9b76200f5b 100644 (file)
@@ -272,7 +272,7 @@ next_group:
                if (start_blk >= last_blk)
                        goto next_group;
                group_data[bb_index].block_bitmap = start_blk++;
-               ext4_get_group_no_and_offset(sb, start_blk - 1, &group, NULL);
+               group = ext4_get_group_number(sb, start_blk - 1);
                group -= group_data[0].group;
                group_data[group].free_blocks_count--;
                if (flexbg_size > 1)
@@ -284,7 +284,7 @@ next_group:
                if (start_blk >= last_blk)
                        goto next_group;
                group_data[ib_index].inode_bitmap = start_blk++;
-               ext4_get_group_no_and_offset(sb, start_blk - 1, &group, NULL);
+               group = ext4_get_group_number(sb, start_blk - 1);
                group -= group_data[0].group;
                group_data[group].free_blocks_count--;
                if (flexbg_size > 1)
@@ -296,7 +296,7 @@ next_group:
                if (start_blk + EXT4_SB(sb)->s_itb_per_group > last_blk)
                        goto next_group;
                group_data[it_index].inode_table = start_blk;
-               ext4_get_group_no_and_offset(sb, start_blk, &group, NULL);
+               group = ext4_get_group_number(sb, start_blk - 1);
                group -= group_data[0].group;
                group_data[group].free_blocks_count -=
                                        EXT4_SB(sb)->s_itb_per_group;
@@ -392,7 +392,7 @@ static int set_flexbg_block_bitmap(struct super_block *sb, handle_t *handle,
                ext4_group_t group;
                int err;
 
-               ext4_get_group_no_and_offset(sb, block, &group, NULL);
+               group = ext4_get_group_number(sb, block);
                start = ext4_group_first_block_no(sb, group);
                group -= flex_gd->groups[0].group;
 
@@ -1879,7 +1879,7 @@ retry:
                /* Nothing need to do */
                return 0;
 
-       ext4_get_group_no_and_offset(sb, n_blocks_count - 1, &n_group, &offset);
+       n_group = ext4_get_group_number(sb, n_blocks_count - 1);
        ext4_get_group_no_and_offset(sb, o_blocks_count - 1, &o_group, &offset);
 
        n_desc_blocks = num_desc_blocks(sb, n_group + 1);