Commit 3924aea
ext4: fix dirtyclusters double decrement on fs shutdown
commit 94a8cea upstream.
fstests test generic/388 occasionally reproduces a warning in
ext4_put_super() associated with the dirty clusters count:
WARNING: CPU: 7 PID: 76064 at fs/ext4/super.c:1324 ext4_put_super+0x48c/0x590 [ext4]
Tracing the failure shows that the warning fires due to an
s_dirtyclusters_counter value of -1. IOW, this appears to be a
spurious decrement as opposed to some sort of leak. Further tracing
of the dirty cluster count deltas and an LLM scan of the resulting
output identified the cause as a double decrement in the error path
between ext4_mb_mark_diskspace_used() and the caller
ext4_mb_new_blocks().
First, note that generic/388 is a shutdown vs. fsstress test and so
produces a random set of operations and shutdown injections. In the
problematic case, the shutdown triggers an error return from the
ext4_handle_dirty_metadata() call(s) made from
ext4_mb_mark_context(). The changed value is non-zero at this point,
so ext4_mb_mark_diskspace_used() does not exit after the error
bubbles up from ext4_mb_mark_context(). Instead, the former
decrements both cluster counters and returns the error up to
ext4_mb_new_blocks(). The latter falls into the !ar->len out path
which decrements the dirty clusters counter a second time, creating
the inconsistency.
To avoid this problem and simplify ownership of the cluster
reservation in this codepath, lift the counter reduction to a single
place in the caller. This makes it more clear that
ext4_mb_new_blocks() is responsible for acquiring cluster
reservation (via ext4_claim_free_clusters()) in the !delalloc case
as well as releasing it, regardless of whether it ends up consumed
or returned due to failure.
Fixes: 0087d9f ("ext4: Fix s_dirty_blocks_counter if block allocation failed with nodelalloc")
Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Baokun Li <libaokun1@huawei.com>
Link: https://patch.msgid.link/20260113171905.118284-1-bfoster@redhat.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Cc: stable@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>1 parent 29a07d6 commit 3924aea
2 files changed
Lines changed: 6 additions & 17 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
567 | 567 | | |
568 | 568 | | |
569 | 569 | | |
570 | | - | |
| 570 | + | |
571 | 571 | | |
572 | 572 | | |
573 | 573 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4181 | 4181 | | |
4182 | 4182 | | |
4183 | 4183 | | |
4184 | | - | |
4185 | | - | |
| 4184 | + | |
4186 | 4185 | | |
4187 | 4186 | | |
4188 | 4187 | | |
| |||
4237 | 4236 | | |
4238 | 4237 | | |
4239 | 4238 | | |
4240 | | - | |
4241 | | - | |
4242 | | - | |
4243 | | - | |
4244 | | - | |
4245 | | - | |
4246 | | - | |
4247 | 4239 | | |
4248 | 4240 | | |
4249 | 4241 | | |
| |||
6328 | 6320 | | |
6329 | 6321 | | |
6330 | 6322 | | |
6331 | | - | |
| 6323 | + | |
6332 | 6324 | | |
6333 | 6325 | | |
6334 | 6326 | | |
| |||
6359 | 6351 | | |
6360 | 6352 | | |
6361 | 6353 | | |
6362 | | - | |
6363 | | - | |
6364 | | - | |
6365 | | - | |
6366 | | - | |
6367 | | - | |
| 6354 | + | |
| 6355 | + | |
| 6356 | + | |
6368 | 6357 | | |
6369 | 6358 | | |
6370 | 6359 | | |
| |||
0 commit comments