]> Git Repo - linux.git/blobdiff - fs/ext4/balloc.c
ext4: fix up EXT4FS_DEBUG builds
[linux.git] / fs / ext4 / balloc.c
index 5d45582f9517e35bacb67405d737190aaef128be..80a4616c82448bee3b0c68120fb6cde9bfc230b4 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/quotaops.h>
 #include <linux/buffer_head.h>
 
+#include "group.h"
 /*
  * balloc.c contains the blocks allocation and deallocation routines
  */
  * Calculate the block group number and offset, given a block number
  */
 void ext4_get_group_no_and_offset(struct super_block *sb, ext4_fsblk_t blocknr,
-               unsigned long *blockgrpp, ext4_grpblk_t *offsetp)
+               ext4_group_t *blockgrpp, ext4_grpblk_t *offsetp)
 {
-        struct ext4_super_block *es = EXT4_SB(sb)->s_es;
+       struct ext4_super_block *es = EXT4_SB(sb)->s_es;
        ext4_grpblk_t offset;
 
-        blocknr = blocknr - le32_to_cpu(es->s_first_data_block);
+       blocknr = blocknr - le32_to_cpu(es->s_first_data_block);
        offset = do_div(blocknr, EXT4_BLOCKS_PER_GROUP(sb));
        if (offsetp)
                *offsetp = offset;
        if (blockgrpp)
-               *blockgrpp = blocknr;
+               *blockgrpp = blocknr;
 
 }
 
+/* Initializes an uninitialized block bitmap if given, and returns the
+ * number of blocks free in the group. */
+unsigned ext4_init_block_bitmap(struct super_block *sb, struct buffer_head *bh,
+                ext4_group_t block_group, struct ext4_group_desc *gdp)
+{
+       unsigned long start;
+       int bit, bit_max;
+       unsigned free_blocks, group_blocks;
+       struct ext4_sb_info *sbi = EXT4_SB(sb);
+
+       if (bh) {
+               J_ASSERT_BH(bh, buffer_locked(bh));
+
+               /* If checksum is bad mark all blocks used to prevent allocation
+                * essentially implementing a per-group read-only flag. */
+               if (!ext4_group_desc_csum_verify(sbi, block_group, gdp)) {
+                       ext4_error(sb, __FUNCTION__,
+                                 "Checksum bad for group %lu\n", block_group);
+                       gdp->bg_free_blocks_count = 0;
+                       gdp->bg_free_inodes_count = 0;
+                       gdp->bg_itable_unused = 0;
+                       memset(bh->b_data, 0xff, sb->s_blocksize);
+                       return 0;
+               }
+               memset(bh->b_data, 0, sb->s_blocksize);
+       }
+
+       /* Check for superblock and gdt backups in this group */
+       bit_max = ext4_bg_has_super(sb, block_group);
+
+       if (!EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_META_BG) ||
+           block_group < le32_to_cpu(sbi->s_es->s_first_meta_bg) *
+                         sbi->s_desc_per_block) {
+               if (bit_max) {
+                       bit_max += ext4_bg_num_gdb(sb, block_group);
+                       bit_max +=
+                               le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks);
+               }
+       } else { /* For META_BG_BLOCK_GROUPS */
+               int group_rel = (block_group -
+                                le32_to_cpu(sbi->s_es->s_first_meta_bg)) %
+                               EXT4_DESC_PER_BLOCK(sb);
+               if (group_rel == 0 || group_rel == 1 ||
+                   (group_rel == EXT4_DESC_PER_BLOCK(sb) - 1))
+                       bit_max += 1;
+       }
+
+       if (block_group == sbi->s_groups_count - 1) {
+               /*
+                * Even though mke2fs always initialize first and last group
+                * if some other tool enabled the EXT4_BG_BLOCK_UNINIT we need
+                * to make sure we calculate the right free blocks
+                */
+               group_blocks = ext4_blocks_count(sbi->s_es) -
+                       le32_to_cpu(sbi->s_es->s_first_data_block) -
+                       (EXT4_BLOCKS_PER_GROUP(sb) * (sbi->s_groups_count -1));
+       } else {
+               group_blocks = EXT4_BLOCKS_PER_GROUP(sb);
+       }
+
+       free_blocks = group_blocks - bit_max;
+
+       if (bh) {
+               for (bit = 0; bit < bit_max; bit++)
+                       ext4_set_bit(bit, bh->b_data);
+
+               start = block_group * EXT4_BLOCKS_PER_GROUP(sb) +
+                       le32_to_cpu(sbi->s_es->s_first_data_block);
+
+               /* Set bits for block and inode bitmaps, and inode table */
+               ext4_set_bit(ext4_block_bitmap(sb, gdp) - start, bh->b_data);
+               ext4_set_bit(ext4_inode_bitmap(sb, gdp) - start, bh->b_data);
+               for (bit = (ext4_inode_table(sb, gdp) - start),
+                    bit_max = bit + sbi->s_itb_per_group; bit < bit_max; bit++)
+                       ext4_set_bit(bit, bh->b_data);
+
+               /*
+                * Also if the number of blocks within the group is
+                * less than the blocksize * 8 ( which is the size
+                * of bitmap ), set rest of the block bitmap to 1
+                */
+               mark_bitmap_end(group_blocks, sb->s_blocksize * 8, bh->b_data);
+       }
+
+       return free_blocks - sbi->s_itb_per_group - 2;
+}
+
+
 /*
  * The free blocks are managed by bitmaps.  A file system contains several
  * blocks groups.  Each group contains 1 bitmap block for blocks, 1 bitmap
@@ -50,7 +139,7 @@ void ext4_get_group_no_and_offset(struct super_block *sb, ext4_fsblk_t blocknr,
  * The file system contains group descriptors which are located after the
  * super block.  Each descriptor contains the number of the bitmap block and
  * the free blocks count in the block.  The descriptors are loaded in memory
- * when a file system is mounted (see ext4_read_super).
+ * when a file system is mounted (see ext4_fill_super).
  */
 
 
