Commit 94a8cea
ext4: fix dirtyclusters double decrement on fs shutdown
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.org1 parent 491f292 commit 94a8cea
2 files changed
+6
-17
lines changed| 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 | |
|---|---|---|---|
| |||
4186 | 4186 | | |
4187 | 4187 | | |
4188 | 4188 | | |
4189 | | - | |
4190 | | - | |
| 4189 | + | |
4191 | 4190 | | |
4192 | 4191 | | |
4193 | 4192 | | |
| |||
4242 | 4241 | | |
4243 | 4242 | | |
4244 | 4243 | | |
4245 | | - | |
4246 | | - | |
4247 | | - | |
4248 | | - | |
4249 | | - | |
4250 | | - | |
4251 | | - | |
4252 | 4244 | | |
4253 | 4245 | | |
4254 | 4246 | | |
| |||
6333 | 6325 | | |
6334 | 6326 | | |
6335 | 6327 | | |
6336 | | - | |
| 6328 | + | |
6337 | 6329 | | |
6338 | 6330 | | |
6339 | 6331 | | |
| |||
6364 | 6356 | | |
6365 | 6357 | | |
6366 | 6358 | | |
6367 | | - | |
6368 | | - | |
6369 | | - | |
6370 | | - | |
6371 | | - | |
6372 | | - | |
| 6359 | + | |
| 6360 | + | |
| 6361 | + | |
6373 | 6362 | | |
6374 | 6363 | | |
6375 | 6364 | | |
| |||
0 commit comments