summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Dorfman <kdorfman@codeaurora.org>2013-02-05 16:26:19 +0200
committerSubhash Jadavani <subhashj@codeaurora.org>2016-05-31 15:25:45 -0700
commit8cd10b13a9bd1d815f69a4bd1a49d11972091a0d (patch)
tree328495c4bae05b0a25cd9108ff08d23d3ed39c9a
parentaa4228ea9d4dcf1eb307c4f0b9c7732fdaf315ee (diff)
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 <kdorfman@codeaurora.org>
-rw-r--r--drivers/mmc/card/block.c8
-rw-r--r--drivers/mmc/core/debugfs.c7
-rw-r--r--include/linux/mmc/card.h1
3 files changed, 16 insertions, 0 deletions
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,
};