ext4: use ext4_grpblk_t more extensively
PATCH 2/2 ext4: use ext4_grpblk_t more extensively
unsigned short is potentially too small to track blocks within a group; today it is safe due to restrictions in e2fsprogs but we have _lo / _hi bits for group blocks with the intent to go up to 32 bits, so clean this up now.
There are many more places where we use unsigned/int/unsigned int to contain a group block but this should at least fix all the short types.
I added a few comments to the struct ext4_group_info definition as well.
Signed-off-by Eric Sandeen <[email protected]>
---
fs/ext4/ext4.h +7 -4
@@ -1573,15 +1573,18 @@ static inline void ext4_update_i_disksize(struct inode *inode, loff_t newsize)struct ext4_group_info {unsigned long bb_state;struct rb_root bb_free_root; -unsigned short bb_first_free; -unsigned short bb_free; -unsigned short bb_fragments; +ext4_grpblk_t bb_first_free;/* first free block */ +ext4_grpblk_t bb_free;/* total free blocks */ +ext4_grpblk_t bb_fragments;/* nr of freespace fragments */ struct list_head bb_prealloc_list;#ifdef DOUBLE_CHECK void *bb_bitmap;#endif struct rw_semaphore alloc_sem; -unsigned short bb_counters[]; +ext4_grpblk_t bb_counters[];/* Nr of free power-of-two-block +* regions, index is order. +* bb_counters[3] = 5 means +* 5 free 8-block regions. */ };#define EXT4_GROUP_INFO_NEED_INIT_BIT 0
fs/ext4/mballoc.c +9 -9
@@ -622,13 +622,13 @@ static int __mb_check_buddy(struct ext4_buddy *e4b, char *file,/* FIXME!! need more doc */ static void ext4_mb_mark_free_simple (struct super_block *sb, -void *buddy,unsigned first,int len, +void *buddy,ext4_grpblk_t first,ext4_grpblk_t len,struct ext4_group_info *grp) {struct ext4_sb_info *sbi =EXT4_SB (sb); -unsigned short min; -unsigned short max; -unsigned short chunk; +ext4_grpblk_t min; +ext4_grpblk_t max; +ext4_grpblk_t chunk;unsigned short border;BUG_ON (len >EXT4_BLOCKS_PER_GROUP (sb));
@@ -662,10 +662,10 @@ void ext4_mb_generate_buddy(struct super_block *sb, void *buddy, void *bitmap, ext4_group_t group) { struct ext4_group_info *grp = ext4_get_group_info(sb, group); -unsigned short max =EXT4_BLOCKS_PER_GROUP (sb); -unsigned short i =0 ; -unsigned short first; -unsigned short len; +ext4_grpblk_t max =EXT4_BLOCKS_PER_GROUP (sb); +ext4_grpblk_t i =0 ; +ext4_grpblk_t first; +ext4_grpblk_t len;unsigned free =0 ;unsigned fragments =0 ;unsigned long long period =get_cycles ();
@@ -2329,7 +2329,7 @@ static int ext4_mb_seq_groups_show(struct seq_file *seq, void *v)struct ext4_buddy e4b;struct sg {struct ext4_group_info info; -unsigned short counters[16 ]; +ext4_grpblk_t counters[16 ]; } sg; group--;
fs/ext4/mballoc.h +3 -3
@@ -128,8 +128,8 @@ struct ext4_prealloc_space {unsigned pa_deleted;ext4_fsblk_t pa_pstart;/* phys. block */ ext4_lblk_t pa_lstart;/* log. block */ -unsigned short pa_len;/* len of preallocated chunk */ -unsigned short pa_free;/* how many blocks are free */ +ext4_grpblk_t pa_len;/* len of preallocated chunk */ +ext4_grpblk_t pa_free;/* how many blocks are free */ unsigned short pa_type;/* pa type. inode or group */ spinlock_t *pa_obj_lock;struct inode *pa_inode;/* hack, for history only */
@@ -144,7 +144,7 @@ struct ext4_free_extent {ext4_lblk_t fe_logical;ext4_grpblk_t fe_start;ext4_group_t fe_group; -int fe_len; +ext4_grpblk_t fe_len; };/*
Quoted 4 lines · Eric Sandeen
unsigned short is potentially too small to track blocks within a group; today it is safe due to restrictions in e2fsprogs but we have
_lo/_hibits for group blocks with the intent to go up to 32 bits, so clean this up now.
Thanks, applied.
- Ted