[PATCH] ext4: move block number hi bits

move '_hi' bits of block numbers in the larger part of the
block group descriptor structure

Signed-off-by: Alexandre Ratchov <alexandre.ratchov@bull.net>
Signed-off-by: Dave Kleikamp <shaggy@austin.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Alexandre Ratchov 2006-10-11 01:21:15 -07:00 committed by Linus Torvalds
parent 0d1ee42f27
commit 8fadc14323
6 changed files with 64 additions and 46 deletions

View File

@ -101,13 +101,13 @@ read_block_bitmap(struct super_block *sb, unsigned int block_group)
desc = ext4_get_group_desc (sb, block_group, NULL); desc = ext4_get_group_desc (sb, block_group, NULL);
if (!desc) if (!desc)
goto error_out; goto error_out;
bh = sb_bread(sb, ext4_block_bitmap(desc)); bh = sb_bread(sb, ext4_block_bitmap(sb, desc));
if (!bh) if (!bh)
ext4_error (sb, "read_block_bitmap", ext4_error (sb, "read_block_bitmap",
"Cannot read block bitmap - " "Cannot read block bitmap - "
"block_group = %d, block_bitmap = %llu", "block_group = %d, block_bitmap = %llu",
block_group, block_group,
ext4_block_bitmap(desc)); ext4_block_bitmap(sb, desc));
error_out: error_out:
return bh; return bh;
} }
@ -463,10 +463,10 @@ do_more:
if (!desc) if (!desc)
goto error_return; goto error_return;
if (in_range(ext4_block_bitmap(desc), block, count) || if (in_range(ext4_block_bitmap(sb, desc), block, count) ||
in_range(ext4_inode_bitmap(desc), block, count) || in_range(ext4_inode_bitmap(sb, desc), block, count) ||
in_range(block, ext4_inode_table(desc), sbi->s_itb_per_group) || in_range(block, ext4_inode_table(sb, desc), sbi->s_itb_per_group) ||
in_range(block + count - 1, ext4_inode_table(desc), 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", ext4_error (sb, "ext4_free_blocks",
"Freeing blocks in system zones - " "Freeing blocks in system zones - "
@ -1563,11 +1563,11 @@ allocated:
ret_block = grp_alloc_blk + ext4_group_first_block_no(sb, group_no); ret_block = grp_alloc_blk + ext4_group_first_block_no(sb, group_no);
if (in_range(ext4_block_bitmap(gdp), ret_block, num) || if (in_range(ext4_block_bitmap(sb, gdp), ret_block, num) ||
in_range(ext4_block_bitmap(gdp), ret_block, num) || in_range(ext4_block_bitmap(sb, gdp), ret_block, num) ||
in_range(ret_block, ext4_inode_table(gdp), in_range(ret_block, ext4_inode_table(sb, gdp),
EXT4_SB(sb)->s_itb_per_group) || EXT4_SB(sb)->s_itb_per_group) ||
in_range(ret_block + num - 1, ext4_inode_table(gdp), 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", ext4_error(sb, "ext4_new_block",
"Allocating block in system zone - " "Allocating block in system zone - "

View File

@ -60,12 +60,12 @@ read_inode_bitmap(struct super_block * sb, unsigned long block_group)
if (!desc) if (!desc)
goto error_out; goto error_out;
bh = sb_bread(sb, ext4_inode_bitmap(desc)); bh = sb_bread(sb, ext4_inode_bitmap(sb, desc));
if (!bh) if (!bh)
ext4_error(sb, "read_inode_bitmap", ext4_error(sb, "read_inode_bitmap",
"Cannot read inode bitmap - " "Cannot read inode bitmap - "
"block_group = %lu, inode_bitmap = %llu", "block_group = %lu, inode_bitmap = %llu",
block_group, ext4_inode_bitmap(desc)); block_group, ext4_inode_bitmap(sb, desc));
error_out: error_out:
return bh; return bh;
} }

View File

@ -2439,9 +2439,8 @@ static ext4_fsblk_t ext4_get_inode_block(struct super_block *sb,
*/ */
offset = ((ino - 1) % EXT4_INODES_PER_GROUP(sb)) * offset = ((ino - 1) % EXT4_INODES_PER_GROUP(sb)) *
EXT4_INODE_SIZE(sb); EXT4_INODE_SIZE(sb);
block = ext4_inode_table(gdp) + (offset >> EXT4_BLOCK_SIZE_BITS(sb)); block = ext4_inode_table(sb, gdp) +
(offset >> EXT4_BLOCK_SIZE_BITS(sb));
iloc->block_group = block_group; iloc->block_group = block_group;
iloc->offset = offset & (EXT4_BLOCK_SIZE(sb) - 1); iloc->offset = offset & (EXT4_BLOCK_SIZE(sb) - 1);
@ -2508,7 +2507,7 @@ static int __ext4_get_inode_loc(struct inode *inode,
goto make_io; goto make_io;
bitmap_bh = sb_getblk(inode->i_sb, bitmap_bh = sb_getblk(inode->i_sb,
ext4_inode_bitmap(desc)); ext4_inode_bitmap(inode->i_sb, desc));
if (!bitmap_bh) if (!bitmap_bh)
goto make_io; goto make_io;

View File

@ -834,9 +834,9 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
/* Update group descriptor block for new group */ /* Update group descriptor block for new group */
gdp = (struct ext4_group_desc *)primary->b_data + gdb_off; gdp = (struct ext4_group_desc *)primary->b_data + gdb_off;
ext4_block_bitmap_set(gdp, input->block_bitmap); /* LV FIXME */ ext4_block_bitmap_set(sb, gdp, input->block_bitmap); /* LV FIXME */
ext4_inode_bitmap_set(gdp, input->inode_bitmap); /* LV FIXME */ ext4_inode_bitmap_set(sb, gdp, input->inode_bitmap); /* LV FIXME */
ext4_inode_table_set(gdp, input->inode_table); /* LV FIXME */ ext4_inode_table_set(sb, gdp, input->inode_table); /* LV FIXME */
gdp->bg_free_blocks_count = cpu_to_le16(input->free_blocks_count); gdp->bg_free_blocks_count = cpu_to_le16(input->free_blocks_count);
gdp->bg_free_inodes_count = cpu_to_le16(EXT4_INODES_PER_GROUP(sb)); gdp->bg_free_inodes_count = cpu_to_le16(EXT4_INODES_PER_GROUP(sb));

View File

@ -63,40 +63,52 @@ static void ext4_write_super (struct super_block * sb);
static void ext4_write_super_lockfs(struct super_block *sb); static void ext4_write_super_lockfs(struct super_block *sb);
ext4_fsblk_t ext4_block_bitmap(struct ext4_group_desc *bg) ext4_fsblk_t ext4_block_bitmap(struct super_block *sb,
struct ext4_group_desc *bg)
{ {
return le32_to_cpu(bg->bg_block_bitmap) | return le32_to_cpu(bg->bg_block_bitmap) |
((ext4_fsblk_t)le16_to_cpu(bg->bg_block_bitmap_hi) << 32); (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ?
(ext4_fsblk_t)le32_to_cpu(bg->bg_block_bitmap_hi) << 32 : 0);
} }
ext4_fsblk_t ext4_inode_bitmap(struct ext4_group_desc *bg) ext4_fsblk_t ext4_inode_bitmap(struct super_block *sb,
struct ext4_group_desc *bg)
{ {
return le32_to_cpu(bg->bg_inode_bitmap) | return le32_to_cpu(bg->bg_inode_bitmap) |
((ext4_fsblk_t)le16_to_cpu(bg->bg_inode_bitmap_hi) << 32); (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ?
(ext4_fsblk_t)le32_to_cpu(bg->bg_inode_bitmap_hi) << 32 : 0);
} }
ext4_fsblk_t ext4_inode_table(struct ext4_group_desc *bg) ext4_fsblk_t ext4_inode_table(struct super_block *sb,
struct ext4_group_desc *bg)
{ {
return le32_to_cpu(bg->bg_inode_table) | return le32_to_cpu(bg->bg_inode_table) |
((ext4_fsblk_t)le16_to_cpu(bg->bg_inode_table_hi) << 32); (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ?
(ext4_fsblk_t)le32_to_cpu(bg->bg_inode_table_hi) << 32 : 0);
} }
void ext4_block_bitmap_set(struct ext4_group_desc *bg, ext4_fsblk_t blk) void ext4_block_bitmap_set(struct super_block *sb,
struct ext4_group_desc *bg, ext4_fsblk_t blk)
{ {
bg->bg_block_bitmap = cpu_to_le32((u32)blk); bg->bg_block_bitmap = cpu_to_le32((u32)blk);
bg->bg_block_bitmap_hi = cpu_to_le16(blk >> 32); if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT)
bg->bg_block_bitmap_hi = cpu_to_le32(blk >> 32);
} }
void ext4_inode_bitmap_set(struct ext4_group_desc *bg, ext4_fsblk_t blk) void ext4_inode_bitmap_set(struct super_block *sb,
struct ext4_group_desc *bg, ext4_fsblk_t blk)
{ {
bg->bg_inode_bitmap = cpu_to_le32((u32)blk); bg->bg_inode_bitmap = cpu_to_le32((u32)blk);
bg->bg_inode_bitmap_hi = cpu_to_le16(blk >> 32); if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT)
bg->bg_inode_bitmap_hi = cpu_to_le32(blk >> 32);
} }
void ext4_inode_table_set(struct ext4_group_desc *bg, ext4_fsblk_t blk) void ext4_inode_table_set(struct super_block *sb,
struct ext4_group_desc *bg, ext4_fsblk_t blk)
{ {
bg->bg_inode_table = cpu_to_le32((u32)blk); bg->bg_inode_table = cpu_to_le32((u32)blk);
bg->bg_inode_table_hi = cpu_to_le16(blk >> 32); if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT)
bg->bg_inode_table_hi = cpu_to_le32(blk >> 32);
} }
/* /*
@ -1239,7 +1251,7 @@ static int ext4_check_descriptors (struct super_block * sb)
if ((i % EXT4_DESC_PER_BLOCK(sb)) == 0) if ((i % EXT4_DESC_PER_BLOCK(sb)) == 0)
gdp = (struct ext4_group_desc *) gdp = (struct ext4_group_desc *)
sbi->s_group_desc[desc_block++]->b_data; sbi->s_group_desc[desc_block++]->b_data;
block_bitmap = ext4_block_bitmap(gdp); block_bitmap = ext4_block_bitmap(sb, gdp);
if (block_bitmap < first_block || block_bitmap > last_block) if (block_bitmap < first_block || block_bitmap > last_block)
{ {
ext4_error (sb, "ext4_check_descriptors", ext4_error (sb, "ext4_check_descriptors",
@ -1248,7 +1260,7 @@ static int ext4_check_descriptors (struct super_block * sb)
i, block_bitmap); i, block_bitmap);
return 0; return 0;
} }
inode_bitmap = ext4_inode_bitmap(gdp); inode_bitmap = ext4_inode_bitmap(sb, gdp);
if (inode_bitmap < first_block || inode_bitmap > last_block) if (inode_bitmap < first_block || inode_bitmap > last_block)
{ {
ext4_error (sb, "ext4_check_descriptors", ext4_error (sb, "ext4_check_descriptors",
@ -1257,7 +1269,7 @@ static int ext4_check_descriptors (struct super_block * sb)
i, inode_bitmap); i, inode_bitmap);
return 0; return 0;
} }
inode_table = ext4_inode_table(gdp); inode_table = ext4_inode_table(sb, gdp);
if (inode_table < first_block || if (inode_table < first_block ||
inode_table + sbi->s_itb_per_group > last_block) inode_table + sbi->s_itb_per_group > last_block)
{ {
@ -1622,11 +1634,11 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
} }
sbi->s_desc_size = le16_to_cpu(es->s_desc_size); sbi->s_desc_size = le16_to_cpu(es->s_desc_size);
if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_64BIT)) { if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_64BIT)) {
if (sbi->s_desc_size < EXT4_MIN_DESC_SIZE || if (sbi->s_desc_size < EXT4_MIN_DESC_SIZE_64BIT ||
sbi->s_desc_size > EXT4_MAX_DESC_SIZE || sbi->s_desc_size > EXT4_MAX_DESC_SIZE ||
sbi->s_desc_size & (sbi->s_desc_size - 1)) { sbi->s_desc_size & (sbi->s_desc_size - 1)) {
printk(KERN_ERR printk(KERN_ERR
"EXT4-fs: unsupported descriptor size %ld\n", "EXT4-fs: unsupported descriptor size %lu\n",
sbi->s_desc_size); sbi->s_desc_size);
goto failed_mount; goto failed_mount;
} }

View File

@ -129,10 +129,10 @@ struct ext4_group_desc
__le16 bg_free_inodes_count; /* Free inodes count */ __le16 bg_free_inodes_count; /* Free inodes count */
__le16 bg_used_dirs_count; /* Directories count */ __le16 bg_used_dirs_count; /* Directories count */
__u16 bg_flags; __u16 bg_flags;
__le16 bg_block_bitmap_hi; /* Blocks bitmap block MSB */ __u32 bg_reserved[3];
__le16 bg_inode_bitmap_hi; /* Inodes bitmap block MSB */ __le32 bg_block_bitmap_hi; /* Blocks bitmap block MSB */
__le16 bg_inode_table_hi; /* Inodes table block MSB */ __le32 bg_inode_bitmap_hi; /* Inodes bitmap block MSB */
__u16 bg_reserved[3]; __le32 bg_inode_table_hi; /* Inodes table block MSB */
}; };
#ifdef __KERNEL__ #ifdef __KERNEL__
@ -143,6 +143,7 @@ struct ext4_group_desc
* Macro-instructions used to manage group descriptors * Macro-instructions used to manage group descriptors
*/ */
#define EXT4_MIN_DESC_SIZE 32 #define EXT4_MIN_DESC_SIZE 32
#define EXT4_MIN_DESC_SIZE_64BIT 64
#define EXT4_MAX_DESC_SIZE EXT4_MIN_BLOCK_SIZE #define EXT4_MAX_DESC_SIZE EXT4_MIN_BLOCK_SIZE
#define EXT4_DESC_SIZE(s) (EXT4_SB(s)->s_desc_size) #define EXT4_DESC_SIZE(s) (EXT4_SB(s)->s_desc_size)
#ifdef __KERNEL__ #ifdef __KERNEL__
@ -904,12 +905,18 @@ extern void ext4_abort (struct super_block *, const char *, const char *, ...)
extern void ext4_warning (struct super_block *, const char *, const char *, ...) extern void ext4_warning (struct super_block *, const char *, const char *, ...)
__attribute__ ((format (printf, 3, 4))); __attribute__ ((format (printf, 3, 4)));
extern void ext4_update_dynamic_rev (struct super_block *sb); extern void ext4_update_dynamic_rev (struct super_block *sb);
extern ext4_fsblk_t ext4_block_bitmap(struct ext4_group_desc *bg); extern ext4_fsblk_t ext4_block_bitmap(struct super_block *sb,
extern ext4_fsblk_t ext4_inode_bitmap(struct ext4_group_desc *bg); struct ext4_group_desc *bg);
extern ext4_fsblk_t ext4_inode_table(struct ext4_group_desc *bg); extern ext4_fsblk_t ext4_inode_bitmap(struct super_block *sb,
extern void ext4_block_bitmap_set(struct ext4_group_desc *bg, ext4_fsblk_t blk); struct ext4_group_desc *bg);
extern void ext4_inode_bitmap_set(struct ext4_group_desc *bg, ext4_fsblk_t blk); extern ext4_fsblk_t ext4_inode_table(struct super_block *sb,
extern void ext4_inode_table_set(struct ext4_group_desc *bg, ext4_fsblk_t blk); struct ext4_group_desc *bg);
extern void ext4_block_bitmap_set(struct super_block *sb,
struct ext4_group_desc *bg, ext4_fsblk_t blk);
extern void ext4_inode_bitmap_set(struct super_block *sb,
struct ext4_group_desc *bg, ext4_fsblk_t blk);
extern void ext4_inode_table_set(struct super_block *sb,
struct ext4_group_desc *bg, ext4_fsblk_t blk);
static inline ext4_fsblk_t ext4_blocks_count(struct ext4_super_block *es) static inline ext4_fsblk_t ext4_blocks_count(struct ext4_super_block *es)
{ {