summaryrefslogtreecommitdiff
path: root/lib/notifier-error-inject.h
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2022-07-12 13:54:24 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2022-08-17 16:16:17 +0300
commit96fa141fa295ae9428da73c56c9852053b575c04 (patch)
tree882d7871e312f9a30099942a8af8a440494e8583 /lib/notifier-error-inject.h
parent0e7e91701e4e443bdfb9775b0924c69bbb318860 (diff)
downloadlinux-96fa141fa295ae9428da73c56c9852053b575c04.tar.xz
ext4: fix race when reusing xattr blocks
[ Upstream commit 65f8b80053a1b2fd602daa6814e62d6fa90e5e9b ] When ext4_xattr_block_set() decides to remove xattr block the following race can happen: CPU1 CPU2 ext4_xattr_block_set() ext4_xattr_release_block() new_bh = ext4_xattr_block_cache_find() lock_buffer(bh); ref = le32_to_cpu(BHDR(bh)->h_refcount); if (ref == 1) { ... mb_cache_entry_delete(); unlock_buffer(bh); ext4_free_blocks(); ... ext4_forget(..., bh, ...); jbd2_journal_revoke(..., bh); ext4_journal_get_write_access(..., new_bh, ...) do_get_write_access() jbd2_journal_cancel_revoke(..., new_bh); Later the code in ext4_xattr_block_set() finds out the block got freed and cancels reusal of the block but the revoke stays canceled and so in case of block reuse and journal replay the filesystem can get corrupted. If the race works out slightly differently, we can also hit assertions in the jbd2 code. Fix the problem by making sure that once matching mbcache entry is found, code dropping the last xattr block reference (or trying to modify xattr block in place) waits until the mbcache entry reference is dropped. This way code trying to reuse xattr block is protected from someone trying to drop the last reference to xattr block. Reported-and-tested-by: Ritesh Harjani <ritesh.list@gmail.com> CC: stable@vger.kernel.org Fixes: 82939d7999df ("ext4: convert to mbcache2") Signed-off-by: Jan Kara <jack@suse.cz> Link: https://lore.kernel.org/r/20220712105436.32204-5-jack@suse.cz Signed-off-by: Theodore Ts'o <tytso@mit.edu> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'lib/notifier-error-inject.h')
0 files changed, 0 insertions, 0 deletions