ext4_group_t: Add new type
PATCH 1/3 ext4_group_t: Add new type
I have updated the group number type patches with a new name for the type.
Changed type name from ext4_grpnum_t to ext4_group_t.
The patches have been tested with regular fsx and fsstress tests of the patch queue. These patches are based on the current ext4-patch-queue, and replace the current grpnum_t patches currently in the queue.
Thanks
Avantika
---
Ext4: add ext4_group_t, and change all group variables to this type.
From: Avantika Mathur <[email protected]>
In many places variables for block group are of type int, which limits the maximum number of block groups to 2^31. Each block group can have up to 2^15 blocks, with a 4K block size, and the max filesystem size is limited to 2^31 * (2^15 * 2^12) = 2^58 -- or 256 PB
This patch introduces a new type ext4_group_t, of type unsigned long, to represent block group numbers in ext4.
All occurrences of block group variables are converted to type ext4_group_t.
---
fs/ext4/balloc.c | 71 +++++++++++++++++++++------------------------ fs/ext4/group.h | 8 +++-- fs/ext4/ialloc.c | 46 +++++++++++++++-------------- fs/ext4/inode.c | 5 +-- fs/ext4/resize.c | 12 +++---- fs/ext4/super.c | 20 +++++------- include/linux/ext4_fs.h | 11 +++--- include/linux/ext4_fs_i.h | 5 ++- include/linux/ext4_fs_sb.h | 2 - 9 files changed, 92 insertions(+), 88 deletions(-)
fs/ext4/balloc.c +34 -37
@@ -29,7 +29,7 @@* 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;ext4_grpblk_t offset;
@@ -46,7 +46,7 @@/* 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, -int block_group,struct ext4_group_desc *gdp) +ext4_group_t block_group,struct ext4_group_desc *gdp) {unsigned long start;int bit, bit_max;
@@ -60,7 +60,7 @@* 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 %u\n" , block_group); +"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 ;
@@ -153,7 +153,7 @@* 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;
@@ -164,7 +164,7 @@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 ;
@@ -176,7 +176,7 @@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 ; }
@@ -209,7 +209,7 @@* Return buffer_head on success or NULL in case of failure. */ struct buffer_head * -read_block_bitmap (struct super_block *sb,unsigned int block_group) +read_block_bitmap (struct super_block *sb,ext4_group_t block_group) {int i;struct ext4_group_desc * desc;
@@ -237,7 +237,7 @@if (!bh)ext4_error (sb, __FUNCTION__,"Cannot read block bitmap - " -"block_group = %d, block_bitmap = %llu" , +"block_group = %lu, block_bitmap = %llu" , block_group, bitmap_blk);/* check whether block bitmap block number is set */
@@ -267,7 +267,7 @@brelse (bh);ext4_error (sb, __FUNCTION__,"Invalid block bitmap - " -"block_group = %d, block = %llu" , +"block_group = %lu, block = %llu" , block_group, bitmap_blk);return NULL ;
@@ -361,7 +361,7 @@*/ 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;
@@ -581,7 +581,7 @@ {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;
@@ -961,9 +961,10 @@* 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;
@@ -1197,7 +1198,7 @@*/ 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;
@@ -1395,7 +1396,7 @@*/ 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)
@@ -1569,12 +1570,12 @@ {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 */
@@ -1585,10 +1586,7 @@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 ;
@@ -1784,9 +1782,6 @@* 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 );
@@ -1845,8 +1840,8 @@ {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;
@@ -1870,7 +1865,7 @@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; }
@@ -1894,7 +1889,7 @@#endif } -static inline int test_root (int a,int b) +static inline int test_root (ext4_group_t a,int b) {int num = b;
@@ -1903,7 +1898,7 @@return num == a; } -static int ext4_group_sparse (int group) +static int ext4_group_sparse (ext4_group_t group) {if (group <=1 )return 1 ;
@@ -1921,7 +1916,7 @@* 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) &&
@@ -1930,18 +1925,20 @@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) &&
@@ -1959,7 +1956,7 @@* (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);
fs/ext4/group.h +5 -3
@@ -14,14 +14,16 @@extern int ext4_group_desc_csum_verify (struct ext4_sb_info *sbi,__u32 group,struct ext4_group_desc *gdp);struct buffer_head *read_block_bitmap (struct super_block *sb, -unsigned int block_group); +ext4_group_t block_group);extern unsigned ext4_init_block_bitmap (struct super_block *sb, -struct buffer_head *bh,int group, +struct buffer_head *bh, +ext4_group_t group,struct ext4_group_desc *desc);#define ext4_free_blocks_after_init (sb, group, desc) \ ext4_init_block_bitmap(sb, NULL, group, desc)extern unsigned ext4_init_inode_bitmap (struct super_block *sb, -struct buffer_head *bh,int group, +struct buffer_head *bh, +ext4_group_t group,struct ext4_group_desc *desc);extern void mark_bitmap_end (int start_bit,int end_bit,char *bitmap);#endif /* _LINUX_EXT4_GROUP_H */
fs/ext4/ialloc.c +24 -22
138 lines not on this page · raw message
fs/ext4/inode.c +3 -2
@@ -2464,7 +2464,8 @@static ext4_fsblk_t ext4_get_inode_block (struct super_block *sb,unsigned long ino,struct ext4_iloc *iloc) { -unsigned long desc, group_desc, block_group; +unsigned long desc, group_desc; +ext4_group_t block_group;unsigned long offset;ext4_fsblk_t block;struct buffer_head *bh;
@@ -2551,7 +2552,7 @@struct ext4_group_desc *desc;int inodes_per_buffer;int inode_offset, i; -int block_group; +ext4_group_t block_group;int start; block_group = (inode->i_ino - 1) /
fs/ext4/resize.c +6 -6
@@ -28,7 +28,7 @@struct ext4_super_block *es = sbi->s_es;ext4_fsblk_t start =ext4_blocks_count (es);ext4_fsblk_t end = start + input->blocks_count; -unsigned group = input->group; +ext4_group_t group = input->group;ext4_fsblk_t itend = input->inode_table + sbi->s_itb_per_group; unsigned overhead = ext4_bg_has_super(sb, group) ? (1 + ext4_bg_num_gdb(sb, group) +
@@ -357,7 +357,7 @@ struct buffer_head *primary) {const ext4_fsblk_t blk = primary->b_blocknr; -const unsigned long end =EXT4_SB (sb)->s_groups_count; +const ext4_group_t end =EXT4_SB (sb)->s_groups_count;unsigned three =1 ;unsigned five =5 ;unsigned seven =7 ;
@@ -656,12 +656,12 @@ int blk_off, char *data, int size) { struct ext4_sb_info *sbi = EXT4_SB(sb); -const unsigned long last = sbi->s_groups_count; +const ext4_group_t last = sbi->s_groups_count;const int bpg =EXT4_BLOCKS_PER_GROUP (sb);unsigned three =1 ;unsigned five =5 ;unsigned seven =7 ; -unsigned group; +ext4_group_t group;int rest = sb->s_blocksize - size;handle_t *handle;int err =0 , err2;
@@ -716,7 +716,7 @@ exit_err:if (err) {ext4_warning (sb, __FUNCTION__, -"can't update backup for group %d (err %d), " +"can't update backup for group %lu (err %d), " "forcing fsck on next reboot" , group, err); sbi->s_mount_state &= ~EXT4_VALID_FS ; sbi->s_es->s_state &=cpu_to_le16 (~EXT4_VALID_FS );
@@ -952,7 +952,7 @@ ext4_fsblk_t n_blocks_count) {ext4_fsblk_t o_blocks_count; -unsigned long o_groups_count; +ext4_group_t o_groups_count;ext4_grpblk_t last;ext4_grpblk_t add;struct buffer_head * bh;
fs/ext4/super.c +9 -11
@@ -1364,7 +1364,7 @@struct ext4_group_desc * gdp =NULL ;int desc_block =0 ;int flexbg_flag =0 ; -int i; +ext4_group_t i;if (EXT4_HAS_INCOMPAT_FEATURE (sb,EXT4_FEATURE_INCOMPAT_FLEX_BG )) flexbg_flag =1 ;
@@ -1386,7 +1386,7 @@if (block_bitmap < first_block || block_bitmap > last_block) {ext4_error (sb,"ext4_check_descriptors" , -"Block bitmap for group %d" +"Block bitmap for group %lu" " not in group (block %llu)!" , i, block_bitmap);return 0 ;
@@ -1395,7 +1395,7 @@if (inode_bitmap < first_block || inode_bitmap > last_block) {ext4_error (sb,"ext4_check_descriptors" , -"Inode bitmap for group %d" +"Inode bitmap for group %lu" " not in group (block %llu)!" , i, inode_bitmap);return 0 ;
@@ -1405,17 +1405,16 @@ inode_table + sbi->s_itb_per_group - 1 > last_block) {ext4_error (sb,"ext4_check_descriptors" , -"Inode table for group %d" +"Inode table for group %lu" " not in group (block %llu)!" , i, inode_table);return 0 ; }if (!ext4_group_desc_csum_verify (sbi, i, gdp)) {ext4_error (sb, __FUNCTION__, -"Checksum for group %d failed (%u!=%u)\n" , i, -le16_to_cpu (ext4_group_desc_csum (sbi, i, - gdp)), -le16_to_cpu (gdp->bg_checksum)); +"Checksum for group %lu failed (%u!=%u)\n" , + i,le16_to_cpu (ext4_group_desc_csum (sbi, i, + gdp)),le16_to_cpu (gdp->bg_checksum));return 0 ; }if (!flexbg_flag)
@@ -1429,7 +1428,6 @@return 1 ; } -/* ext4_orphan_cleanup() walks a singly-linked list of inodes (starting at * the superblock) which were deleted from all directories, but held open by * a process at the time of a crash. We walk the list and try to delete these
@@ -1570,7 +1568,7 @@ ext4_fsblk_t logical_sb_block, int nr) {struct ext4_sb_info *sbi =EXT4_SB (sb); -unsigned long bg, first_meta_bg; +ext4_group_t bg, first_meta_bg;int has_super =0 ; first_meta_bg =le32_to_cpu (sbi->s_es->s_first_meta_bg);
@@ -2678,7 +2676,7 @@if (test_opt (sb,MINIX_DF )) { sbi->s_overhead_last =0 ; }else if (sbi->s_blocks_last !=ext4_blocks_count (es)) { -unsigned long ngroups = sbi->s_groups_count, i; +ext4_group_t ngroups = sbi->s_groups_count, i;ext4_fsblk_t overhead =0 ;smp_rmb ();
include/linux/ext4_fs.h +6 -5
@@ -830,7 +830,7 @@ {struct buffer_head *bh;unsigned long offset; -unsigned long block_group; +ext4_group_t block_group; };static inline struct ext4_inode *ext4_raw_inode (struct ext4_iloc *iloc)
@@ -855,7 +855,7 @@/* calculate the first block number of the group */ static inline ext4_fsblk_t -ext4_group_first_block_no (struct super_block *sb,unsigned long group_no) +ext4_group_first_block_no (struct super_block *sb,ext4_group_t group_no) {return group_no * (ext4_fsblk_t )EXT4_BLOCKS_PER_GROUP (sb) +le32_to_cpu (EXT4_SB (sb)->s_es->s_first_data_block);
@@ -886,8 +886,9 @@ ext4_fsblk_t blocknr);extern ext4_grpblk_t ext4_block_group_offset (struct super_block *sb,ext4_fsblk_t blocknr); -extern int ext4_bg_has_super (struct super_block *sb,int group); -extern unsigned long ext4_bg_num_gdb (struct super_block *sb,int group); +extern int ext4_bg_has_super (struct super_block *sb,ext4_group_t group); +extern unsigned long ext4_bg_num_gdb (struct super_block *sb, +ext4_group_t group);extern ext4_fsblk_t ext4_new_block (handle_t *handle,struct inode *inode,ext4_fsblk_t goal,int *errp); extern ext4_fsblk_t ext4_new_blocks (handle_t *handle, struct inode *inode,
@@ -900,7 +901,7 @@extern ext4_fsblk_t ext4_count_free_blocks (struct super_block *);extern void ext4_check_blocks_bitmap (struct super_block *);extern 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);extern int ext4_should_retry_alloc (struct super_block *sb,int *retries);extern void ext4_init_block_alloc_info (struct inode *);
include/linux/ext4_fs_i.h +4 -1
@@ -30,6 +30,9 @@/* data type for file logical block number */ typedef __u32 ext4_lblk_t ; +/* data type for block group number */ +typedef unsigned long ext4_group_t ; +struct ext4_reserve_window {ext4_fsblk_t _rsv_start;/* First byte reserved */ ext4_fsblk_t _rsv_end;/* Last byte reserved or 0 */
@@ -92,7 +95,7 @@* place a file's data blocks near its inode block, and new inodes * near to their parent directory's inode. */ -__u32 i_block_group; +ext4_group_t i_block_group;__u32 i_state;/* Dynamic state flags for ext4 */ /* block reservation info */
include/linux/ext4_fs_sb.h +1 -1
@@ -35,7 +35,7 @@unsigned long s_itb_per_group;/* Number of inode table blocks per group */ unsigned long s_gdb_count;/* Number of group descriptor blocks */ unsigned long s_desc_per_block;/* Number of group descriptors per block */ -unsigned long s_groups_count;/* Number of groups in the fs */ +ext4_group_t s_groups_count;/* Number of groups in the fs */ unsigned long s_overhead_last;/* Last calculated overhead */ unsigned long s_blocks_last;/* Last seen block count */ struct buffer_head * s_sbh;/* Buffer containing the super block */