In some cases we would end up stacking discard_zeroes_data incorrectly. Fix this by enabling the feature by default for stacking drivers and clearing it for low-level drivers. Incorporating a device that does not support dzd will then cause the feature to be disabled in the stacking driver. Also ensure that the maximum discard value does not overflow when exported in sysfs and return 0 in the alignment and dzd fields for devices that don't support discard.
Showing the changes to include/linux/blkdev.h (1 of 3 files). Show all
Unified · Split
| @@ -257,7 +257,7 @@ struct queue_limits { · 256 unmodified lines | |||
| 257 | unsigned char misaligned; | 257 | unsigned char misaligned; |
| 258 | unsigned char discard_misaligned; | 258 | unsigned char discard_misaligned; |
| 259 | unsigned char cluster; | 259 | unsigned char cluster; |
| 260 | signed char discard_zeroes_data; | 260 | unsigned char discard_zeroes_data; |
| 261 | }; | 261 | }; |
| 262 | 262 | ||
| 263 | struct request_queue | 263 | struct request_queue |
| @@ -1069,13 +1069,16 @@ static inline int queue_limit_discard_alignment(struct queue_limits *lim, sector · 805 unmodified lines | |||
| 1069 | { | 1069 | { |
| 1070 | unsigned int alignment = (sector << 9) & (lim->discard_granularity - 1); | 1070 | unsigned int alignment = (sector << 9) & (lim->discard_granularity - 1); |
| 1071 | 1071 | ||
| 1072 | if (!lim->max_discard_sectors) | ||
| 1073 | return 0; | ||
| 1074 | |||
| 1072 | return (lim->discard_granularity + lim->discard_alignment - alignment) | 1075 | return (lim->discard_granularity + lim->discard_alignment - alignment) |
| 1073 | & (lim->discard_granularity - 1); | 1076 | & (lim->discard_granularity - 1); |
| 1074 | } | 1077 | } |
| 1075 | 1078 | ||
| 1076 | static inline unsigned int queue_discard_zeroes_data(struct request_queue *q) | 1079 | static inline unsigned int queue_discard_zeroes_data(struct request_queue *q) |
| 1077 | { | 1080 | { |
| 1078 | if (q->limits.discard_zeroes_data == 1) | 1081 | if (q->limits.max_discard_sectors && q->limits.discard_zeroes_data == 1) |
| 1079 | return 1; | 1082 | return 1; |
| 1080 | 1083 | ||
| 1081 | return 0; | 1084 | return 0; |