On 7/7/23 18:46, Christoph Hellwig wrote: > max_discard_sectors is split into a hardware and a tunable value, but > blk_queue_max_discard_sectors sets both unconditionally, thus dropping > any user stored value on a rescan. Fix blk_queue_max_discard_sectors to > only set max_discard_sectors if it either wasn't set, or the new hardware > limit is smaller than the previous user limit. > > Fixes: 0034af036554 ("block: make /sys/block/<dev>/queue/discard_max_bytes writeable") > Signed-off-by: Christoph Hellwig <hch@xxxxxx> Look OK to me. Reviewed-by: Damien Le Moal <dlemoal@xxxxxxxxxx> > --- > block/blk-settings.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/block/blk-settings.c b/block/blk-settings.c > index 0046b447268f91..978d2e1fd67a51 100644 > --- a/block/blk-settings.c > +++ b/block/blk-settings.c > @@ -179,7 +179,9 @@ void blk_queue_max_discard_sectors(struct request_queue *q, > unsigned int max_discard_sectors) > { > q->limits.max_hw_discard_sectors = max_discard_sectors; > - q->limits.max_discard_sectors = max_discard_sectors; > + if (!q->limits.max_discard_sectors || > + q->limits.max_discard_sectors > max_discard_sectors) > + q->limits.max_discard_sectors = max_discard_sectors; > } > EXPORT_SYMBOL(blk_queue_max_discard_sectors); > -- Damien Le Moal Western Digital Research