aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin K. Petersen2009-12-03 02:24:48 -0600
committerJens Axboe2009-12-03 02:24:48 -0600
commit98262f2762f0067375f83824d81ea929e37e6bfe (patch)
treea26618d5c305eed975501c80cb02bc0f1b6e4524 /block/blk-sysfs.c
parent464191c65b85a8ec68a6e1a6293af625287c807e (diff)
downloadkernel-common-98262f2762f0067375f83824d81ea929e37e6bfe.tar.gz
kernel-common-98262f2762f0067375f83824d81ea929e37e6bfe.tar.xz
kernel-common-98262f2762f0067375f83824d81ea929e37e6bfe.zip
block: Allow devices to indicate whether discarded blocks are zeroed
The discard ioctl is used by mkfs utilities to clear a block device prior to putting metadata down. However, not all devices return zeroed blocks after a discard. Some drives return stale data, potentially containing old superblocks. It is therefore important to know whether discarded blocks are properly zeroed. Both ATA and SCSI drives have configuration bits that indicate whether zeroes are returned after a discard operation. Implement a block level interface that allows this information to be bubbled up the stack and queried via a new block device ioctl. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'block/blk-sysfs.c')
-rw-r--r--block/blk-sysfs.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c
index 3147145edc1..8606c9543fd 100644
--- a/block/blk-sysfs.c
+++ b/block/blk-sysfs.c
@@ -136,6 +136,11 @@ static ssize_t queue_discard_max_show(struct request_queue *q, char *page)
136 return queue_var_show(q->limits.max_discard_sectors << 9, page); 136 return queue_var_show(q->limits.max_discard_sectors << 9, page);
137} 137}
138 138
139static ssize_t queue_discard_zeroes_data_show(struct request_queue *q, char *page)
140{
141 return queue_var_show(queue_discard_zeroes_data(q), page);
142}
143
139static ssize_t 144static ssize_t
140queue_max_sectors_store(struct request_queue *q, const char *page, size_t count) 145queue_max_sectors_store(struct request_queue *q, const char *page, size_t count)
141{ 146{
@@ -313,6 +318,11 @@ static struct queue_sysfs_entry queue_discard_max_entry = {
313 .show = queue_discard_max_show, 318 .show = queue_discard_max_show,
314}; 319};
315 320
321static struct queue_sysfs_entry queue_discard_zeroes_data_entry = {
322 .attr = {.name = "discard_zeroes_data", .mode = S_IRUGO },
323 .show = queue_discard_zeroes_data_show,
324};
325
316static struct queue_sysfs_entry queue_nonrot_entry = { 326static struct queue_sysfs_entry queue_nonrot_entry = {
317 .attr = {.name = "rotational", .mode = S_IRUGO | S_IWUSR }, 327 .attr = {.name = "rotational", .mode = S_IRUGO | S_IWUSR },
318 .show = queue_nonrot_show, 328 .show = queue_nonrot_show,
@@ -350,6 +360,7 @@ static struct attribute *default_attrs[] = {
350 &queue_io_opt_entry.attr, 360 &queue_io_opt_entry.attr,
351 &queue_discard_granularity_entry.attr, 361 &queue_discard_granularity_entry.attr,
352 &queue_discard_max_entry.attr, 362 &queue_discard_max_entry.attr,
363 &queue_discard_zeroes_data_entry.attr,
353 &queue_nonrot_entry.attr, 364 &queue_nonrot_entry.attr,
354 &queue_nomerges_entry.attr, 365 &queue_nomerges_entry.attr,
355 &queue_rq_affinity_entry.attr, 366 &queue_rq_affinity_entry.attr,