• Su Yue's avatar
    bcachefs: fix kmemleak in __bch2_read_super error handling path · 7dcfb87a
    Su Yue authored
    During xfstest tests, there are some kmemleak reports e.g. generic/051 with
    if USE_KMEMLEAK=yes:
    
    ====================================================================
    EXPERIMENTAL kmemleak reported some memory leaks!  Due to the way kmemleak
    works, the leak might be from an earlier test, or something totally unrelated.
    unreferenced object 0xffff9ef905aaf778 (size 8):
      comm "mount.bcachefs", pid 169844, jiffies 4295281209 (age 87.040s)
      hex dump (first 8 bytes):
        a5 cc cc cc cc cc cc cc                          ........
      backtrace:
        [<ffffffff87fd9a43>] __kmem_cache_alloc_node+0x1f3/0x2c0
        [<ffffffff87f49b66>] kmalloc_trace+0x26/0xb0
        [<ffffffffc0a3fefe>] __bch2_read_super+0xfe/0x4e0 [bcachefs]
        [<ffffffffc0a3ad22>] bch2_fs_open+0x262/0x1710 [bcachefs]
        [<ffffffffc09c9e24>] bch2_mount+0x4c4/0x640 [bcachefs]
        [<ffffffff88080c90>] legacy_get_tree+0x30/0x60
        [<ffffffff8802c748>] vfs_get_tree+0x28/0xf0
        [<ffffffff88061fe5>] path_mount+0x475/0xb60
        [<ffffffff880627e5>] __x64_sys_mount+0x105/0x140
        [<ffffffff88932642>] do_syscall_64+0x42/0xf0
        [<ffffffff88a000e6>] entry_SYSCALL_64_after_hwframe+0x6e/0x76
    unreferenced object 0xffff9ef96cdc4fc0 (size 32):
      comm "mount.bcachefs", pid 169844, jiffies 4295281209 (age 87.040s)
      hex dump (first 32 bytes):
        2f 64 65 76 2f 6d 61 70 70 65 72 2f 74 65 73 74  /dev/mapper/test
        2d 31 00 cc cc cc cc cc cc cc cc cc cc cc cc cc  -1..............
      backtrace:
        [<ffffffff87fd9a43>] __kmem_cache_alloc_node+0x1f3/0x2c0
        [<ffffffff87f4a081>] __kmalloc_node_track_caller+0x51/0x150
        [<ffffffff87f3adc2>] kstrdup+0x32/0x60
        [<ffffffffc0a3ff1a>] __bch2_read_super+0x11a/0x4e0 [bcachefs]
        [<ffffffffc0a3ad22>] bch2_fs_open+0x262/0x1710 [bcachefs]
        [<ffffffffc09c9e24>] bch2_mount+0x4c4/0x640 [bcachefs]
        [<ffffffff88080c90>] legacy_get_tree+0x30/0x60
        [<ffffffff8802c748>] vfs_get_tree+0x28/0xf0
        [<ffffffff88061fe5>] path_mount+0x475/0xb60
        [<ffffffff880627e5>] __x64_sys_mount+0x105/0x140
        [<ffffffff88932642>] do_syscall_64+0x42/0xf0
        [<ffffffff88a000e6>] entry_SYSCALL_64_after_hwframe+0x6e/0x76
    ====================================================================
    
    The leak happens if bdev_open_by_path() failed to open a block device
    then it goes label 'out' directly without call of bch2_free_super().
    
    Fix it by going to label 'err' instead of 'out' if bdev_open_by_path()
    fails.
    Signed-off-by: default avatarSu Yue <glass.su@suse.com>
    Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
    7dcfb87a
super-io.c 35.4 KB