Commit afd09b6
ext4: fix memory leak in ext4_fill_super
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: ce40733 ("ext4: Check for return value from sb_set_blocksize")
Fixes: ac27a0e ("ext4: initial copy of files from ext3")
Link: https://lore.kernel.org/r/20210521075533.95732-1-amakhalov@vmware.com
Signed-off-by: Alexey Makhalov <amakhalov@vmware.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Cc: stable@kernel.org1 parent a7ba36b commit afd09b6
1 file changed
Lines changed: 9 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4462 | 4462 | | |
4463 | 4463 | | |
4464 | 4464 | | |
| 4465 | + | |
| 4466 | + | |
| 4467 | + | |
| 4468 | + | |
| 4469 | + | |
| 4470 | + | |
4465 | 4471 | | |
4466 | 4472 | | |
4467 | 4473 | | |
4468 | 4474 | | |
| 4475 | + | |
4469 | 4476 | | |
4470 | 4477 | | |
4471 | 4478 | | |
4472 | | - | |
4473 | 4479 | | |
4474 | 4480 | | |
4475 | 4481 | | |
| |||
5202 | 5208 | | |
5203 | 5209 | | |
5204 | 5210 | | |
5205 | | - | |
| 5211 | + | |
5206 | 5212 | | |
| 5213 | + | |
5207 | 5214 | | |
5208 | 5215 | | |
5209 | 5216 | | |
| |||
0 commit comments