From 8cd10b13a9bd1d815f69a4bd1a49d11972091a0d Mon Sep 17 00:00:00 2001 From: Konstantin Dorfman Date: Tue, 5 Feb 2013 16:26:19 +0200 Subject: [PATCH] mmc: block: do not pack REQ_FUA request This change will prevent packing of a request marked with REQ_FUA flag, because it has the same semantics as REQ_FLUSH. Also packing statistics are updated with FUA stop reason. Change-Id: Iaad37044ec43f93e898ed0c011b0bce7b91ae13d Signed-off-by: Konstantin Dorfman --- drivers/mmc/card/block.c | 8 ++++++++ drivers/mmc/core/debugfs.c | 7 +++++++ include/linux/mmc/card.h | 1 + 3 files changed, 16 insertions(+) diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index dd45524b8813..982264d2db87 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -2027,6 +2027,9 @@ static u8 mmc_blk_prep_packed_list(struct mmc_queue *mq, struct request *req) !IS_ALIGNED(blk_rq_sectors(cur), 8)) goto no_packed; + if (cur->cmd_flags & REQ_FUA) + goto no_packed; + mmc_blk_clear_packed(mqrq); max_blk_count = min(card->host->max_blk_count, @@ -2071,6 +2074,11 @@ static u8 mmc_blk_prep_packed_list(struct mmc_queue *mq, struct request *req) break; } + if (next->cmd_flags & REQ_FUA) { + MMC_BLK_UPDATE_STOP_REASON(stats, FUA); + break; + } + if (rq_data_dir(cur) != rq_data_dir(next)) { MMC_BLK_UPDATE_STOP_REASON(stats, WRONG_DATA_DIR); break; diff --git a/drivers/mmc/core/debugfs.c b/drivers/mmc/core/debugfs.c index 98930066d952..734d2cce0a56 100644 --- a/drivers/mmc/core/debugfs.c +++ b/drivers/mmc/core/debugfs.c @@ -531,6 +531,13 @@ static ssize_t mmc_wr_pack_stats_read(struct file *filp, char __user *ubuf, pack_stats->pack_stop_reason[RANDOM]); strlcat(ubuf, temp_buf, cnt); } + if (pack_stats->pack_stop_reason[FUA]) { + snprintf(temp_buf, TEMP_BUF_SIZE, + "%s: %d times: fua request\n", + mmc_hostname(card->host), + pack_stats->pack_stop_reason[FUA]); + strlcat(ubuf, temp_buf, cnt); + } spin_unlock(&pack_stats->lock); diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 20630f657db5..04a6c02d7b32 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -228,6 +228,7 @@ enum mmc_packed_stop_reasons { THRESHOLD, LARGE_SEC_ALIGN, RANDOM, + FUA, MAX_REASONS, };