]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/ext4/ialloc.c
[POWERPC] Fix bugs in the hypervisor call stats code
[linux-2.6-omap-h63xx.git] / fs / ext4 / ialloc.c
index 34d39ae966f71102fc181cfb0800fdad29ce6709..c88b439ba5cd5838d264450746c450cc45245c16 100644 (file)
@@ -23,7 +23,7 @@
 #include <linux/buffer_head.h>
 #include <linux/random.h>
 #include <linux/bitops.h>
-
+#include <linux/blkdev.h>
 #include <asm/byteorder.h>
 
 #include "xattr.h"
@@ -60,12 +60,12 @@ read_inode_bitmap(struct super_block * sb, unsigned long block_group)
        if (!desc)
                goto error_out;
 
-       bh = sb_bread(sb, le32_to_cpu(desc->bg_inode_bitmap));
+       bh = sb_bread(sb, ext4_inode_bitmap(sb, desc));
        if (!bh)
                ext4_error(sb, "read_inode_bitmap",
                            "Cannot read inode bitmap - "
-                           "block_group = %lu, inode_bitmap = %u",
-                           block_group, le32_to_cpu(desc->bg_inode_bitmap));
+                           "block_group = %lu, inode_bitmap = %llu",
+                           block_group, ext4_inode_bitmap(sb, desc));
 error_out:
        return bh;
 }
@@ -274,7 +274,8 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent)
        freei = percpu_counter_read_positive(&sbi->s_freeinodes_counter);
        avefreei = freei / ngroups;
        freeb = percpu_counter_read_positive(&sbi->s_freeblocks_counter);
-       avefreeb = freeb / ngroups;
+       avefreeb = freeb;
+       do_div(avefreeb, ngroups);
        ndirs = percpu_counter_read_positive(&sbi->s_dirs_counter);
 
        if ((parent == sb->s_root->d_inode) ||
@@ -303,13 +304,15 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent)
                goto fallback;
        }
 
-       blocks_per_dir = (le32_to_cpu(es->s_blocks_count) - freeb) / ndirs;
+       blocks_per_dir = ext4_blocks_count(es) - freeb;
+       do_div(blocks_per_dir, ndirs);
 
        max_dirs = ndirs / ngroups + inodes_per_group / 16;
        min_inodes = avefreei - inodes_per_group / 4;
        min_blocks = avefreeb - EXT4_BLOCKS_PER_GROUP(sb) / 4;
 
-       max_debt = EXT4_BLOCKS_PER_GROUP(sb) / max(blocks_per_dir, (ext4_fsblk_t)BLOCK_COST);
+       max_debt = EXT4_BLOCKS_PER_GROUP(sb);
+       max_debt /= max_t(int, blocks_per_dir, BLOCK_COST);
        if (max_debt * INODE_COST > inodes_per_group)
                max_debt = inodes_per_group / INODE_COST;
        if (max_debt > 255)
@@ -615,6 +618,17 @@ got:
                ext4_std_error(sb, err);
                goto fail_free_drop;
        }
+       if (test_opt(sb, EXTENTS)) {
+               EXT4_I(inode)->i_flags |= EXT4_EXTENTS_FL;
+               ext4_ext_tree_init(handle, inode);
+               if (!EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)) {
+                       err = ext4_journal_get_write_access(handle, EXT4_SB(sb)->s_sbh);
+                       if (err) goto fail;
+                       EXT4_SET_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS);
+                       BUFFER_TRACE(EXT4_SB(sb)->s_sbh, "call ext4_journal_dirty_metadata");
+                       err = ext4_journal_dirty_metadata(handle, EXT4_SB(sb)->s_sbh);
+               }
+       }
 
        ext4_debug("allocating inode %lu\n", inode->i_ino);
        goto really_out;