]> git.baikalelectronics.ru Git - kernel.git/commit
ext4: fix reserved space counter leakage
authorJeffle Xu <jefflexu@linux.alibaba.com>
Mon, 23 Aug 2021 06:13:58 +0000 (14:13 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 1 Oct 2021 04:03:41 +0000 (00:03 -0400)
commit0bd7f5304652b0ff34414690421a6460eaf2ea3f
treea5de186d8a1d5748f1e663ac7c7c9939e2731d23
parent4a9af7ec125b6395de67e3782970681c7831bdb6
ext4: fix reserved space counter leakage

When ext4_insert_delayed block receives and recovers from an error from
ext4_es_insert_delayed_block(), e.g., ENOMEM, it does not release the
space it has reserved for that block insertion as it should. One effect
of this bug is that s_dirtyclusters_counter is not decremented and
remains incorrectly elevated until the file system has been unmounted.
This can result in premature ENOSPC returns and apparent loss of free
space.

Another effect of this bug is that
/sys/fs/ext4/<dev>/delayed_allocation_blocks can remain non-zero even
after syncfs has been executed on the filesystem.

Besides, add check for s_dirtyclusters_counter when inode is going to be
evicted and freed. s_dirtyclusters_counter can still keep non-zero until
inode is written back in .evict_inode(), and thus the check is delayed
to .destroy_inode().

Fixes: 9ac997cbdcd6 ("ext4: let ext4 maintain extent status tree")
Cc: stable@kernel.org
Suggested-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Signed-off-by: Jeffle Xu <jefflexu@linux.alibaba.com>
Reviewed-by: Eric Whitney <enwlinux@gmail.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Link: https://lore.kernel.org/r/20210823061358.84473-1-jefflexu@linux.alibaba.com
fs/ext4/inode.c
fs/ext4/super.c