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 <sandeen@redhat.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
committed by
Theodore Ts'o
parent
1927805e65
commit
a36b44988c
@@ -1577,15 +1577,18 @@ static inline void ext4_update_i_disksize(struct inode *inode, loff_t newsize)
|
|||||||
struct ext4_group_info {
|
struct ext4_group_info {
|
||||||
unsigned long bb_state;
|
unsigned long bb_state;
|
||||||
struct rb_root bb_free_root;
|
struct rb_root bb_free_root;
|
||||||
unsigned short bb_first_free;
|
ext4_grpblk_t bb_first_free; /* first free block */
|
||||||
unsigned short bb_free;
|
ext4_grpblk_t bb_free; /* total free blocks */
|
||||||
unsigned short bb_fragments;
|
ext4_grpblk_t bb_fragments; /* nr of freespace fragments */
|
||||||
struct list_head bb_prealloc_list;
|
struct list_head bb_prealloc_list;
|
||||||
#ifdef DOUBLE_CHECK
|
#ifdef DOUBLE_CHECK
|
||||||
void *bb_bitmap;
|
void *bb_bitmap;
|
||||||
#endif
|
#endif
|
||||||
struct rw_semaphore alloc_sem;
|
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
|
#define EXT4_GROUP_INFO_NEED_INIT_BIT 0
|
||||||
|
@@ -623,13 +623,13 @@ static int __mb_check_buddy(struct ext4_buddy *e4b, char *file,
|
|||||||
|
|
||||||
/* FIXME!! need more doc */
|
/* FIXME!! need more doc */
|
||||||
static void ext4_mb_mark_free_simple(struct super_block *sb,
|
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_group_info *grp)
|
||||||
{
|
{
|
||||||
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
||||||
unsigned short min;
|
ext4_grpblk_t min;
|
||||||
unsigned short max;
|
ext4_grpblk_t max;
|
||||||
unsigned short chunk;
|
ext4_grpblk_t chunk;
|
||||||
unsigned short border;
|
unsigned short border;
|
||||||
|
|
||||||
BUG_ON(len > EXT4_BLOCKS_PER_GROUP(sb));
|
BUG_ON(len > EXT4_BLOCKS_PER_GROUP(sb));
|
||||||
@@ -663,10 +663,10 @@ void ext4_mb_generate_buddy(struct super_block *sb,
|
|||||||
void *buddy, void *bitmap, ext4_group_t group)
|
void *buddy, void *bitmap, ext4_group_t group)
|
||||||
{
|
{
|
||||||
struct ext4_group_info *grp = ext4_get_group_info(sb, group);
|
struct ext4_group_info *grp = ext4_get_group_info(sb, group);
|
||||||
unsigned short max = EXT4_BLOCKS_PER_GROUP(sb);
|
ext4_grpblk_t max = EXT4_BLOCKS_PER_GROUP(sb);
|
||||||
unsigned short i = 0;
|
ext4_grpblk_t i = 0;
|
||||||
unsigned short first;
|
ext4_grpblk_t first;
|
||||||
unsigned short len;
|
ext4_grpblk_t len;
|
||||||
unsigned free = 0;
|
unsigned free = 0;
|
||||||
unsigned fragments = 0;
|
unsigned fragments = 0;
|
||||||
unsigned long long period = get_cycles();
|
unsigned long long period = get_cycles();
|
||||||
@@ -2325,7 +2325,7 @@ static int ext4_mb_seq_groups_show(struct seq_file *seq, void *v)
|
|||||||
struct ext4_buddy e4b;
|
struct ext4_buddy e4b;
|
||||||
struct sg {
|
struct sg {
|
||||||
struct ext4_group_info info;
|
struct ext4_group_info info;
|
||||||
unsigned short counters[16];
|
ext4_grpblk_t counters[16];
|
||||||
} sg;
|
} sg;
|
||||||
|
|
||||||
group--;
|
group--;
|
||||||
|
@@ -136,8 +136,8 @@ struct ext4_prealloc_space {
|
|||||||
unsigned pa_deleted;
|
unsigned pa_deleted;
|
||||||
ext4_fsblk_t pa_pstart; /* phys. block */
|
ext4_fsblk_t pa_pstart; /* phys. block */
|
||||||
ext4_lblk_t pa_lstart; /* log. block */
|
ext4_lblk_t pa_lstart; /* log. block */
|
||||||
unsigned short pa_len; /* len of preallocated chunk */
|
ext4_grpblk_t pa_len; /* len of preallocated chunk */
|
||||||
unsigned short pa_free; /* how many blocks are free */
|
ext4_grpblk_t pa_free; /* how many blocks are free */
|
||||||
unsigned short pa_type; /* pa type. inode or group */
|
unsigned short pa_type; /* pa type. inode or group */
|
||||||
spinlock_t *pa_obj_lock;
|
spinlock_t *pa_obj_lock;
|
||||||
struct inode *pa_inode; /* hack, for history only */
|
struct inode *pa_inode; /* hack, for history only */
|
||||||
@@ -152,7 +152,7 @@ struct ext4_free_extent {
|
|||||||
ext4_lblk_t fe_logical;
|
ext4_lblk_t fe_logical;
|
||||||
ext4_grpblk_t fe_start;
|
ext4_grpblk_t fe_start;
|
||||||
ext4_group_t fe_group;
|
ext4_group_t fe_group;
|
||||||
int fe_len;
|
ext4_grpblk_t fe_len;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user