1 Index: linux-stage/fs/ext4/super.c
2 ===================================================================
3 --- linux-stage.orig/fs/ext4/super.c
4 +++ linux-stage/fs/ext4/super.c
5 @@ -662,7 +662,12 @@ static void ext4_put_super(struct super_
7 for (i = 0; i < sbi->s_gdb_count; i++)
8 brelse(sbi->s_group_desc[i]);
9 - kfree(sbi->s_group_desc);
11 + if (is_vmalloc_addr(sbi->s_group_desc))
12 + vfree(sbi->s_group_desc);
14 + kfree(sbi->s_group_desc);
16 if (is_vmalloc_addr(sbi->s_flex_groups))
17 vfree(sbi->s_flex_groups);
19 @@ -2402,12 +2407,13 @@ static int ext4_fill_super(struct super_
20 unsigned long offset = 0;
21 unsigned long journal_devnum = 0;
22 unsigned long def_mount_opts;
24 + struct inode *root = NULL;
29 unsigned int db_count;
32 int needs_recovery, has_huge_files;
34 @@ -2718,10 +2724,16 @@ static int ext4_fill_super(struct super_
35 (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb)));
36 db_count = (sbi->s_groups_count + EXT4_DESC_PER_BLOCK(sb) - 1) /
37 EXT4_DESC_PER_BLOCK(sb);
38 - sbi->s_group_desc = kmalloc(db_count * sizeof(struct buffer_head *),
40 + size = (size_t) db_count * sizeof(struct buffer_head *);
41 + sbi->s_group_desc = kzalloc(size, GFP_KERNEL);
42 + if (sbi->s_group_desc == NULL) {
43 + sbi->s_group_desc = vmalloc(size);
44 + if (sbi->s_group_desc != NULL)
45 + memset(sbi->s_group_desc, 0, size);
47 if (sbi->s_group_desc == NULL) {
48 - ext4_msg(sb, KERN_ERR, "not enough memory");
49 + ext4_msg(sb, KERN_ERR, "not enough memory for %u groups (%u)\n",
50 + sbi->s_groups_count, (unsigned int) size);
54 @@ -2907,17 +2919,16 @@ no_journal:
56 ext4_msg(sb, KERN_ERR, "get root inode failed");
61 if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) {
63 ext4_msg(sb, KERN_ERR, "corrupt root inode, run e2fsck");
66 sb->s_root = d_alloc_root(root);
68 ext4_msg(sb, KERN_ERR, "get root dentry failed");
73 @@ -2968,6 +2979,7 @@ no_journal:
75 ext4_msg(sb, KERN_ERR, "failed to initalize mballoc (%d)",
81 @@ -3011,6 +3023,8 @@ cantfind_ext4:
87 ext4_msg(sb, KERN_ERR, "mount failed");
88 destroy_workqueue(EXT4_SB(sb)->dio_unwritten_wq);
90 @@ -3033,7 +3047,11 @@ failed_mount3:
92 for (i = 0; i < db_count; i++)
93 brelse(sbi->s_group_desc[i]);
94 - kfree(sbi->s_group_desc);
96 + if (is_vmalloc_addr(sbi->s_group_desc))
97 + vfree(sbi->s_group_desc);
99 + kfree(sbi->s_group_desc);
102 remove_proc_entry(sb->s_id, ext4_proc_root);
103 Index: linux-stage/fs/ext4/mballoc.c
104 ===================================================================
105 --- linux-stage.orig/fs/ext4/mballoc.c
106 +++ linux-stage/fs/ext4/mballoc.c
107 @@ -2607,10 +2607,21 @@ static int ext4_mb_init_backend(struct s
108 while (array_size < sizeof(*sbi->s_group_info) *
109 num_meta_group_infos_max)
110 array_size = array_size << 1;
111 - /* An 8TB filesystem with 64-bit pointers requires a 4096 byte
112 - * kmalloc. A 128kb malloc should suffice for a 256TB filesystem.
113 - * So a two level scheme suffices for now. */
114 - sbi->s_group_info = kmalloc(array_size, GFP_KERNEL);
117 + * A 16TB filesystem with 64-bit pointers requires an 8192 byte
118 + * kmalloc(). Filesystems larger than 2^32 blocks (16TB normally)
119 + * have group descriptors at least twice as large (64 bytes or
120 + * more vs. 32 bytes for traditional ext3 filesystems, so a 128TB
121 + * filesystem needs a 128kB allocation, which may need vmalloc().
123 + sbi->s_group_info = kzalloc(array_size, GFP_KERNEL);
124 + if (sbi->s_group_info == NULL) {
125 + sbi->s_group_info = vmalloc(array_size);
126 + if (sbi->s_group_info != NULL)
127 + memset(sbi->s_group_info, 0, array_size);
130 if (sbi->s_group_info == NULL) {
131 printk(KERN_ERR "EXT4-fs: can't allocate buddy meta group\n");
133 @@ -2620,6 +2631,11 @@ static int ext4_mb_init_backend(struct s
134 printk(KERN_ERR "EXT4-fs: can't get new inode\n");
138 + * To avoid colliding with an valid on-disk inode number,
139 + * EXT4_BAD_INO is used here as the number of the buddy cache inode.
141 + sbi->s_buddy_cache->i_ino = EXT4_BAD_INO;
142 EXT4_I(sbi->s_buddy_cache)->i_disksize = 0;
143 for (i = 0; i < ngroups; i++) {
144 desc = ext4_get_group_desc(sb, i, NULL);
145 @@ -2642,7 +2658,10 @@ err_freebuddy:
146 kfree(sbi->s_group_info[i]);
147 iput(sbi->s_buddy_cache);
149 - kfree(sbi->s_group_info);
150 + if (is_vmalloc_addr(sbi->s_group_info))
151 + vfree(sbi->s_group_info);
153 + kfree(sbi->s_group_info);
157 @@ -2683,14 +2702,6 @@ int ext4_mb_init(struct super_block *sb,
159 } while (i <= sb->s_blocksize_bits + 1);
161 - /* init file for buddy data */
162 - ret = ext4_mb_init_backend(sb);
164 - kfree(sbi->s_mb_offsets);
165 - kfree(sbi->s_mb_maxs);
169 spin_lock_init(&sbi->s_md_lock);
170 spin_lock_init(&sbi->s_bal_lock);
172 @@ -2717,6 +2728,14 @@ int ext4_mb_init(struct super_block *sb,
173 spin_lock_init(&lg->lg_prealloc_lock);
176 + /* init file for buddy data */
177 + ret = ext4_mb_init_backend(sb);
179 + kfree(sbi->s_mb_offsets);
180 + kfree(sbi->s_mb_maxs);
184 ext4_mb_history_init(sb);
187 @@ -2766,7 +2785,10 @@ int ext4_mb_release(struct super_block *
188 EXT4_DESC_PER_BLOCK_BITS(sb);
189 for (i = 0; i < num_meta_group_infos; i++)
190 kfree(sbi->s_group_info[i]);
191 - kfree(sbi->s_group_info);
192 + if (is_vmalloc_addr(sbi->s_group_info))
193 + vfree(sbi->s_group_info);
195 + kfree(sbi->s_group_info);
197 kfree(sbi->s_mb_offsets);
198 kfree(sbi->s_mb_maxs);