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

bcachefs: fix incorrect usage of REQ_OP_FLUSH

REQ_OP_FLUSH is only for internal use in the blk-mq and request based
drivers. File systems and other block layer consumers must use
REQ_OP_WRITE | REQ_PREFLUSH as documented in
Documentation/block/writeback_cache_control.rst.

While REQ_OP_FLUSH appears to work for blk-mq drivers it does not
get the proper flush state machine handling, and completely fails
for any bio based drivers, including all the stacking drivers. The
block layer will also get a check in 6.8 to reject this use case
entirely.

[Note: completely untested, but as this never got fixed since the
original bug report in November:

https://bugzilla.kernel.org/show_bug.cgi?id=218184

and the the discussion in December:

https://lore.kernel.org/all/20231221053016.72cqcfg46vxwohcj@moria.home.lan/T/

this seems to be best way to force it]

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>

authored by

Christoph Hellwig and committed by
Kent Overstreet
3e44f325 612e1110

+3 -2
+1 -1
fs/bcachefs/fs-io.c
··· 79 79 continue; 80 80 81 81 bio = container_of(bio_alloc_bioset(ca->disk_sb.bdev, 0, 82 - REQ_OP_FLUSH, 82 + REQ_OP_WRITE|REQ_PREFLUSH, 83 83 GFP_KERNEL, 84 84 &c->nocow_flush_bioset), 85 85 struct nocow_flush, bio);
+2 -1
fs/bcachefs/journal_io.c
··· 1988 1988 percpu_ref_get(&ca->io_ref); 1989 1989 1990 1990 bio = ca->journal.bio; 1991 - bio_reset(bio, ca->disk_sb.bdev, REQ_OP_FLUSH); 1991 + bio_reset(bio, ca->disk_sb.bdev, 1992 + REQ_OP_WRITE|REQ_PREFLUSH); 1992 1993 bio->bi_end_io = journal_write_endio; 1993 1994 bio->bi_private = ca; 1994 1995 closure_bio_submit(bio, cl);