RE: [PATCH] mmc: card: move variable initialization earlier

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
��.n��������+%������w��{.n�����{��i��)��jg��������ݢj����G�������j:+v���w�m������w�������h�����٥



[Index of Archives]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux