I'm hoping somebody can clarify the correct PREFLUSH and FUA behavior from a block stack client. I'm starting to suspect that some of my devices are failing to inform the block stack correctly of their capabilities - leading to expensive and unnecessary flushes. My understanding is this: * If I require confirmation that a single write is durable upon completion, attach REQ_FUA to the bio. * If I require that the current write plus all previously completed writes be durable as of completion of the current write, attach REQ_FUA and REQ_PREFLUSH to the bio. * Both REQ_FUA and REQ_PREFLUSH should be NOPs on a device with with a non-volatile write cache. But I have a small problem - I don't know which write is last, until I receive a Commit call. That means that at Commit time, I should send a "FLUSH". I am calling a function based on blkdev_issue_flush(), but this causes I big performance penalty even though my nvme ssd has VWC==0. Does this make sense? Perhaps blkdev_issue_flush() is intended to flush caches even if they are non-volatile? What is the "correct" way to get a "REQ_PREFLUSH" with a zero length write, if not via blkdev_issue_flush()? Thanks for any tips, John Groves