On Fri, Jul 07, 2023 at 11:46:13AM +0200, 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") It is hard to say a fix, given discard_max_bytes can still be changed by kernel. I'd suggest to document this behavior in Documentation/ABI/stable/sysfs-block. > Signed-off-by: Christoph Hellwig <hch@xxxxxx> > --- > 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; > } Userspace may write 0 to discard_max_bytes, and this patch still can override user setting. Thanks, Ming