History

block: implement REQ_FLUSH/FUA based interface for FLUSH/FUA requests

Now that the backend conversion is complete, export sequenced FLUSH/FUA capability through REQ_FLUSH/FUA flags. REQ_FLUSH means the device cache should be flushed before executing the request. REQ_FUA means that the data in the request should be on non-volatile media on completion. Block layer will choose the correct way of implementing the semantics and execute it. The request may be passed to the device directly if the device can handle it; otherwise, it will be sequenced using one or more proxy requests. Devices will never see REQ_FLUSH and/or FUA which it doesn't support. Also, unlike the original REQ_HARDBARRIER, REQ_FLUSH/FUA requests are never failed with -EOPNOTSUPP. If the underlying device doesn't support FLUSH/FUA, the block layer simply make those noop. IOW, it no longer distinguishes between writeback cache which doesn't support cache flush and writethrough/no cache. Devices which have WB cache w/o flush are very difficult to come by these days and there's nothing much we can do anyway, so it doesn't make sense to require everyone to implement -EOPNOTSUPP handling. This will simplify filesystems and block drivers as they can drop -EOPNOTSUPP retry logic for barriers. * QUEUE_ORDERED_* are removed and QUEUE_FSEQ_* are moved into blk-flush.c. * REQ_FLUSH w/o data can also be directly passed to drivers without sequencing but some drivers assume that zero length requests don't have rq->bio which isn't true for these requests requiring the use of proxy requests. * REQ_COMMON_MASK now includes REQ_FLUSH | REQ_FUA so that they are copied from bio to request. * WRITE_BARRIER is marked deprecated and WRITE_FLUSH, WRITE_FUA and WRITE_FLUSH_FUA are added.

Tejun Heo committed 16 years ago

Commit 4fed9471 parent dd4c1337 files · +67 −84Browse files

Showing the changes to include/linux/blkdev.h (1 of 7 files). Show all

Unified · Split

include/linux/blkdev.h+2−36
@@ -357,7 +357,6 @@ struct request_queue · 356 unmodified lines
357357 /*
358358 * for flush operations
359359 */
360− unsigned int ordered, next_ordered;
361360 unsigned int flush_flags;
362361 unsigned int flush_seq;
363362 int flush_err;
@@ -465,40 +464,6 @@ static inline void queue_flag_clear(unsigned int flag, struct request_queue *q) · 101 unmodified lines
465464 __clear_bit(flag, &q->queue_flags);
466465 }
467466
468−enum {
469− /*
470− * Hardbarrier is supported with one of the following methods.
471− *
472− * NONE : hardbarrier unsupported
473− * DRAIN : ordering by draining is enough
474− * DRAIN_FLUSH : ordering by draining w/ pre and post flushes
475− * DRAIN_FUA : ordering by draining w/ pre flush and FUA write
476− */
477− QUEUE_ORDERED_DO_PREFLUSH = 0x10,
478− QUEUE_ORDERED_DO_BAR = 0x20,
479− QUEUE_ORDERED_DO_POSTFLUSH = 0x40,
480− QUEUE_ORDERED_DO_FUA = 0x80,
481−
482− QUEUE_ORDERED_NONE = 0x00,
483−
484− QUEUE_ORDERED_DRAIN = QUEUE_ORDERED_DO_BAR,
485− QUEUE_ORDERED_DRAIN_FLUSH = QUEUE_ORDERED_DRAIN |
486− QUEUE_ORDERED_DO_PREFLUSH |
487− QUEUE_ORDERED_DO_POSTFLUSH,
488− QUEUE_ORDERED_DRAIN_FUA = QUEUE_ORDERED_DRAIN |
489− QUEUE_ORDERED_DO_PREFLUSH |
490− QUEUE_ORDERED_DO_FUA,
491−
492− /*
493− * FLUSH/FUA sequences.
494− */
495− QUEUE_FSEQ_STARTED = (1 << 0), /* flushing in progress */
496− QUEUE_FSEQ_PREFLUSH = (1 << 1), /* pre-flushing in progress */
497− QUEUE_FSEQ_DATA = (1 << 2), /* data write in progress */
498− QUEUE_FSEQ_POSTFLUSH = (1 << 3), /* post-flushing in progress */
499− QUEUE_FSEQ_DONE = (1 << 4),
500−};
501−
502467 #define blk_queue_plugged(q) test_bit(QUEUE_FLAG_PLUGGED, &(q)->queue_flags)
503468 #define blk_queue_tagged(q) test_bit(QUEUE_FLAG_QUEUED, &(q)->queue_flags)
504469 #define blk_queue_stopped(q) test_bit(QUEUE_FLAG_STOPPED, &(q)->queue_flags)
@@ -578,7 +543,8 @@ static inline void blk_clear_queue_full(struct request_queue *q, int sync) · 73 unmodified lines
578543 * it already be started by driver.
579544 */
580545 #define RQ_NOMERGE_FLAGS \
581− (REQ_NOMERGE | REQ_STARTED | REQ_HARDBARRIER | REQ_SOFTBARRIER)
546+ (REQ_NOMERGE | REQ_STARTED | REQ_HARDBARRIER | REQ_SOFTBARRIER | \
547+ REQ_FLUSH | REQ_FUA)
582548 #define rq_mergeable(rq) \
583549 (!((rq)->cmd_flags & RQ_NOMERGE_FLAGS) && \
584550 (((rq)->cmd_flags & REQ_DISCARD) || \