]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
mmc: Do not advertise secure discard if it is blacklisted
authorLukas Czerner <lczerner@redhat.com>
Wed, 18 Jun 2014 11:18:07 +0000 (13:18 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Sat, 26 Jul 2014 09:13:39 +0000 (11:13 +0200)
Currently when the device secure discard implementation is
blacklisted (MMC_QUIRK_SEC_ERASE_TRIM_BROKEN quirk is set)
instead of secure discard we're going to do normal discard,
which is wrong.

When the secure discard is known to be broken we should just
disallow it entirely and not advertise this functionality to
the user. Fix it.

Also move mmc_fixup_device() in from of mmc_blk_alloc() so we
can get quirks set before we attempt to set queue information.

Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Acked-by: Jaehoon Chung <jh80.chung@samsung.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/card/block.c
drivers/mmc/core/core.c

index 452782bffebcfd5977a2935155cbe2b1e143f302..ede41f05c392d499542dac45f9228f37364ecf30 100644 (file)
@@ -2028,8 +2028,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
                /* complete ongoing async transfer before issuing discard */
                if (card->host->areq)
                        mmc_blk_issue_rw_rq(mq, NULL);
-               if (req->cmd_flags & REQ_SECURE &&
-                       !(card->quirks & MMC_QUIRK_SEC_ERASE_TRIM_BROKEN))
+               if (req->cmd_flags & REQ_SECURE)
                        ret = mmc_blk_issue_secdiscard_rq(mq, req);
                else
                        ret = mmc_blk_issue_discard_rq(mq, req);
@@ -2432,6 +2431,8 @@ static int mmc_blk_probe(struct mmc_card *card)
        if (!(card->csd.cmdclass & CCC_BLOCK_READ))
                return -ENODEV;
 
+       mmc_fixup_device(card, blk_fixups);
+
        md = mmc_blk_alloc(card);
        if (IS_ERR(md))
                return PTR_ERR(md);
@@ -2446,7 +2447,6 @@ static int mmc_blk_probe(struct mmc_card *card)
                goto out;
 
        mmc_set_drvdata(card, md);
-       mmc_fixup_device(card, blk_fixups);
 
        if (mmc_add_disk(md))
                goto out;
index 7dc0c85fdb6067b980b7cfd636e4c23a98d1803c..d03a080fb9cd35ff0b29bf50380f08fdd8818c23 100644 (file)
@@ -2102,7 +2102,8 @@ EXPORT_SYMBOL(mmc_can_sanitize);
 
 int mmc_can_secure_erase_trim(struct mmc_card *card)
 {
-       if (card->ext_csd.sec_feature_support & EXT_CSD_SEC_ER_EN)
+       if ((card->ext_csd.sec_feature_support & EXT_CSD_SEC_ER_EN) &&
+           !(card->quirks & MMC_QUIRK_SEC_ERASE_TRIM_BROKEN))
                return 1;
        return 0;
 }