diff options
Diffstat (limited to 'fs/ext4/super.c')
| -rw-r--r-- | fs/ext4/super.c | 54 | 
1 files changed, 36 insertions, 18 deletions
| diff --git a/fs/ext4/super.c b/fs/ext4/super.c index cfe9f39c4ba2..658f5864e9cf 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -110,6 +110,35 @@ static struct file_system_type ext3_fs_type = {  #define IS_EXT3_SB(sb) (0)  #endif +void *ext4_kvmalloc(size_t size, gfp_t flags) +{ +	void *ret; + +	ret = kmalloc(size, flags); +	if (!ret) +		ret = __vmalloc(size, flags, PAGE_KERNEL); +	return ret; +} + +void *ext4_kvzalloc(size_t size, gfp_t flags) +{ +	void *ret; + +	ret = kmalloc(size, flags); +	if (!ret) +		ret = __vmalloc(size, flags | __GFP_ZERO, PAGE_KERNEL); +	return ret; +} + +void ext4_kvfree(void *ptr) +{ +	if (is_vmalloc_addr(ptr)) +		vfree(ptr); +	else +		kfree(ptr); + +} +  ext4_fsblk_t ext4_block_bitmap(struct super_block *sb,  			       struct ext4_group_desc *bg)  { @@ -791,10 +820,7 @@ static void ext4_put_super(struct super_block *sb)  	for (i = 0; i < sbi->s_gdb_count; i++)  		brelse(sbi->s_group_desc[i]);  	kfree(sbi->s_group_desc); -	if (is_vmalloc_addr(sbi->s_flex_groups)) -		vfree(sbi->s_flex_groups); -	else -		kfree(sbi->s_flex_groups); +	ext4_kvfree(sbi->s_flex_groups);  	percpu_counter_destroy(&sbi->s_freeblocks_counter);  	percpu_counter_destroy(&sbi->s_freeinodes_counter);  	percpu_counter_destroy(&sbi->s_dirs_counter); @@ -1977,15 +2003,11 @@ static int ext4_fill_flex_info(struct super_block *sb)  			((le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks) + 1) <<  			      EXT4_DESC_PER_BLOCK_BITS(sb))) / groups_per_flex;  	size = flex_group_count * sizeof(struct flex_groups); -	sbi->s_flex_groups = kzalloc(size, GFP_KERNEL); +	sbi->s_flex_groups = ext4_kvzalloc(size, GFP_KERNEL);  	if (sbi->s_flex_groups == NULL) { -		sbi->s_flex_groups = vzalloc(size); -		if (sbi->s_flex_groups == NULL) { -			ext4_msg(sb, KERN_ERR, -				 "not enough memory for %u flex groups", -				 flex_group_count); -			goto failed; -		} +		ext4_msg(sb, KERN_ERR, "not enough memory for %u flex groups", +			 flex_group_count); +		goto failed;  	}  	for (i = 0; i < sbi->s_groups_count; i++) { @@ -3750,12 +3772,8 @@ failed_mount_wq:  	}  failed_mount3:  	del_timer(&sbi->s_err_report); -	if (sbi->s_flex_groups) { -		if (is_vmalloc_addr(sbi->s_flex_groups)) -			vfree(sbi->s_flex_groups); -		else -			kfree(sbi->s_flex_groups); -	} +	if (sbi->s_flex_groups) +		ext4_kvfree(sbi->s_flex_groups);  	percpu_counter_destroy(&sbi->s_freeblocks_counter);  	percpu_counter_destroy(&sbi->s_freeinodes_counter);  	percpu_counter_destroy(&sbi->s_dirs_counter); | 
