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

f2fs: use kvmalloc, if kmalloc is failed

One report says memalloc failure during mount.

(unwind_backtrace) from [<c010cd4c>] (show_stack+0x10/0x14)
(show_stack) from [<c049c6b8>] (dump_stack+0x8c/0xa0)
(dump_stack) from [<c024fcf0>] (warn_alloc+0xc4/0x160)
(warn_alloc) from [<c0250218>] (__alloc_pages_nodemask+0x3f4/0x10d0)
(__alloc_pages_nodemask) from [<c0270450>] (kmalloc_order_trace+0x2c/0x120)
(kmalloc_order_trace) from [<c03fa748>] (build_node_manager+0x35c/0x688)
(build_node_manager) from [<c03de494>] (f2fs_fill_super+0xf0c/0x16cc)
(f2fs_fill_super) from [<c02a5864>] (mount_bdev+0x15c/0x188)
(mount_bdev) from [<c03da624>] (f2fs_mount+0x18/0x20)
(f2fs_mount) from [<c02a68b8>] (mount_fs+0x158/0x19c)
(mount_fs) from [<c02c3c9c>] (vfs_kern_mount+0x78/0x134)
(vfs_kern_mount) from [<c02c76ac>] (do_mount+0x474/0xca4)
(do_mount) from [<c02c8264>] (SyS_mount+0x94/0xbc)
(SyS_mount) from [<c0108180>] (ret_fast_syscall+0x0/0x48)

Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>

