[dm-devel] dm crypt: Always disable discard zeroes data flag

Mike Snitzer snitzer at redhat.com
Mon Aug 8 22:05:28 UTC 2011


On Mon, Aug 08 2011 at  5:48pm -0400,
Milan Broz <mbroz at redhat.com> wrote:

> If optional discard support in dm-crypt is enabled,
> discards requests bypass crypt queue and blocks
> of the underlying device are discarded.
> 
> But for read path, discarded blocks are handled
> as the same as normal ciphertext blocks, thus decrypted.
> 
> So if underlying device announces discarded regions
> return zeroes, dm-crypt must disable this flag because
> after decryption there is just random noise instead of zeroes.
> 
> Signed-off-by: Milan Broz <mbroz at redhat.com>
> ---
>  drivers/md/dm-crypt.c         |    1 +
>  drivers/md/dm-table.c         |   19 +++++++++++++++++++
>  include/linux/device-mapper.h |    5 +++++
>  3 files changed, 25 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
> index 49da55c..b6ac710 100644
> --- a/drivers/md/dm-crypt.c
> +++ b/drivers/md/dm-crypt.c
> @@ -1698,6 +1698,7 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
>  	}
>  
>  	ti->num_flush_requests = 1;
> +	ti->discard_zeroes_unsupported = 1;

I'd prefer 'discard_zeroes_data_unsupported'

>  	return 0;
>  
>  bad:
> diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
> index 61d3e83..5294f29 100644
> --- a/drivers/md/dm-table.c
> +++ b/drivers/md/dm-table.c
> @@ -1330,6 +1330,22 @@ static bool dm_table_is_nonrot(struct dm_table *t)
>  	return 1;
>  }
>  
> +static bool dm_table_discard_zeroes(struct dm_table *t)

Likewise, dm_table_discard_zeroes_data().

> +{
> +	struct dm_target *ti;
> +	unsigned i = 0;
> +
> +	/* Ensure that all targets supports discard zeroes. */
> +	while (i < dm_table_get_num_targets(t)) {
> +		ti = dm_table_get_target(t, i++);
> +
> +		if (ti->discard_zeroes_unsupported)
> +			return 0;
> +	}
> +
> +	return 1;
> +}
> +
>  void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q,
>  			       struct queue_limits *limits)
>  {
> @@ -1357,6 +1373,9 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q,
>  	else
>  		queue_flag_clear_unlocked(QUEUE_FLAG_NONROT, q);
>  
> +	if (!dm_table_discard_zeroes(t))
> +		q->limits.discard_zeroes_data = 0;
> +
>  	dm_table_set_integrity(t);
>  
>  	/*
> diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h
> index ba99936..2416cf1 100644
> --- a/include/linux/device-mapper.h
> +++ b/include/linux/device-mapper.h
> @@ -208,6 +208,11 @@ struct dm_target {
>  	 * whether or not its underlying devices have support.
>  	 */
>  	unsigned discards_supported:1;
> +
> +	/*
> +	 * Set if this target does not return zeroes on discarded blocks.
> +	 */
> +	unsigned discard_zeroes_unsupported:1;
>  };
>  
>  /* Each target can link one of these into the table */
> -- 
> 1.7.5.4
> 
> --
> dm-devel mailing list
> dm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/dm-devel




More information about the dm-devel mailing list