• Gaosheng Cui's avatar
    mtd: core: fix possible resource leak in init_mtd() · 1aadf01e
    Gaosheng Cui authored
    I got the error report while inject fault in init_mtd():
    
    sysfs: cannot create duplicate filename '/devices/virtual/bdi/mtd-0'
    Call Trace:
     <TASK>
     dump_stack_lvl+0x67/0x83
     sysfs_warn_dup+0x60/0x70
     sysfs_create_dir_ns+0x109/0x120
     kobject_add_internal+0xce/0x2f0
     kobject_add+0x98/0x110
     device_add+0x179/0xc00
     device_create_groups_vargs+0xf4/0x100
     device_create+0x7b/0xb0
     bdi_register_va.part.13+0x58/0x2d0
     bdi_register+0x9b/0xb0
     init_mtd+0x62/0x171 [mtd]
     do_one_initcall+0x6c/0x3c0
     do_init_module+0x58/0x222
     load_module+0x268e/0x27d0
     __do_sys_finit_module+0xd5/0x140
     do_syscall_64+0x37/0x90
     entry_SYSCALL_64_after_hwframe+0x63/0xcd
     </TASK>
    kobject_add_internal failed for mtd-0 with -EEXIST, don't try to register
    	things with the same name in the same directory.
    Error registering mtd class or bdi: -17
    
    If init_mtdchar() fails in init_mtd(), mtd_bdi will not be unregistered,
    as a result, we can't load the mtd module again, to fix this by calling
    bdi_unregister(mtd_bdi) after out_procfs label.
    
    Fixes: 445caaa2 ("mtd: Allocate bdi objects dynamically")
    Signed-off-by: default avatarGaosheng Cui <cuigaosheng1@huawei.com>
    Signed-off-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
    Link: https://lore.kernel.org/linux-mtd/20221024065109.2050705-1-cuigaosheng1@huawei.com
    1aadf01e
mtdcore.c 64.2 KB