Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ext4: use ext4_kvzalloc()/ext4_kvmalloc() for s_group_desc and s_group_info

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>

+15 -13
+3 -3
fs/ext4/mballoc.c
··· 2331 2331 /* An 8TB filesystem with 64-bit pointers requires a 4096 byte 2332 2332 * kmalloc. A 128kb malloc should suffice for a 256TB filesystem. 2333 2333 * So a two level scheme suffices for now. */ 2334 - sbi->s_group_info = kzalloc(array_size, GFP_KERNEL); 2334 + sbi->s_group_info = ext4_kvzalloc(array_size, GFP_KERNEL); 2335 2335 if (sbi->s_group_info == NULL) { 2336 2336 printk(KERN_ERR "EXT4-fs: can't allocate buddy meta group\n"); 2337 2337 return -ENOMEM; ··· 2365 2365 kfree(sbi->s_group_info[i]); 2366 2366 iput(sbi->s_buddy_cache); 2367 2367 err_freesgi: 2368 - kfree(sbi->s_group_info); 2368 + ext4_kvfree(sbi->s_group_info); 2369 2369 return -ENOMEM; 2370 2370 } 2371 2371 ··· 2559 2559 EXT4_DESC_PER_BLOCK_BITS(sb); 2560 2560 for (i = 0; i < num_meta_group_infos; i++) 2561 2561 kfree(sbi->s_group_info[i]); 2562 - kfree(sbi->s_group_info); 2562 + ext4_kvfree(sbi->s_group_info); 2563 2563 } 2564 2564 kfree(sbi->s_mb_offsets); 2565 2565 kfree(sbi->s_mb_maxs);
+7 -6
fs/ext4/resize.c
··· 467 467 if (unlikely(err)) 468 468 goto exit_dindj; 469 469 470 - n_group_desc = kmalloc((gdb_num + 1) * sizeof(struct buffer_head *), 471 - GFP_NOFS); 470 + n_group_desc = ext4_kvmalloc((gdb_num + 1) * 471 + sizeof(struct buffer_head *), 472 + GFP_NOFS); 472 473 if (!n_group_desc) { 473 474 err = -ENOMEM; 474 - ext4_warning(sb, 475 - "not enough memory for %lu groups", gdb_num + 1); 475 + ext4_warning(sb, "not enough memory for %lu groups", 476 + gdb_num + 1); 476 477 goto exit_inode; 477 478 } 478 479 ··· 508 507 n_group_desc[gdb_num] = gdb_bh; 509 508 EXT4_SB(sb)->s_group_desc = n_group_desc; 510 509 EXT4_SB(sb)->s_gdb_count++; 511 - kfree(o_group_desc); 510 + ext4_kvfree(o_group_desc); 512 511 513 512 le16_add_cpu(&es->s_reserved_gdt_blocks, -1); 514 513 err = ext4_handle_dirty_metadata(handle, NULL, EXT4_SB(sb)->s_sbh); ··· 518 517 return err; 519 518 520 519 exit_inode: 521 - kfree(n_group_desc); 520 + ext4_kvfree(n_group_desc); 522 521 /* ext4_handle_release_buffer(handle, iloc.bh); */ 523 522 brelse(iloc.bh); 524 523 exit_dindj:
+5 -4
fs/ext4/super.c
··· 819 819 820 820 for (i = 0; i < sbi->s_gdb_count; i++) 821 821 brelse(sbi->s_group_desc[i]); 822 - kfree(sbi->s_group_desc); 822 + ext4_kvfree(sbi->s_group_desc); 823 823 ext4_kvfree(sbi->s_flex_groups); 824 824 percpu_counter_destroy(&sbi->s_freeblocks_counter); 825 825 percpu_counter_destroy(&sbi->s_freeinodes_counter); ··· 3439 3439 (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb))); 3440 3440 db_count = (sbi->s_groups_count + EXT4_DESC_PER_BLOCK(sb) - 1) / 3441 3441 EXT4_DESC_PER_BLOCK(sb); 3442 - sbi->s_group_desc = kmalloc(db_count * sizeof(struct buffer_head *), 3443 - GFP_KERNEL); 3442 + sbi->s_group_desc = ext4_kvmalloc(db_count * 3443 + sizeof(struct buffer_head *), 3444 + GFP_KERNEL); 3444 3445 if (sbi->s_group_desc == NULL) { 3445 3446 ext4_msg(sb, KERN_ERR, "not enough memory"); 3446 3447 goto failed_mount; ··· 3784 3783 failed_mount2: 3785 3784 for (i = 0; i < db_count; i++) 3786 3785 brelse(sbi->s_group_desc[i]); 3787 - kfree(sbi->s_group_desc); 3786 + ext4_kvfree(sbi->s_group_desc); 3788 3787 failed_mount: 3789 3788 if (sbi->s_proc) { 3790 3789 remove_proc_entry(sb->s_id, ext4_proc_root);