ext4: let setup_new_group_blocks() set multiple bits at a time
authorYongqiang Yang <xiaoqiangnk@gmail.com>
Wed, 27 Jul 2011 02:05:53 +0000 (22:05 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 27 Jul 2011 02:05:53 +0000 (22:05 -0400)
Rename mb_set_bits() to ext4_set_bits() and make it a global function
so that setup_new_group_blocks() can use it.

Signed-off-by: Yongqiang Yang <xiaoqiangnk@gmail.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/ext4.h
fs/ext4/mballoc.c
fs/ext4/resize.c

index da7ab48948f279f7082e9de01e2c843e8a370062..ba2009b49a5506cb9de85fc272cd877ae564886d 100644 (file)
@@ -940,6 +940,8 @@ struct ext4_inode_info {
 #define ext4_find_next_zero_bit                find_next_zero_bit_le
 #define ext4_find_next_bit             find_next_bit_le
 
+extern void ext4_set_bits(void *bm, int cur, int len);
+
 /*
  * Maximal mount counts between two filesystem checks
  */
index b6ef4da39ce3c1b013cacf0e97c247549ba2aafd..fa716c9b245581414a4c065c7a0857115b5c314e 100644 (file)
@@ -1282,7 +1282,7 @@ static void mb_clear_bits(void *bm, int cur, int len)
        }
 }
 
-static void mb_set_bits(void *bm, int cur, int len)
+void ext4_set_bits(void *bm, int cur, int len)
 {
        __u32 *addr;
 
@@ -1511,7 +1511,7 @@ static int mb_mark_used(struct ext4_buddy *e4b, struct ext4_free_extent *ex)
        }
        mb_set_largest_free_order(e4b->bd_sb, e4b->bd_info);
 
-       mb_set_bits(EXT4_MB_BITMAP(e4b), ex->fe_start, len0);
+       ext4_set_bits(EXT4_MB_BITMAP(e4b), ex->fe_start, len0);
        mb_check_buddy(e4b);
 
        return ret;
@@ -2795,8 +2795,8 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac,
                 * We leak some of the blocks here.
                 */
                ext4_lock_group(sb, ac->ac_b_ex.fe_group);
-               mb_set_bits(bitmap_bh->b_data, ac->ac_b_ex.fe_start,
-                           ac->ac_b_ex.fe_len);
+               ext4_set_bits(bitmap_bh->b_data, ac->ac_b_ex.fe_start,
+                             ac->ac_b_ex.fe_len);
                ext4_unlock_group(sb, ac->ac_b_ex.fe_group);
                err = ext4_handle_dirty_metadata(handle, NULL, bitmap_bh);
                if (!err)
@@ -2814,7 +2814,8 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac,
                }
        }
 #endif
-       mb_set_bits(bitmap_bh->b_data, ac->ac_b_ex.fe_start,ac->ac_b_ex.fe_len);
+       ext4_set_bits(bitmap_bh->b_data, ac->ac_b_ex.fe_start,
+                     ac->ac_b_ex.fe_len);
        if (gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) {
                gdp->bg_flags &= cpu_to_le16(~EXT4_BG_BLOCK_UNINIT);
                ext4_free_blks_set(sb, gdp,
@@ -3284,7 +3285,7 @@ static void ext4_mb_generate_from_freelist(struct super_block *sb, void *bitmap,
 
        while (n) {
                entry = rb_entry(n, struct ext4_free_data, node);
-               mb_set_bits(bitmap, entry->start_blk, entry->count);
+               ext4_set_bits(bitmap, entry->start_blk, entry->count);
                n = rb_next(n);
        }
        return;
@@ -3326,7 +3327,7 @@ void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap,
                if (unlikely(len == 0))
                        continue;
                BUG_ON(groupnr != group);
-               mb_set_bits(bitmap, start, len);
+               ext4_set_bits(bitmap, start, len);
                preallocated += len;
                count++;
        }
index 5f0aefdc85996062f8769fc893bf400f005a19bc..178fb2f11c3fc0d73ec6c4e573a60610074fc4c4 100644 (file)
@@ -217,11 +217,6 @@ static int setup_new_group_blocks(struct super_block *sb,
                goto exit_journal;
        }
 
-       if (ext4_bg_has_super(sb, input->group)) {
-               ext4_debug("mark backup superblock %#04llx (+0)\n", start);
-               ext4_set_bit(0, bh->b_data);
-       }
-
        /* Copy all of the GDT blocks into the backup in this group */
        for (i = 0, bit = 1, block = start + 1;
             i < gdblocks; i++, block++, bit++) {
@@ -250,7 +245,6 @@ static int setup_new_group_blocks(struct super_block *sb,
                        brelse(gdb);
                        goto exit_bh;
                }
-               ext4_set_bit(bit, bh->b_data);
                brelse(gdb);
        }
 
@@ -261,8 +255,11 @@ static int setup_new_group_blocks(struct super_block *sb,
                               GFP_NOFS);
        if (err)
                goto exit_bh;
-       for (i = 0, bit = gdblocks + 1; i < reserved_gdb; i++, bit++)
-               ext4_set_bit(bit, bh->b_data);
+
+       if (ext4_bg_has_super(sb, input->group)) {
+               ext4_debug("mark backup group tables %#04llx (+0)\n", start);
+               ext4_set_bits(bh->b_data, 0, gdblocks + reserved_gdb + 1);
+       }
 
        ext4_debug("mark block bitmap %#04llx (+%llu)\n", input->block_bitmap,
                   input->block_bitmap - start);
@@ -278,9 +275,8 @@ static int setup_new_group_blocks(struct super_block *sb,
        err = sb_issue_zeroout(sb, block, sbi->s_itb_per_group, GFP_NOFS);
        if (err)
                goto exit_bh;
-       for (i = 0, bit = input->inode_table - start;
-            i < sbi->s_itb_per_group; i++, bit++)
-               ext4_set_bit(bit, bh->b_data);
+       ext4_set_bits(bh->b_data, input->inode_table - start,
+                     sbi->s_itb_per_group);
 
        if ((err = extend_or_restart_transaction(handle, 2, bh)))
                goto exit_bh;