• A
    ext4: fix memory leak in ext4_fill_super · 071edc48
    Alexey Makhalov 提交于
    stable inclusion
    from stable-5.10.43
    commit 01d349a481f0591230300a9171330136f9159bcd
    bugzilla: 109284
    CVE: NA
    
    --------------------------------
    
    commit afd09b61 upstream.
    
    Buffer head references must be released before calling kill_bdev();
    otherwise the buffer head (and its page referenced by b_data) will not
    be freed by kill_bdev, and subsequently that bh will be leaked.
    
    If blocksizes differ, sb_set_blocksize() will kill current buffers and
    page cache by using kill_bdev(). And then super block will be reread
    again but using correct blocksize this time. sb_set_blocksize() didn't
    fully free superblock page and buffer head, and being busy, they were
    not freed and instead leaked.
    
    This can easily be reproduced by calling an infinite loop of:
    
      systemctl start <ext4_on_lvm>.mount, and
      systemctl stop <ext4_on_lvm>.mount
    
    ... since systemd creates a cgroup for each slice which it mounts, and
    the bh leak get amplified by a dying memory cgroup that also never
    gets freed, and memory consumption is much more easily noticed.
    
    Fixes: ce40733c ("ext4: Check for return value from sb_set_blocksize")
    Fixes: ac27a0ec ("ext4: initial copy of files from ext3")
    Link: https://lore.kernel.org/r/20210521075533.95732-1-amakhalov@vmware.comSigned-off-by: NAlexey Makhalov <amakhalov@vmware.com>
    Signed-off-by: NTheodore Ts'o <tytso@mit.edu>
    Cc: stable@kernel.org
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: NChen Jun <chenjun102@huawei.com>
    Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
    071edc48
super.c 191.4 KB