summary refs log tree commit diff
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2023-03-29 17:49:32 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2023-05-11 23:03:23 +0900
commitf1bd3414d97cb6be8fc0619d57947d2e0ea525ab (patch)
tree8c2f4255cd91079ef624af01e76d88dcf257c38f
parentf6b46f84382952741dbbf4039d29e3f0c371777a (diff)
downloadlinux-f1bd3414d97cb6be8fc0619d57947d2e0ea525ab.tar.gz
jdb2: Don't refuse invalidation of already invalidated buffers
[ Upstream commit bd159398a2d2234de07d310132865706964aaaa7 ]

When invalidating buffers under the partial tail page,
jbd2_journal_invalidate_folio() returns -EBUSY if the buffer is part of
the committing transaction as we cannot safely modify buffer state.
However if the buffer is already invalidated (due to previous
invalidation attempts from ext4_wait_for_tail_page_commit()), there's
nothing to do and there's no point in returning -EBUSY. This fixes
occasional warnings from ext4_journalled_invalidate_folio() triggered by
generic/051 fstest when blocksize < pagesize.

Fixes: 53e872681fed ("ext4: fix deadlock in journal_unmap_buffer()")
Signed-off-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20230329154950.19720-1-jack@suse.cz
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--fs/jbd2/transaction.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c
index 15de1385012e..18611241f451 100644
--- a/fs/jbd2/transaction.c
+++ b/fs/jbd2/transaction.c
@@ -2387,6 +2387,9 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh,
 			spin_unlock(&jh->b_state_lock);
 			write_unlock(&journal->j_state_lock);
 			jbd2_journal_put_journal_head(jh);
+			/* Already zapped buffer? Nothing to do... */
+			if (!bh->b_bdev)
+				return 0;
 			return -EBUSY;
 		}
 		/*