[dm-devel] [PATCH v2 2/9] dm: eliminate 'split_discard_bios' flag from DM target interface

Mike Snitzer snitzer at redhat.com
Thu Feb 21 04:36:26 UTC 2019


On Wed, Feb 20 2019 at  4:44pm -0500,
Mike Snitzer <snitzer at redhat.com> wrote:

> There is no need to have DM core split discards on behalf of a DM target
> now that blk_queue_split() handles splitting discards based on the
> queue_limits.  A DM target just needs to set max_discard_sectors,
> discard_granularity, etc, in queue_limits.
> 
> Signed-off-by: Mike Snitzer <snitzer at redhat.com>
> ---
>  drivers/md/dm-cache-target.c  |  1 -
>  drivers/md/dm-raid.c          | 14 +++++++++-----
>  drivers/md/dm-thin.c          |  1 -
>  drivers/md/dm-zoned-target.c  |  1 -
>  drivers/md/dm.c               | 28 ++++++----------------------
>  include/linux/device-mapper.h |  6 ------
>  include/uapi/linux/dm-ioctl.h |  4 ++--
>  7 files changed, 17 insertions(+), 38 deletions(-)
> 

...

> diff --git a/drivers/md/dm.c b/drivers/md/dm.c
> index 7a774fcd0194..b988e178a523 100644
> --- a/drivers/md/dm.c
> +++ b/drivers/md/dm.c
> @@ -1478,17 +1478,10 @@ static unsigned get_num_write_zeroes_bios(struct dm_target *ti)
>  	return ti->num_write_zeroes_bios;
>  }
>  
> -typedef bool (*is_split_required_fn)(struct dm_target *ti);
> -
> -static bool is_split_required_for_discard(struct dm_target *ti)
> -{
> -	return ti->split_discard_bios;
> -}
> -
>  static int __send_changing_extent_only(struct clone_info *ci, struct dm_target *ti,
> -				       unsigned num_bios, bool is_split_required)
> +				       unsigned num_bios)
>  {
> -	unsigned len;
> +	unsigned len = ci->sector_count;
>  
>  	/*
>  	 * Even though the device advertised support for this type of
> @@ -1499,38 +1492,29 @@ static int __send_changing_extent_only(struct clone_info *ci, struct dm_target *
>  	if (!num_bios)
>  		return -EOPNOTSUPP;
>  
> -	if (!is_split_required)
> -		len = min((sector_t)ci->sector_count, max_io_len_target_boundary(ci->sector, ti));
> -	else
> -		len = min((sector_t)ci->sector_count, max_io_len(ci->sector, ti));
> -
>  	__send_duplicate_bios(ci, ti, num_bios, &len);
>  
> -	ci->sector += len;
> -	ci->sector_count -= len;
> -
>  	return 0;
>  }

The above was bogus, ci->sector and ci->sector_count must be updated.
Reintroducing adjustments based on 'len' fixed a discard crash Ming
reported.

Now fixed in linux-next.

Mike




More information about the dm-devel mailing list