Hi Adrian,

> The sanitize logic looks wrong to me.  I would expect it to look
> like this:
> 
> 
> diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
> index b180965..f5e0534 100644
> --- a/drivers/mmc/card/block.c
> +++ b/drivers/mmc/card/block.c
> @@ -881,17 +881,12 @@ static int mmc_blk_issue_secdiscard_rq(struct mmc_queue
> *mq,
>               goto out;
>       }
> 
> -     /* The sanitize operation is supported at v4.5 only */
> -     if (mmc_can_sanitize(card)) {
> -             err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
> -                             EXT_CSD_SANITIZE_START, 1, 0);
> -             goto out;
> -     }
> -
>       from = blk_rq_pos(req);
>       nr = blk_rq_sectors(req);
> 
> -     if (mmc_can_trim(card) && !mmc_erase_group_aligned(card, from, nr))
> +     if (mmc_can_sanitize(card))
> +             arg = MMC_DISCARD_ARG;

The sanitize and discard are not coupled functionalities.
Discard is a hint for performance meant to replace trim and erase 
where performance matters.
Sanitize is a security operation meant to clear all unmapped contents.
Jedec 4.5 spec does not guarantee that a discarded sector will be sanitized.

This patch, if applied, will expose the kernel to a potential security 
risk (retrieve old contents not wiped by a sanitize)

> +     else if (mmc_can_trim(card) && !mmc_erase_group_aligned(card, from, nr))
>               arg = MMC_SECURE_TRIM1_ARG;
>       else
>               arg = MMC_SECURE_ERASE_ARG;
> @@ -918,6 +913,12 @@ retry:
>               }
>               err = mmc_erase(card, from, nr, MMC_SECURE_TRIM2_ARG);
>       }
> +
> +     /* The sanitize operation is supported at v4.5 only */
> +     if (!err && mmc_can_sanitize(card)) {
> +             err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
> +                             EXT_CSD_SANITIZE_START, 1, 0);
> +     }
>  out:
>       if (err == -EIO && !mmc_blk_reset(md, card->host, type))
>               goto retry;
> 
> 
> 
> Also the timeout for eMMC v4.5 DISCARD looks wrong.  It should be
> the same as TRIM:
> 
> 
> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
> index 14f262e..00fd7db 100644
> --- a/drivers/mmc/core/core.c
> +++ b/drivers/mmc/core/core.c
> @@ -1407,7 +1407,7 @@ static unsigned int mmc_mmc_erase_timeout(struct
> mmc_card *card,
> 
>       if (card->ext_csd.erase_group_def & 1) {
>               /* High Capacity Erase Group Size uses HC timeouts */
> -             if (arg == MMC_TRIM_ARG)
> +             if (arg == MMC_TRIM_ARG || arg == MMC_DISCARD_ARG)
>                       erase_timeout = card->ext_csd.trim_timeout;
>               else
>                       erase_timeout = card->ext_csd.hc_erase_timeout;
> 
>

Although I suspect that the discard cmd will be much faster than the
Trim on most devices, there is no such info available as of today in ext csd.
As such I agree with Adrian, discard timeout is nearer to trim than erase.
 
> 
> In addition eMMC v4.5 seems to indicate the use of the trim timeout
> irrespective of the setting of erase_group_def, so maybe it should be
> like this:
> 
> 
> 
> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
> index 14f262e..4691a23 100644
> --- a/drivers/mmc/core/core.c
> +++ b/drivers/mmc/core/core.c
> @@ -1405,7 +1405,10 @@ static unsigned int mmc_mmc_erase_timeout(struct
> mmc_card *card,
>  {
>       unsigned int erase_timeout;
> 
> -     if (card->ext_csd.erase_group_def & 1) {
> +     if (arg == MMC_DISCARD_ARG ||
> +         (arg == MMC_TRIM_ARG && card->ext_csd.rev >= 6)) {
> +             erase_timeout = card->ext_csd.trim_timeout;
> +     } else if (card->ext_csd.erase_group_def & 1) {
>               /* High Capacity Erase Group Size uses HC timeouts */
>               if (arg == MMC_TRIM_ARG)
>                       erase_timeout = card->ext_csd.trim_timeout;
> 
> 
> 
> 
> Alternatively, maybe it would be better to switch to HC erase size for all
> eMMC v4.5 cards?
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to [email protected]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to