History

block: Fix discard topology stacking and reporting

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.

Martin K. Petersen committed 15 years ago

Commit a934a001 parent bbdd3043 files · +9 −4Browse files

Showing the changes to include/linux/blkdev.h (1 of 3 files). Show all

Unified · Split

include/linux/blkdev.h+5−2
@@ -257,7 +257,7 @@ struct queue_limits { · 256 unmodified lines
257257 unsigned char misaligned;
258258 unsigned char discard_misaligned;
259259 unsigned char cluster;
260− signed char discard_zeroes_data;
260+ unsigned char discard_zeroes_data;
261261 };
262262
263263 struct request_queue
@@ -1069,13 +1069,16 @@ static inline int queue_limit_discard_alignment(struct queue_limits *lim, sector · 805 unmodified lines
10691069 {
10701070 unsigned int alignment = (sector << 9) & (lim->discard_granularity - 1);
10711071
1072+ if (!lim->max_discard_sectors)
1073+ return 0;
1074+
10721075 return (lim->discard_granularity + lim->discard_alignment - alignment)
10731076 & (lim->discard_granularity - 1);
10741077 }
10751078
10761079 static inline unsigned int queue_discard_zeroes_data(struct request_queue *q)
10771080 {
1078− if (q->limits.discard_zeroes_data == 1)
1081+ if (q->limits.max_discard_sectors && q->limits.discard_zeroes_data == 1)
10791082 return 1;
10801083
10811084 return 0;