Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

fs/jbd2: use sleeping version of __find_get_block()

Convert to the new nonatomic flavor to benefit from potential
performance benefits and adapt in the future vs migration such
that semantics are kept.

- jbd2_journal_revoke(): can sleep (has might_sleep() in the beginning)

- jbd2_journal_cancel_revoke(): only used from do_get_write_access() and
do_get_create_access() which do sleep. So can sleep.

- jbd2_clear_buffer_revoked_flags() - only called from journal commit code
which sleeps. So can sleep.

Suggested-by: Jan Kara <jack@suse.cz>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Davidlohr Bueso <dave@stgolabs.net>
Link: https://kdevops.org/ext4/v6.15-rc2.html # [0]
Link: https://lore.kernel.org/all/aAAEvcrmREWa1SKF@bombadil.infradead.org/ # [1]
Link: https://lore.kernel.org/20250418015921.132400-6-dave@stgolabs.net
Tested-by: kdevops@lists.linux.dev
Reviewed-by: Luis Chamberlain <mcgrof@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>

authored by

Davidlohr Bueso and committed by
Christian Brauner
f76d4c28 a0b5ff07

+9 -6
+9 -6
fs/jbd2/revoke.c
··· 345 345 bh = bh_in; 346 346 347 347 if (!bh) { 348 - bh = __find_get_block(bdev, blocknr, journal->j_blocksize); 348 + bh = __find_get_block_nonatomic(bdev, blocknr, 349 + journal->j_blocksize); 349 350 if (bh) 350 351 BUFFER_TRACE(bh, "found on hash"); 351 352 } ··· 356 355 357 356 /* If there is a different buffer_head lying around in 358 357 * memory anywhere... */ 359 - bh2 = __find_get_block(bdev, blocknr, journal->j_blocksize); 358 + bh2 = __find_get_block_nonatomic(bdev, blocknr, 359 + journal->j_blocksize); 360 360 if (bh2) { 361 361 /* ... and it has RevokeValid status... */ 362 362 if (bh2 != bh && buffer_revokevalid(bh2)) ··· 466 464 * state machine will get very upset later on. */ 467 465 if (need_cancel) { 468 466 struct buffer_head *bh2; 469 - bh2 = __find_get_block(bh->b_bdev, bh->b_blocknr, bh->b_size); 467 + bh2 = __find_get_block_nonatomic(bh->b_bdev, bh->b_blocknr, 468 + bh->b_size); 470 469 if (bh2) { 471 470 if (bh2 != bh) 472 471 clear_buffer_revoked(bh2); ··· 495 492 struct jbd2_revoke_record_s *record; 496 493 struct buffer_head *bh; 497 494 record = (struct jbd2_revoke_record_s *)list_entry; 498 - bh = __find_get_block(journal->j_fs_dev, 499 - record->blocknr, 500 - journal->j_blocksize); 495 + bh = __find_get_block_nonatomic(journal->j_fs_dev, 496 + record->blocknr, 497 + journal->j_blocksize); 501 498 if (bh) { 502 499 clear_buffer_revoked(bh); 503 500 __brelse(bh);