On 1/10/23 22:27, Damien Le Moal wrote: > From: Christoph Hellwig <hch@xxxxxxxxxxxxx> > > Check that the PREFUSH and FUA flags are only set on write bios, > given that the flush state machine expects that. > > [Damien] The check is also extended to REQ_OP_ZONE_APPEND operations as > these are data write operations used by btrfs and zonefs and may also > have the REQ_FUA bit set. > > Reported-by: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx> > Signed-off-by: Christoph Hellwig <hch@xxxxxx> > Signed-off-by: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx> > Reviewed-by: Niklas Cassel <niklas.cassel@xxxxxxx> Christoph, Jens, Are you OK with this patch ? I am going to queue up patches 2 to 6 in libata tree as we have another series on top of these patches (CDL series rebased). Jens, if you could take this one in the block tree, that would be great. Thanks ! > --- > block/blk-core.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > > diff --git a/block/blk-core.c b/block/blk-core.c > index 9321767470dc..c644aac498ef 100644 > --- a/block/blk-core.c > +++ b/block/blk-core.c > @@ -744,12 +744,16 @@ void submit_bio_noacct(struct bio *bio) > * Filter flush bio's early so that bio based drivers without flush > * support don't have to worry about them. > */ > - if (op_is_flush(bio->bi_opf) && > - !test_bit(QUEUE_FLAG_WC, &q->queue_flags)) { > - bio->bi_opf &= ~(REQ_PREFLUSH | REQ_FUA); > - if (!bio_sectors(bio)) { > - status = BLK_STS_OK; > + if (op_is_flush(bio->bi_opf)) { > + if (WARN_ON_ONCE(bio_op(bio) != REQ_OP_WRITE && > + bio_op(bio) != REQ_OP_ZONE_APPEND)) > goto end_io; > + if (!test_bit(QUEUE_FLAG_WC, &q->queue_flags)) { > + bio->bi_opf &= ~(REQ_PREFLUSH | REQ_FUA); > + if (!bio_sectors(bio)) { > + status = BLK_STS_OK; > + goto end_io; > + } > } > } > -- Damien Le Moal Western Digital Research