+76 -70
+3 -3
fs/f2fs/acl.c
··· 160 160 return (void *)f2fs_acl; 161 161 162 162 fail: 163 - kfree(f2fs_acl); 163 + kvfree(f2fs_acl); 164 164 return ERR_PTR(-EINVAL); 165 165 } 166 166 ··· 190 190 acl = NULL; 191 191 else 192 192 acl = ERR_PTR(retval); 193 - kfree(value); 193 + kvfree(value); 194 194 195 195 return acl; 196 196 } ··· 240 240 241 241 error = f2fs_setxattr(inode, name_index, "", value, size, ipage, 0); 242 242 243 - kfree(value); 243 + kvfree(value); 244 244 if (!error) 245 245 set_cached_acl(inode, type, acl); 246 246
+1 -1
fs/f2fs/checkpoint.c
··· 911 911 f2fs_put_page(cp1, 1); 912 912 f2fs_put_page(cp2, 1); 913 913 fail_no_cp: 914 - kfree(sbi->ckpt); 914 + kvfree(sbi->ckpt); 915 915 return -EINVAL; 916 916 } 917 917
+1 -1
fs/f2fs/data.c
··· 2573 2573 bio->bi_private = dio->orig_private; 2574 2574 bio->bi_end_io = dio->orig_end_io; 2575 2575 2576 - kfree(dio); 2576 + kvfree(dio); 2577 2577 2578 2578 bio_endio(bio); 2579 2579 }
+1 -1
fs/f2fs/debug.c
··· 503 503 list_del(&si->stat_list); 504 504 mutex_unlock(&f2fs_stat_mutex); 505 505 506 - kfree(si); 506 + kvfree(si); 507 507 } 508 508 509 509 int __init f2fs_create_root_stats(void)
+8 -2
fs/f2fs/f2fs.h
··· 1630 1630 if (lock) 1631 1631 spin_lock_irqsave(&sbi->cp_lock, flags); 1632 1632 __clear_ckpt_flags(F2FS_CKPT(sbi), CP_NAT_BITS_FLAG); 1633 - kfree(NM_I(sbi)->nat_bits); 1633 + kvfree(NM_I(sbi)->nat_bits); 1634 1634 NM_I(sbi)->nat_bits = NULL; 1635 1635 if (lock) 1636 1636 spin_unlock_irqrestore(&sbi->cp_lock, flags); ··· 2704 2704 static inline void *f2fs_kmalloc(struct f2fs_sb_info *sbi, 2705 2705 size_t size, gfp_t flags) 2706 2706 { 2707 + void *ret; 2708 + 2707 2709 if (time_to_inject(sbi, FAULT_KMALLOC)) { 2708 2710 f2fs_show_injection_info(FAULT_KMALLOC); 2709 2711 return NULL; 2710 2712 } 2711 2713 2712 - return kmalloc(size, flags); 2714 + ret = kmalloc(size, flags); 2715 + if (ret) 2716 + return ret; 2717 + 2718 + return kvmalloc(size, flags); 2713 2719 } 2714 2720 2715 2721 static inline void *f2fs_kzalloc(struct f2fs_sb_info *sbi,
+2 -2
fs/f2fs/gc.c
··· 142 142 "f2fs_gc-%u:%u", MAJOR(dev), MINOR(dev)); 143 143 if (IS_ERR(gc_th->f2fs_gc_task)) { 144 144 err = PTR_ERR(gc_th->f2fs_gc_task); 145 - kfree(gc_th); 145 + kvfree(gc_th); 146 146 sbi->gc_thread = NULL; 147 147 } 148 148 out: ··· 155 155 if (!gc_th) 156 156 return; 157 157 kthread_stop(gc_th->f2fs_gc_task); 158 - kfree(gc_th); 158 + kvfree(gc_th); 159 159 sbi->gc_thread = NULL; 160 160 } 161 161
+2 -2
fs/f2fs/inline.c
··· 501 501 502 502 stat_dec_inline_dir(dir); 503 503 clear_inode_flag(dir, FI_INLINE_DENTRY); 504 - kfree(backup_dentry); 504 + kvfree(backup_dentry); 505 505 return 0; 506 506 recover: 507 507 lock_page(ipage); ··· 512 512 set_page_dirty(ipage); 513 513 f2fs_put_page(ipage, 1); 514 514 515 - kfree(backup_dentry); 515 + kvfree(backup_dentry); 516 516 return err; 517 517 } 518 518
+1 -1
fs/f2fs/namei.c
··· 635 635 f2fs_handle_failed_inode(inode); 636 636 out_free_encrypted_link: 637 637 if (disk_link.name != (unsigned char *)symname) 638 - kfree(disk_link.name); 638 + kvfree(disk_link.name); 639 639 return err; 640 640 } 641 641
+5 -5
fs/f2fs/node.c
··· 3116 3116 3117 3117 for (i = 0; i < nm_i->nat_blocks; i++) 3118 3118 kvfree(nm_i->free_nid_bitmap[i]); 3119 - kfree(nm_i->free_nid_bitmap); 3119 + kvfree(nm_i->free_nid_bitmap); 3120 3120 } 3121 3121 kvfree(nm_i->free_nid_count); 3122 3122 3123 - kfree(nm_i->nat_bitmap); 3124 - kfree(nm_i->nat_bits); 3123 + kvfree(nm_i->nat_bitmap); 3124 + kvfree(nm_i->nat_bits); 3125 3125 #ifdef CONFIG_F2FS_CHECK_FS 3126 - kfree(nm_i->nat_bitmap_mir); 3126 + kvfree(nm_i->nat_bitmap_mir); 3127 3127 #endif 3128 3128 sbi->nm_info = NULL; 3129 - kfree(nm_i); 3129 + kvfree(nm_i); 3130 3130 } 3131 3131 3132 3132 int __init f2fs_create_node_manager_caches(void)
+18 -18
fs/f2fs/segment.c
··· 706 706 "f2fs_flush-%u:%u", MAJOR(dev), MINOR(dev)); 707 707 if (IS_ERR(fcc->f2fs_issue_flush)) { 708 708 err = PTR_ERR(fcc->f2fs_issue_flush); 709 - kfree(fcc); 709 + kvfree(fcc); 710 710 SM_I(sbi)->fcc_info = NULL; 711 711 return err; 712 712 } ··· 725 725 kthread_stop(flush_thread); 726 726 } 727 727 if (free) { 728 - kfree(fcc); 728 + kvfree(fcc); 729 729 SM_I(sbi)->fcc_info = NULL; 730 730 } 731 731 } ··· 2013 2013 "f2fs_discard-%u:%u", MAJOR(dev), MINOR(dev)); 2014 2014 if (IS_ERR(dcc->f2fs_issue_discard)) { 2015 2015 err = PTR_ERR(dcc->f2fs_issue_discard); 2016 - kfree(dcc); 2016 + kvfree(dcc); 2017 2017 SM_I(sbi)->dcc_info = NULL; 2018 2018 return err; 2019 2019 } ··· 2030 2030 2031 2031 f2fs_stop_discard_thread(sbi); 2032 2032 2033 - kfree(dcc); 2033 + kvfree(dcc); 2034 2034 SM_I(sbi)->dcc_info = NULL; 2035 2035 } 2036 2036 ··· 4317 4317 4318 4318 destroy_victim_secmap(sbi); 4319 4319 SM_I(sbi)->dirty_info = NULL; 4320 - kfree(dirty_i); 4320 + kvfree(dirty_i); 4321 4321 } 4322 4322 4323 4323 static void destroy_curseg(struct f2fs_sb_info *sbi) ··· 4329 4329 return; 4330 4330 SM_I(sbi)->curseg_array = NULL; 4331 4331 for (i = 0; i < NR_CURSEG_TYPE; i++) { 4332 - kfree(array[i].sum_blk); 4333 - kfree(array[i].journal); 4332 + kvfree(array[i].sum_blk); 4333 + kvfree(array[i].journal); 4334 4334 } 4335 - kfree(array); 4335 + kvfree(array); 4336 4336 } 4337 4337 4338 4338 static void destroy_free_segmap(struct f2fs_sb_info *sbi) ··· 4343 4343 SM_I(sbi)->free_info = NULL; 4344 4344 kvfree(free_i->free_segmap); 4345 4345 kvfree(free_i->free_secmap); 4346 - kfree(free_i); 4346 + kvfree(free_i); 4347 4347 } 4348 4348 4349 4349 static void destroy_sit_info(struct f2fs_sb_info *sbi) ··· 4356 4356 4357 4357 if (sit_i->sentries) { 4358 4358 for (start = 0; start < MAIN_SEGS(sbi); start++) { 4359 - kfree(sit_i->sentries[start].cur_valid_map); 4359 + kvfree(sit_i->sentries[start].cur_valid_map); 4360 4360 #ifdef CONFIG_F2FS_CHECK_FS 4361 - kfree(sit_i->sentries[start].cur_valid_map_mir); 4361 + kvfree(sit_i->sentries[start].cur_valid_map_mir); 4362 4362 #endif 4363 - kfree(sit_i->sentries[start].ckpt_valid_map); 4364 - kfree(sit_i->sentries[start].discard_map); 4363 + kvfree(sit_i->sentries[start].ckpt_valid_map); 4364 + kvfree(sit_i->sentries[start].discard_map); 4365 4365 } 4366 4366 } 4367 - kfree(sit_i->tmp_map); 4367 + kvfree(sit_i->tmp_map); 4368 4368 4369 4369 kvfree(sit_i->sentries); 4370 4370 kvfree(sit_i->sec_entries); 4371 4371 kvfree(sit_i->dirty_sentries_bitmap); 4372 4372 4373 4373 SM_I(sbi)->sit_info = NULL; 4374 - kfree(sit_i->sit_bitmap); 4374 + kvfree(sit_i->sit_bitmap); 4375 4375 #ifdef CONFIG_F2FS_CHECK_FS 4376 - kfree(sit_i->sit_bitmap_mir); 4376 + kvfree(sit_i->sit_bitmap_mir); 4377 4377 #endif 4378 - kfree(sit_i); 4378 + kvfree(sit_i); 4379 4379 } 4380 4380 4381 4381 void f2fs_destroy_segment_manager(struct f2fs_sb_info *sbi) ··· 4391 4391 destroy_free_segmap(sbi); 4392 4392 destroy_sit_info(sbi); 4393 4393 sbi->sm_info = NULL; 4394 - kfree(sm_info); 4394 + kvfree(sm_info); 4395 4395 } 4396 4396 4397 4397 int __init f2fs_create_segment_manager_caches(void)
+34 -34
fs/f2fs/super.c
··· 289 289 set_opt(sbi, QUOTA); 290 290 return 0; 291 291 errout: 292 - kfree(qname); 292 + kvfree(qname); 293 293 return ret; 294 294 } 295 295 ··· 302 302 " when quota turned on"); 303 303 return -EINVAL; 304 304 } 305 - kfree(F2FS_OPTION(sbi).s_qf_names[qtype]); 305 + kvfree(F2FS_OPTION(sbi).s_qf_names[qtype]); 306 306 F2FS_OPTION(sbi).s_qf_names[qtype] = NULL; 307 307 return 0; 308 308 } ··· 399 399 set_opt(sbi, BG_GC); 400 400 set_opt(sbi, FORCE_FG_GC); 401 401 } else { 402 - kfree(name); 402 + kvfree(name); 403 403 return -EINVAL; 404 404 } 405 - kfree(name); 405 + kvfree(name); 406 406 break; 407 407 case Opt_disable_roll_forward: 408 408 set_opt(sbi, DISABLE_ROLL_FORWARD); ··· 570 570 f2fs_msg(sb, KERN_WARNING, 571 571 "adaptive mode is not allowed with " 572 572 "zoned block device feature"); 573 - kfree(name); 573 + kvfree(name); 574 574 return -EINVAL; 575 575 } 576 576 set_opt_mode(sbi, F2FS_MOUNT_ADAPTIVE); ··· 578 578 !strncmp(name, "lfs", 3)) { 579 579 set_opt_mode(sbi, F2FS_MOUNT_LFS); 580 580 } else { 581 - kfree(name); 581 + kvfree(name); 582 582 return -EINVAL; 583 583 } 584 - kfree(name); 584 + kvfree(name); 585 585 break; 586 586 case Opt_io_size_bits: 587 587 if (args->from && match_int(args, &arg)) ··· 714 714 !strncmp(name, "fs-based", 8)) { 715 715 F2FS_OPTION(sbi).whint_mode = WHINT_MODE_FS; 716 716 } else { 717 - kfree(name); 717 + kvfree(name); 718 718 return -EINVAL; 719 719 } 720 - kfree(name); 720 + kvfree(name); 721 721 break; 722 722 case Opt_alloc: 723 723 name = match_strdup(&args[0]); ··· 731 731 !strncmp(name, "reuse", 5)) { 732 732 F2FS_OPTION(sbi).alloc_mode = ALLOC_MODE_REUSE; 733 733 } else { 734 - kfree(name); 734 + kvfree(name); 735 735 return -EINVAL; 736 736 } 737 - kfree(name); 737 + kvfree(name); 738 738 break; 739 739 case Opt_fsync: 740 740 name = match_strdup(&args[0]); ··· 751 751 F2FS_OPTION(sbi).fsync_mode = 752 752 FSYNC_MODE_NOBARRIER; 753 753 } else { 754 - kfree(name); 754 + kvfree(name); 755 755 return -EINVAL; 756 756 } 757 - kfree(name); 757 + kvfree(name); 758 758 break; 759 759 case Opt_test_dummy_encryption: 760 760 #ifdef CONFIG_F2FS_FS_ENCRYPTION ··· 783 783 !strncmp(name, "disable", 7)) { 784 784 set_opt(sbi, DISABLE_CHECKPOINT); 785 785 } else { 786 - kfree(name); 786 + kvfree(name); 787 787 return -EINVAL; 788 788 } 789 - kfree(name); 789 + kvfree(name); 790 790 break; 791 791 default: 792 792 f2fs_msg(sb, KERN_ERR, ··· 1017 1017 for (i = 0; i < sbi->s_ndevs; i++) { 1018 1018 blkdev_put(FDEV(i).bdev, FMODE_EXCL); 1019 1019 #ifdef CONFIG_BLK_DEV_ZONED 1020 - kfree(FDEV(i).blkz_type); 1020 + kvfree(FDEV(i).blkz_type); 1021 1021 #endif 1022 1022 } 1023 - kfree(sbi->devs); 1023 + kvfree(sbi->devs); 1024 1024 } 1025 1025 1026 1026 static void f2fs_put_super(struct super_block *sb) ··· 1084 1084 f2fs_destroy_node_manager(sbi); 1085 1085 f2fs_destroy_segment_manager(sbi); 1086 1086 1087 - kfree(sbi->ckpt); 1087 + kvfree(sbi->ckpt); 1088 1088 1089 1089 f2fs_unregister_sysfs(sbi); 1090 1090 1091 1091 sb->s_fs_info = NULL; 1092 1092 if (sbi->s_chksum_driver) 1093 1093 crypto_free_shash(sbi->s_chksum_driver); 1094 - kfree(sbi->raw_super); 1094 + kvfree(sbi->raw_super); 1095 1095 1096 1096 destroy_device_list(sbi); 1097 1097 mempool_destroy(sbi->write_io_dummy); 1098 1098 #ifdef CONFIG_QUOTA 1099 1099 for (i = 0; i < MAXQUOTAS; i++) 1100 - kfree(F2FS_OPTION(sbi).s_qf_names[i]); 1100 + kvfree(F2FS_OPTION(sbi).s_qf_names[i]); 1101 1101 #endif 1102 1102 destroy_percpu_info(sbi); 1103 1103 for (i = 0; i < NR_PAGE_TYPE; i++) 1104 - kfree(sbi->write_io[i]); 1105 - kfree(sbi); 1104 + kvfree(sbi->write_io[i]); 1105 + kvfree(sbi); 1106 1106 } 1107 1107 1108 1108 int f2fs_sync_fs(struct super_block *sb, int sync) ··· 1531 1531 GFP_KERNEL); 1532 1532 if (!org_mount_opt.s_qf_names[i]) { 1533 1533 for (j = 0; j < i; j++) 1534 - kfree(org_mount_opt.s_qf_names[j]); 1534 + kvfree(org_mount_opt.s_qf_names[j]); 1535 1535 return -ENOMEM; 1536 1536 } 1537 1537 } else { ··· 1651 1651 #ifdef CONFIG_QUOTA 1652 1652 /* Release old quota file names */ 1653 1653 for (i = 0; i < MAXQUOTAS; i++) 1654 - kfree(org_mount_opt.s_qf_names[i]); 1654 + kvfree(org_mount_opt.s_qf_names[i]); 1655 1655 #endif 1656 1656 /* Update the POSIXACL Flag */ 1657 1657 sb->s_flags = (sb->s_flags & ~SB_POSIXACL) | ··· 1672 1672 #ifdef CONFIG_QUOTA 1673 1673 F2FS_OPTION(sbi).s_jquota_fmt = org_mount_opt.s_jquota_fmt; 1674 1674 for (i = 0; i < MAXQUOTAS; i++) { 1675 - kfree(F2FS_OPTION(sbi).s_qf_names[i]); 1675 + kvfree(F2FS_OPTION(sbi).s_qf_names[i]); 1676 1676 F2FS_OPTION(sbi).s_qf_names[i] = org_mount_opt.s_qf_names[i]; 1677 1677 } 1678 1678 #endif ··· 2800 2800 } 2801 2801 } 2802 2802 2803 - kfree(zones); 2803 + kvfree(zones); 2804 2804 2805 2805 return err; 2806 2806 } ··· 2860 2860 2861 2861 /* No valid superblock */ 2862 2862 if (!*raw_super) 2863 - kfree(super); 2863 + kvfree(super); 2864 2864 else 2865 2865 err = 0; 2866 2866 ··· 3369 3369 if (err) 3370 3370 goto free_meta; 3371 3371 } 3372 - kfree(options); 3372 + kvfree(options); 3373 3373 3374 3374 /* recover broken superblock */ 3375 3375 if (recovery) { ··· 3418 3418 f2fs_destroy_segment_manager(sbi); 3419 3419 free_devices: 3420 3420 destroy_device_list(sbi); 3421 - kfree(sbi->ckpt); 3421 + kvfree(sbi->ckpt); 3422 3422 free_meta_inode: 3423 3423 make_bad_inode(sbi->meta_inode); 3424 3424 iput(sbi->meta_inode); ··· 3428 3428 destroy_percpu_info(sbi); 3429 3429 free_bio_info: 3430 3430 for (i = 0; i < NR_PAGE_TYPE; i++) 3431 - kfree(sbi->write_io[i]); 3431 + kvfree(sbi->write_io[i]); 3432 3432 free_options: 3433 3433 #ifdef CONFIG_QUOTA 3434 3434 for (i = 0; i < MAXQUOTAS; i++) 3435 - kfree(F2FS_OPTION(sbi).s_qf_names[i]); 3435 + kvfree(F2FS_OPTION(sbi).s_qf_names[i]); 3436 3436 #endif 3437 - kfree(options); 3437 + kvfree(options); 3438 3438 free_sb_buf: 3439 - kfree(raw_super); 3439 + kvfree(raw_super); 3440 3440 free_sbi: 3441 3441 if (sbi->s_chksum_driver) 3442 3442 crypto_free_shash(sbi->s_chksum_driver); 3443 - kfree(sbi); 3443 + kvfree(sbi); 3444 3444 3445 3445 /* give only one another chance */ 3446 3446 if (retry) {