Signed-off-by: Shaohua Li diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 52b39f3..07a930d 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1424,6 +1424,13 @@ static int dm_make_request(struct request_queue *q, struct bio *bio) { struct mapped_device *md = q->queuedata; + if (bio->bi_rw & (REQ_FLUSH | REQ_FUA)) { + if (bio->bi_rw & REQ_FLUSH) + bio->bi_rw |= REQ_CLONED_FLUSH; + if (bio->bi_rw & REQ_FUA) + bio->bi_rw |= REQ_CLONED_FUA; + bio->bi_rw &= ~(REQ_FLUSH|REQ_FUA); + } return md->saved_make_request_fn(q, bio); /* call __make_request() */ } @@ -1547,6 +1554,14 @@ static int dm_prep_fn(struct request_queue *q, struct request *rq) if (!clone) return BLKPREP_DEFER; + if (rq->cmd_flags & REQ_CLONED_FLUSH) + clone->cmd_flags |= REQ_FLUSH; + if (rq->cmd_flags & REQ_CLONED_FUA) + clone->cmd_flags |= REQ_FUA; + + rq->cmd_flags &= ~(REQ_FLUSH|REQ_FUA); + clone->cmd_flags &= ~(REQ_FLUSH|REQ_FUA); + rq->special = clone; rq->cmd_flags |= REQ_DONTPREP; diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 71fc53b..6ef5dc3 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -153,6 +153,8 @@ enum rq_flag_bits { __REQ_FLUSH_SEQ, /* request for flush sequence */ __REQ_IO_STAT, /* account I/O stat */ __REQ_MIXED_MERGE, /* merge of different types, fail separately */ + __REQ_CLONED_FLUSH, + __REQ_CLONED_FUA, __REQ_NR_BITS, /* stops here */ }; @@ -170,7 +172,7 @@ enum rq_flag_bits { (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER) #define REQ_COMMON_MASK \ (REQ_WRITE | REQ_FAILFAST_MASK | REQ_SYNC | REQ_META | REQ_PRIO | \ - REQ_DISCARD | REQ_NOIDLE | REQ_FLUSH | REQ_FUA | REQ_SECURE) + REQ_DISCARD | REQ_NOIDLE | REQ_FLUSH | REQ_FUA | REQ_SECURE | REQ_CLONED_FLUSH | REQ_CLONED_FUA) #define REQ_CLONE_MASK REQ_COMMON_MASK #define REQ_RAHEAD (1 << __REQ_RAHEAD) @@ -194,5 +196,7 @@ enum rq_flag_bits { #define REQ_IO_STAT (1 << __REQ_IO_STAT) #define REQ_MIXED_MERGE (1 << __REQ_MIXED_MERGE) #define REQ_SECURE (1 << __REQ_SECURE) +#define REQ_CLONED_FLUSH (1 << __REQ_CLONED_FLUSH) +#define REQ_CLONED_FUA (1 << __REQ_CLONED_FUA) #endif /* __LINUX_BLK_TYPES_H */