mmc_block: add support for secure discard
PATCH 19/24 mmc_block: add support for secure discard
From: Adrian Hunter <[email protected]>
Secure discard is implemented by Secure Trim if the discard is unaligned or Secure Erase otherwise.
Signed-off-by Adrian Hunter <[email protected]>
Acked-by Jens Axboe <[email protected]>
Cc Kyungmin Park <[email protected]>
Cc Madhusudhan Chikkature <[email protected]>
Cc Christoph Hellwig <[email protected]>
Cc Ben Gardiner <[email protected]>
Cc <[email protected]>
Signed-off-by Andrew Morton <[email protected]>
---
drivers/mmc/card/block.c | 46 ++++++++++++++++++++++++++++++++++--- drivers/mmc/card/queue.c | 3 ++ 2 files changed, 46 insertions(+), 3 deletions(-)
drivers/mmc/card/block.c renamed from drivers/mmc/card/block.c~mmc_block-add-support-for-secure-discard +43 -3
@@ -280,6 +280,42 @@ out:return err ?0 :1 ; } +static int mmc_blk_issue_secdiscard_rq (struct mmc_queue *mq, +struct request *req) +{ +struct mmc_blk_data *md = mq->data; +struct mmc_card *card = md->queue.card; +unsigned int from, nr, arg; +int err =0 ; + +mmc_claim_host (card->host); + +if (!mmc_can_secure_erase_trim (card)) { + err = -EOPNOTSUPP ; + goto out; + } + + from =blk_rq_pos (req); + nr =blk_rq_sectors (req); + +if (mmc_can_trim (card) && !mmc_erase_group_aligned (card, from, nr)) + arg =MMC_SECURE_TRIM1_ARG ; +else + arg =MMC_SECURE_ERASE_ARG ; + + err =mmc_erase (card, from, nr, arg); +if (!err && arg ==MMC_SECURE_TRIM1_ARG ) + err =mmc_erase (card, from, nr,MMC_SECURE_TRIM2_ARG ); +out: +spin_lock_irq (&md->lock); +__blk_end_request (req, err,blk_rq_bytes (req)); +spin_unlock_irq (&md->lock); + +mmc_release_host (card->host); + +return err ?0 :1 ; +} +static int mmc_blk_issue_rw_rq (struct mmc_queue *mq,struct request *req) {struct mmc_blk_data *md = mq->data;
@@ -510,10 +546,14 @@ static int mmc_blk_issue_rw_rq(struct mmstatic int mmc_blk_issue_rq (struct mmc_queue *mq,struct request *req) { -if (req->cmd_flags &REQ_DISCARD ) -return mmc_blk_issue_discard_rq (mq, req); -else +if (req->cmd_flags &REQ_DISCARD ) { +if (req->cmd_flags &REQ_SECURE ) +return mmc_blk_issue_secdiscard_rq (mq, req); +else +return mmc_blk_issue_discard_rq (mq, req); + }else {return mmc_blk_issue_rw_rq (mq, req); + } }static inline int mmc_blk_readonly (struct mmc_card *card)
drivers/mmc/card/queue.c renamed from drivers/mmc/card/queue.c~mmc_block-add-support-for-secure-discard +3 -0
@@ -141,6 +141,9 @@ int mmc_init_queue(struct mmc_queue *mq, mq->queue->limits.discard_alignment = card->erase_size <<9 ; } +if (mmc_can_secure_erase_trim (card)) +queue_flag_set_unlocked (QUEUE_FLAG_SECDISCARD , + mq->queue); }#ifdef CONFIG_MMC_BLOCK_BOUNCE
_