On 4/17/23 05:09, Christoph Hellwig wrote: > Requests with the FUA bit on hardware without FUA support need a post > flush before returning the caller, but they can still be sent using s/returning/returning to > the normal I/O path after initializing the flush-related fields and > end I/O handler. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> > --- > block/blk-flush.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/block/blk-flush.c b/block/blk-flush.c > index f62e74d9d56bc8..9eda6d46438dba 100644 > --- a/block/blk-flush.c > +++ b/block/blk-flush.c > @@ -435,6 +435,17 @@ bool blk_insert_flush(struct request *rq) > * Queue for normal execution. > */ > return false; > + case REQ_FSEQ_DATA | REQ_FSEQ_POSTFLUSH: > + /* > + * Initialize the flush fields and completion handler to trigger > + * the post flush, and then just pass the command on. > + */ > + blk_rq_init_flush(rq); > + rq->flush.seq |= REQ_FSEQ_PREFLUSH; Shouldn't this be REQ_FSEQ_POSTFLUSH ? > + spin_lock_irq(&fq->mq_flush_lock); > + list_move_tail(&rq->flush.list, &fq->flush_data_in_flight); > + spin_unlock_irq(&fq->mq_flush_lock); > + return false; > default: > /* > * Mark the request as part of a flush sequence and submit it