aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/blkdev.h
diff options
context:
space:
mode:
authorMartin K. Petersen <martin.petersen@oracle.com>2009-12-03 03:24:48 -0500
committerJens Axboe <jens.axboe@oracle.com>2009-12-03 03:24:48 -0500
commit98262f2762f0067375f83824d81ea929e37e6bfe (patch)
treea26618d5c305eed975501c80cb02bc0f1b6e4524 /include/linux/blkdev.h
parent464191c65b85a8ec68a6e1a6293af625287c807e (diff)
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 'include/linux/blkdev.h')
-rw-r--r--include/linux/blkdev.h14
1 files changed, 14 insertions, 0 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index e727f6c44c4..784a919aa0d 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -322,6 +322,7 @@ struct queue_limits {
322 unsigned char misaligned; 322 unsigned char misaligned;
323 unsigned char discard_misaligned; 323 unsigned char discard_misaligned;
324 unsigned char no_cluster; 324 unsigned char no_cluster;
325 signed char discard_zeroes_data;
325}; 326};
326 327
327struct request_queue 328struct request_queue
@@ -1150,6 +1151,19 @@ static inline int queue_sector_discard_alignment(struct request_queue *q,
1150 & (q->limits.discard_granularity - 1); 1151 & (q->limits.discard_granularity - 1);
1151} 1152}
1152 1153
1154static inline unsigned int queue_discard_zeroes_data(struct request_queue *q)
1155{
1156 if (q->limits.discard_zeroes_data == 1)
1157 return 1;
1158
1159 return 0;
1160}
1161
1162static inline unsigned int bdev_discard_zeroes_data(struct block_device *bdev)
1163{
1164 return queue_discard_zeroes_data(bdev_get_queue(bdev));
1165}
1166
1153static inline int queue_dma_alignment(struct request_queue *q) 1167static inline int queue_dma_alignment(struct request_queue *q)
1154{ 1168{
1155 return q ? q->dma_alignment : 511; 1169 return q ? q->dma_alignment : 511;