@@ -64,7 +153,7 @@ void ext4_get_group_no_and_offset(struct super_block *sb, ext4_fsblk_t blocknr,
  *                     group descriptor
  */
 struct ext4_group_desc * ext4_get_group_desc(struct super_block * sb,
-                                            unsigned int block_group,
+                                            ext4_group_t block_group,
                                             struct buffer_head ** bh)
 {
        unsigned long group_desc;
@@ -75,7 +164,7 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block * sb,
        if (block_group >= sbi->s_groups_count) {
                ext4_error (sb, "ext4_get_group_desc",
                            "block_group >= groups_count - "
-                           "block_group = %d, groups_count = %lu",
+                           "block_group = %lu, groups_count = %lu",
                            block_group, sbi->s_groups_count);
 
                return NULL;
@@ -87,7 +176,7 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block * sb,
        if (!sbi->s_group_desc[group_desc]) {
                ext4_error (sb, "ext4_get_group_desc",
                            "Group descriptor not loaded - "
-                           "block_group = %d, group_desc = %lu, desc = %lu",
+                           "block_group = %lu, group_desc = %lu, desc = %lu",
                             block_group, group_desc, offset);
                return NULL;
        }
@@ -100,33 +189,109 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block * sb,
        return desc;
 }
 
+static int ext4_valid_block_bitmap(struct super_block *sb,
+                                       struct ext4_group_desc *desc,
+                                       unsigned int block_group,
+                                       struct buffer_head *bh)
+{
+       ext4_grpblk_t offset;
+       ext4_grpblk_t next_zero_bit;
+       ext4_fsblk_t bitmap_blk;
+       ext4_fsblk_t group_first_block;
+
+       if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG)) {
+               /* with FLEX_BG, the inode/block bitmaps and itable
+                * blocks may not be in the group at all
+                * so the bitmap validation will be skipped for those groups
+                * or it has to also read the block group where the bitmaps
+                * are located to verify they are set.
+                */
+               return 1;
+       }
+       group_first_block = ext4_group_first_block_no(sb, block_group);
+
+       /* check whether block bitmap block number is set */
+       bitmap_blk = ext4_block_bitmap(sb, desc);
+       offset = bitmap_blk - group_first_block;
+       if (!ext4_test_bit(offset, bh->b_data))
+               /* bad block bitmap */
+               goto err_out;
+
+       /* check whether the inode bitmap block number is set */
+       bitmap_blk = ext4_inode_bitmap(sb, desc);
+       offset = bitmap_blk - group_first_block;
+       if (!ext4_test_bit(offset, bh->b_data))
+               /* bad block bitmap */
+               goto err_out;
+
+       /* check whether the inode table block number is set */
+       bitmap_blk = ext4_inode_table(sb, desc);
+       offset = bitmap_blk - group_first_block;
+       next_zero_bit = ext4_find_next_zero_bit(bh->b_data,
+                               offset + EXT4_SB(sb)->s_itb_per_group,
+                               offset);
+       if (next_zero_bit >= offset + EXT4_SB(sb)->s_itb_per_group)
+               /* good bitmap for inode tables */
+               return 1;
+
+err_out:
+       ext4_error(sb, __FUNCTION__,
+                       "Invalid block bitmap - "
+                       "block_group = %d, block = %llu",
+                       block_group, bitmap_blk);
+       return 0;
+}
 /**
  * read_block_bitmap()
  * @sb:                        super block
  * @block_group:       given block group
  *
- * Read the bitmap for a given block_group, reading into the specified
- * slot in the superblock's bitmap cache.
+ * Read the bitmap for a given block_group,and validate the
+ * bits for block/inode/inode tables are set in the bitmaps
  *
  * Return buffer_head on success or NULL in case of failure.
  */
