|
@@ -110,6 +110,35 @@ static struct file_system_type ext3_fs_type = {
|
|
#define IS_EXT3_SB(sb) (0)
|
|
#define IS_EXT3_SB(sb) (0)
|
|
#endif
|
|
#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,
|
|
ext4_fsblk_t ext4_block_bitmap(struct super_block *sb,
|
|
struct ext4_group_desc *bg)
|
|
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++)
|
|
for (i = 0; i < sbi->s_gdb_count; i++)
|
|
brelse(sbi->s_group_desc[i]);
|
|
brelse(sbi->s_group_desc[i]);
|
|
kfree(sbi->s_group_desc);
|
|
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_freeblocks_counter);
|
|
percpu_counter_destroy(&sbi->s_freeinodes_counter);
|
|
percpu_counter_destroy(&sbi->s_freeinodes_counter);
|
|
percpu_counter_destroy(&sbi->s_dirs_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) <<
|
|
((le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks) + 1) <<
|
|
EXT4_DESC_PER_BLOCK_BITS(sb))) / groups_per_flex;
|
|
EXT4_DESC_PER_BLOCK_BITS(sb))) / groups_per_flex;
|
|
size = flex_group_count * sizeof(struct flex_groups);
|
|
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) {
|
|
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++) {
|
|
for (i = 0; i < sbi->s_groups_count; i++) {
|
|
@@ -3750,12 +3772,8 @@ failed_mount_wq:
|
|
}
|
|
}
|
|
failed_mount3:
|
|
failed_mount3:
|
|
del_timer(&sbi->s_err_report);
|
|
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_freeblocks_counter);
|
|
percpu_counter_destroy(&sbi->s_freeinodes_counter);
|
|
percpu_counter_destroy(&sbi->s_freeinodes_counter);
|
|
percpu_counter_destroy(&sbi->s_dirs_counter);
|
|
percpu_counter_destroy(&sbi->s_dirs_counter);
|