• A
    ext4: fix memory leak in ext4_fill_super · afd09b61
    Alexey Makhalov 提交于
    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
    afd09b61
super.c 192.4 KB