-static struct buffer_head *
-read_block_bitmap(struct super_block *sb, unsigned int block_group)
+struct buffer_head *
+read_block_bitmap(struct super_block *sb, ext4_group_t block_group)
 {
        struct ext4_group_desc * desc;
        struct buffer_head * bh = NULL;
+       ext4_fsblk_t bitmap_blk;
 
-       desc = ext4_get_group_desc (sb, block_group, NULL);
+       desc = ext4_get_group_desc(sb, block_group, NULL);
        if (!desc)
-               goto error_out;
-       bh = sb_bread(sb, ext4_block_bitmap(sb, desc));
-       if (!bh)
-               ext4_error (sb, "read_block_bitmap",
+               return NULL;
+       bitmap_blk = ext4_block_bitmap(sb, desc);
+       bh = sb_getblk(sb, bitmap_blk);
+       if (unlikely(!bh)) {
+               ext4_error(sb, __FUNCTION__,
+                           "Cannot read block bitmap - "
+                           "block_group = %d, block_bitmap = %llu",
+                           (int)block_group, (unsigned long long)bitmap_blk);
+               return NULL;
+       }
+       if (bh_uptodate_or_lock(bh))
+               return bh;
+
+       if (desc->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) {
+               ext4_init_block_bitmap(sb, bh, block_group, desc);
+               set_buffer_uptodate(bh);
+               unlock_buffer(bh);
+               return bh;
+       }
+       if (bh_submit_read(bh) < 0) {
+               put_bh(bh);
+               ext4_error(sb, __FUNCTION__,
                            "Cannot read block bitmap - "
                            "block_group = %d, block_bitmap = %llu",
-                           block_group,
-                           ext4_block_bitmap(sb, desc));
-error_out:
+                           (int)block_group, (unsigned long long)bitmap_blk);
+               return NULL;
+       }
+       if (!ext4_valid_block_bitmap(sb, desc, block_group, bh)) {
+               put_bh(bh);
+               return NULL;
+       }
+
        return bh;
 }
 /*
@@ -165,7 +330,7 @@ restart:
 
        printk("Block Allocation Reservation Windows Map (%s):\n", fn);
        while (n) {
-               rsv = list_entry(n, struct ext4_reserve_window_node, rsv_node);
+               rsv = rb_entry(n, struct ext4_reserve_window_node, rsv_node);
                if (verbose)
                        printk("reservation window 0x%p "
                               "start:  %llu, end:  %llu\n",
@@ -218,7 +383,7 @@ restart:
  */
 static int
 goal_in_my_reservation(struct ext4_reserve_window *rsv, ext4_grpblk_t grp_goal,
-                       unsigned int group, struct super_block * sb)
+                       ext4_group_t group, struct super_block *sb)
 {
        ext4_fsblk_t group_first_block, group_last_block;
 
@@ -361,7 +526,7 @@ static inline int rsv_is_empty(struct ext4_reserve_window *rsv)
  * when setting the reservation window size through ioctl before the file
  * is open for write (needs block allocation).
  *
- * Needs truncate_mutex protection prior to call this function.
+ * Needs down_write(i_data_sem) protection prior to call this function.
  */
 void ext4_init_block_alloc_info(struct inode *inode)
 {
@@ -438,7 +603,7 @@ void ext4_free_blocks_sb(handle_t *handle, struct super_block *sb,
 {
        struct buffer_head *bitmap_bh = NULL;
        struct buffer_head *gd_bh;
-       unsigned long block_group;
+       ext4_group_t block_group;
        ext4_grpblk_t bit;
        unsigned long i;
        unsigned long overflow;
@@ -485,11 +650,13 @@ do_more:
            in_range(ext4_inode_bitmap(sb, desc), block, count) ||
            in_range(block, ext4_inode_table(sb, desc), sbi->s_itb_per_group) ||
            in_range(block + count - 1, ext4_inode_table(sb, desc),
-                    sbi->s_itb_per_group))
+                    sbi->s_itb_per_group)) {
                ext4_error (sb, "ext4_free_blocks",
                            "Freeing blocks in system zones - "
                            "Block = %llu, count = %lu",
                            block, count);
+               goto error_return;
+       }
 
        /*
         * We are about to start releasing blocks in the bitmap,
@@ -517,7 +684,7 @@ do_more:
                /*
                 * An HJ special.  This is expensive...
                 */
-#ifdef CONFIG_JBD_DEBUG
+#ifdef CONFIG_JBD2_DEBUG
                jbd_unlock_bh_state(bitmap_bh);
                {
                        struct buffer_head *debug_bh;
@@ -586,8 +753,9 @@ do_more:
        desc->bg_free_blocks_count =
                cpu_to_le16(le16_to_cpu(desc->bg_free_blocks_count) +
                        group_freed);
+       desc->bg_checksum = ext4_group_desc_csum(sbi, block_group, desc);
        spin_unlock(sb_bgl_lock(sbi, block_group));
-       percpu_counter_mod(&sbi->s_freeblocks_counter, count);
+       percpu_counter_add(&sbi->s_freeblocks_counter, count);
 
        /* We dirtied the bitmap block */
        BUFFER_TRACE(bitmap_bh, "dirtied bitmap block");
@@ -747,7 +915,7 @@ find_next_usable_block(ext4_grpblk_t start, struct buffer_head *bh,
                here = 0;
 
        p = ((char *)bh->b_data) + (here >> 3);
-       r = memscan(p, 0, (maxblocks - here + 7) >> 3);
+       r = memscan(p, 0, ((maxblocks + 7) >> 3) - (here >> 3));
        next = (r - ((char *)bh->b_data)) << 3;
 
        if (next < maxblocks && next >= start && ext4_test_allocatable(next, bh))
@@ -817,9 +985,10 @@ claim_block(spinlock_t *lock, ext4_grpblk_t block, struct buffer_head *bh)
  * ext4_journal_release_buffer(), else we'll run out of credits.
  */
 static ext4_grpblk_t
-ext4_try_to_allocate(struct super_block *sb, handle_t *handle, int group,
-                       struct buffer_head *bitmap_bh, ext4_grpblk_t grp_goal,
-                       unsigned long *count, struct ext4_reserve_window *my_rsv)
+ext4_try_to_allocate(struct super_block *sb, handle_t *handle,
+                       ext4_group_t group, struct buffer_head *bitmap_bh,
+                       ext4_grpblk_t grp_goal, unsigned long *count,
+                       struct ext4_reserve_window *my_rsv)
 {
        ext4_fsblk_t group_first_block;
        ext4_grpblk_t start, end;
@@ -966,7 +1135,7 @@ static int find_next_reservable_window(
 
                prev = rsv;
                next = rb_next(&rsv->rsv_node);
-               rsv = list_entry(next,struct ext4_reserve_window_node,rsv_node);
+               rsv = rb_entry(next,struct ext4_reserve_window_node,rsv_node);
 
                /*
                 * Reached the last reservation, we can just append to the
@@ -1053,7 +1222,7 @@ static int find_next_reservable_window(
  */
 static int alloc_new_reservation(struct ext4_reserve_window_node *my_rsv,
                ext4_grpblk_t grp_goal, struct super_block *sb,
-               unsigned int group, struct buffer_head *bitmap_bh)
+               ext4_group_t group, struct buffer_head *bitmap_bh)
 {
        struct ext4_reserve_window_node *search_head;
        ext4_fsblk_t group_first_block, group_end_block, start_block;
@@ -1165,7 +1334,7 @@ retry:
         * check if the first free block is within the
         * free space we just reserved
         */
-       if (start_block >= my_rsv->rsv_start && start_block < my_rsv->rsv_end)
+       if (start_block >= my_rsv->rsv_start && start_block <= my_rsv->rsv_end)
                return 0;               /* success */
        /*
         * if the first free bit we found is out of the reservable space
@@ -1210,7 +1379,7 @@ static void try_to_extend_reservation(struct ext4_reserve_window_node *my_rsv,
        if (!next)
                my_rsv->rsv_end += size;
        else {
-               next_rsv = list_entry(next, struct ext4_reserve_window_node, rsv_node);
+               next_rsv = rb_entry(next, struct ext4_reserve_window_node, rsv_node);
 
                if ((next_rsv->rsv_start - my_rsv->rsv_end - 1) >= size)
                        my_rsv->rsv_end += size;
@@ -1251,7 +1420,7 @@ static void try_to_extend_reservation(struct ext4_reserve_window_node *my_rsv,
  */
 static ext4_grpblk_t
 ext4_try_to_allocate_with_rsv(struct super_block *sb, handle_t *handle,
-                       unsigned int group, struct buffer_head *bitmap_bh,
+                       ext4_group_t group, struct buffer_head *bitmap_bh,
                        ext4_grpblk_t grp_goal,
                        struct ext4_reserve_window_node * my_rsv,
                        unsigned long *count, int *errp)
@@ -1288,7 +1457,7 @@ ext4_try_to_allocate_with_rsv(struct super_block *sb, handle_t *handle,
        }
        /*
         * grp_goal is a group relative block number (if there is a goal)
-        * 0 < grp_goal < EXT4_BLOCKS_PER_GROUP(sb)
+        * 0 <= grp_goal < EXT4_BLOCKS_PER_GROUP(sb)
         * first block is a filesystem wide block number
         * first block is the block number of the first block in this group
         */
@@ -1324,10 +1493,14 @@ ext4_try_to_allocate_with_rsv(struct super_block *sb, handle_t *handle,
                        if (!goal_in_my_reservation(&my_rsv->rsv_window,
                                                        grp_goal, group, sb))
                                grp_goal = -1;
-               } else if (grp_goal > 0 &&
-                         (my_rsv->rsv_end-grp_goal+1) < *count)
-                       try_to_extend_reservation(my_rsv, sb,
-                                       *count-my_rsv->rsv_end + grp_goal - 1);
+               } else if (grp_goal >= 0) {
+                       int curr = my_rsv->rsv_end -
+                                       (grp_goal + group_first_block) + 1;
+
+                       if (curr < *count)
+                               try_to_extend_reservation(my_rsv, sb,
+                                                       *count - curr);
+               }
 
                if ((my_rsv->rsv_start > group_last_block) ||
                                (my_rsv->rsv_end < group_first_block)) {
@@ -1421,12 +1594,12 @@ ext4_fsblk_t ext4_new_blocks(handle_t *handle, struct inode *inode,
 {
        struct buffer_head *bitmap_bh = NULL;
        struct buffer_head *gdp_bh;
-       unsigned long group_no;
-       int goal_group;
+       ext4_group_t group_no;
+       ext4_group_t goal_group;
        ext4_grpblk_t grp_target_blk;   /* blockgroup relative goal block */
        ext4_grpblk_t grp_alloc_blk;    /* blockgroup-relative allocated block*/
        ext4_fsblk_t ret_block;         /* filesyetem-wide allocated block */
-       int bgi;                        /* blockgroup iteration index */
+       ext4_group_t bgi;                       /* blockgroup iteration index */
        int fatal = 0, err;
        int performed_allocation = 0;
        ext4_grpblk_t free_blocks;      /* number of free blocks in a group */
@@ -1437,10 +1610,7 @@ ext4_fsblk_t ext4_new_blocks(handle_t *handle, struct inode *inode,
        struct ext4_reserve_window_node *my_rsv = NULL;
        struct ext4_block_alloc_info *block_i;
        unsigned short windowsz = 0;
-#ifdef EXT4FS_DEBUG
-       static int goal_hits, goal_attempts;
-#endif
-       unsigned long ngroups;
+       ext4_group_t ngroups;
        unsigned long num = *count;
 
        *errp = -ENOSPC;
@@ -1460,7 +1630,7 @@ ext4_fsblk_t ext4_new_blocks(handle_t *handle, struct inode *inode,
 
        sbi = EXT4_SB(sb);
        es = EXT4_SB(sb)->s_es;
-       ext4_debug("goal=%lu.\n", goal);
+       ext4_debug("goal=%llu.\n", goal);
        /*
         * Allocate a block from reservation only when
         * filesystem is mounted with reservation(default,-o reservation), and
@@ -1525,10 +1695,8 @@ retry_alloc:
                if (group_no >= ngroups)
                        group_no = 0;
                gdp = ext4_get_group_desc(sb, group_no, &gdp_bh);
-               if (!gdp) {
-                       *errp = -EIO;
-                       goto out;
-               }
+               if (!gdp)
+                       goto io_error;
                free_blocks = le16_to_cpu(gdp->bg_free_blocks_count);
                /*
                 * skip this group if the number of
@@ -1562,6 +1730,7 @@ retry_alloc:
         */
        if (my_rsv) {
                my_rsv = NULL;
+               windowsz = 0;
                group_no = goal_group;
                goto retry_alloc;
        }
@@ -1571,7 +1740,7 @@ retry_alloc:
 
 allocated:
 
-       ext4_debug("using block group %d(%d)\n",
+       ext4_debug("using block group %lu(%d)\n",
                        group_no, gdp->bg_free_blocks_count);
 
        BUFFER_TRACE(gdp_bh, "get_write_access");
@@ -1582,19 +1751,21 @@ allocated:
        ret_block = grp_alloc_blk + ext4_group_first_block_no(sb, group_no);
 
        if (in_range(ext4_block_bitmap(sb, gdp), ret_block, num) ||
-           in_range(ext4_block_bitmap(sb, gdp), ret_block, num) ||
+           in_range(ext4_inode_bitmap(sb, gdp), ret_block, num) ||
            in_range(ret_block, ext4_inode_table(sb, gdp),
                     EXT4_SB(sb)->s_itb_per_group) ||
            in_range(ret_block + num - 1, ext4_inode_table(sb, gdp),
-                    EXT4_SB(sb)->s_itb_per_group))
+                    EXT4_SB(sb)->s_itb_per_group)) {
                ext4_error(sb, "ext4_new_block",
                            "Allocating block in system zone - "
                            "blocks from %llu, length %lu",
                             ret_block, num);
+               goto out;
+       }
 
        performed_allocation = 1;
 
-#ifdef CONFIG_JBD_DEBUG
+#ifdef CONFIG_JBD2_DEBUG
        {
                struct buffer_head *debug_bh;
 
@@ -1637,14 +1808,14 @@ allocated:
         * list of some description.  We don't know in advance whether
         * the caller wants to use it as metadata or data.
         */
-       ext4_debug("allocating block %lu. Goal hits %d of %d.\n",
-                       ret_block, goal_hits, goal_attempts);
-
        spin_lock(sb_bgl_lock(sbi, group_no));
+       if (gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT))
+               gdp->bg_flags &= cpu_to_le16(~EXT4_BG_BLOCK_UNINIT);
        gdp->bg_free_blocks_count =
                        cpu_to_le16(le16_to_cpu(gdp->bg_free_blocks_count)-num);
+       gdp->bg_checksum = ext4_group_desc_csum(sbi, group_no, gdp);
        spin_unlock(sb_bgl_lock(sbi, group_no));
-       percpu_counter_mod(&sbi->s_freeblocks_counter, -num);
+       percpu_counter_sub(&sbi->s_freeblocks_counter, num);
 
        BUFFER_TRACE(gdp_bh, "journal_dirty_metadata for group descriptor");
        err = ext4_journal_dirty_metadata(handle, gdp_bh);
@@ -1695,8 +1866,8 @@ ext4_fsblk_t ext4_count_free_blocks(struct super_block *sb)
 {
        ext4_fsblk_t desc_count;
        struct ext4_group_desc *gdp;
-       int i;
-       unsigned long ngroups = EXT4_SB(sb)->s_groups_count;
+       ext4_group_t i;
+       ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count;
 #ifdef EXT4FS_DEBUG
        struct ext4_super_block *es;
        ext4_fsblk_t bitmap_count;
@@ -1720,14 +1891,14 @@ ext4_fsblk_t ext4_count_free_blocks(struct super_block *sb)
                        continue;
 
                x = ext4_count_free(bitmap_bh, sb->s_blocksize);
-               printk("group %d: stored = %d, counted = %lu\n",
+               printk(KERN_DEBUG "group %lu: stored = %d, counted = %lu\n",
                        i, le16_to_cpu(gdp->bg_free_blocks_count), x);
                bitmap_count += x;
        }
        brelse(bitmap_bh);
        printk("ext4_count_free_blocks: stored = %llu"
                ", computed = %llu, %llu\n",
-              EXT4_FREE_BLOCKS_COUNT(es),
+               ext4_free_blocks_count(es),
                desc_count, bitmap_count);
        return bitmap_count;
 #else
@@ -1744,16 +1915,7 @@ ext4_fsblk_t ext4_count_free_blocks(struct super_block *sb)
 #endif
 }
 
-static inline int
-block_in_use(ext4_fsblk_t block, struct super_block *sb, unsigned char *map)
-{
-       ext4_grpblk_t offset;
-
-       ext4_get_group_no_and_offset(sb, block, NULL, &offset);
-       return ext4_test_bit (offset, map);
-}
-
-static inline int test_root(int a, int b)
+static inline int test_root(ext4_group_t a, int b)
 {
        int num = b;
 
@@ -1762,7 +1924,7 @@ static inline int test_root(int a, int b)
        return num == a;
 }
 
-static int ext4_group_sparse(int group)
+static int ext4_group_sparse(ext4_group_t group)
 {
        if (group <= 1)
                return 1;
@@ -1780,7 +1942,7 @@ static int ext4_group_sparse(int group)
  *     Return the number of blocks used by the superblock (primary or backup)
  *     in this group.  Currently this will be only 0 or 1.
  */
-int ext4_bg_has_super(struct super_block *sb, int group)
+int ext4_bg_has_super(struct super_block *sb, ext4_group_t group)
 {
        if (EXT4_HAS_RO_COMPAT_FEATURE(sb,
                                EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER) &&
@@ -1789,18 +1951,20 @@ int ext4_bg_has_super(struct super_block *sb, int group)
        return 1;
 }
 
-static unsigned long ext4_bg_num_gdb_meta(struct super_block *sb, int group)
+static unsigned long ext4_bg_num_gdb_meta(struct super_block *sb,
+                                       ext4_group_t group)
 {
        unsigned long metagroup = group / EXT4_DESC_PER_BLOCK(sb);
-       unsigned long first = metagroup * EXT4_DESC_PER_BLOCK(sb);
-       unsigned long last = first + EXT4_DESC_PER_BLOCK(sb) - 1;
+       ext4_group_t first = metagroup * EXT4_DESC_PER_BLOCK(sb);
+       ext4_group_t last = first + EXT4_DESC_PER_BLOCK(sb) - 1;
 
        if (group == first || group == first + 1 || group == last)
                return 1;
        return 0;
 }
 
-static unsigned long ext4_bg_num_gdb_nometa(struct super_block *sb, int group)
+static unsigned long ext4_bg_num_gdb_nometa(struct super_block *sb,
+                                       ext4_group_t group)
 {
        if (EXT4_HAS_RO_COMPAT_FEATURE(sb,
                                EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER) &&
@@ -1818,7 +1982,7 @@ static unsigned long ext4_bg_num_gdb_nometa(struct super_block *sb, int group)
  *     (primary or backup) in this group.  In the future there may be a
  *     different number of descriptor blocks in each group.
  */
-unsigned long ext4_bg_num_gdb(struct super_block *sb, int group)
+unsigned long ext4_bg_num_gdb(struct super_block *sb, ext4_group_t group)
 {
        unsigned long first_meta_bg =
                        le32_to_cpu(EXT4_SB(sb)->s_es->s_first_meta_bg);
This page took 0.061195 seconds and 4 git commands to generate.