aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/blkdev.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/blkdev.h')
-rw-r--r--include/linux/blkdev.h82
1 files changed, 57 insertions, 25 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 25119041e034..5c8018977efa 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -312,13 +312,17 @@ struct queue_limits {
312 unsigned int io_min; 312 unsigned int io_min;
313 unsigned int io_opt; 313 unsigned int io_opt;
314 unsigned int max_discard_sectors; 314 unsigned int max_discard_sectors;
315 unsigned int discard_granularity;
316 unsigned int discard_alignment;
315 317
316 unsigned short logical_block_size; 318 unsigned short logical_block_size;
317 unsigned short max_hw_segments; 319 unsigned short max_hw_segments;
318 unsigned short max_phys_segments; 320 unsigned short max_phys_segments;
319 321
320 unsigned char misaligned; 322 unsigned char misaligned;
323 unsigned char discard_misaligned;
321 unsigned char no_cluster; 324 unsigned char no_cluster;
325 signed char discard_zeroes_data;
322}; 326};
323 327
324struct request_queue 328struct request_queue
@@ -749,6 +753,17 @@ struct req_iterator {
749#define rq_iter_last(rq, _iter) \ 753#define rq_iter_last(rq, _iter) \
750 (_iter.bio->bi_next == NULL && _iter.i == _iter.bio->bi_vcnt-1) 754 (_iter.bio->bi_next == NULL && _iter.i == _iter.bio->bi_vcnt-1)
751 755
756#ifndef ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE
757# error "You should define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE for your platform"
758#endif
759#if ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE
760extern void rq_flush_dcache_pages(struct request *rq);
761#else
762static inline void rq_flush_dcache_pages(struct request *rq)
763{
764}
765#endif
766
752extern int blk_register_queue(struct gendisk *disk); 767extern int blk_register_queue(struct gendisk *disk);
753extern void blk_unregister_queue(struct gendisk *disk); 768extern void blk_unregister_queue(struct gendisk *disk);
754extern void register_disk(struct gendisk *dev); 769extern void register_disk(struct gendisk *dev);
@@ -823,19 +838,6 @@ static inline struct request_queue *bdev_get_queue(struct block_device *bdev)
823 return bdev->bd_disk->queue; 838 return bdev->bd_disk->queue;
824} 839}
825 840
826static inline void blk_run_backing_dev(struct backing_dev_info *bdi,
827 struct page *page)
828{
829 if (bdi && bdi->unplug_io_fn)
830 bdi->unplug_io_fn(bdi, page);
831}
832
833static inline void blk_run_address_space(struct address_space *mapping)
834{
835 if (mapping)
836 blk_run_backing_dev(mapping->backing_dev_info, NULL);
837}
838
839/* 841/*
840 * blk_rq_pos() : the current sector 842 * blk_rq_pos() : the current sector
841 * blk_rq_bytes() : bytes left in the entire request 843 * blk_rq_bytes() : bytes left in the entire request
@@ -843,7 +845,6 @@ static inline void blk_run_address_space(struct address_space *mapping)
843 * blk_rq_err_bytes() : bytes left till the next error boundary 845 * blk_rq_err_bytes() : bytes left till the next error boundary
844 * blk_rq_sectors() : sectors left in the entire request 846 * blk_rq_sectors() : sectors left in the entire request
845 * blk_rq_cur_sectors() : sectors left in the current segment 847 * blk_rq_cur_sectors() : sectors left in the current segment
846 * blk_rq_err_sectors() : sectors left till the next error boundary
847 */ 848 */
848static inline sector_t blk_rq_pos(const struct request *rq) 849static inline sector_t blk_rq_pos(const struct request *rq)
849{ 850{
@@ -872,11 +873,6 @@ static inline unsigned int blk_rq_cur_sectors(const struct request *rq)
872 return blk_rq_cur_bytes(rq) >> 9; 873 return blk_rq_cur_bytes(rq) >> 9;
873} 874}
874 875
875static inline unsigned int blk_rq_err_sectors(const struct request *rq)
876{
877 return blk_rq_err_bytes(rq) >> 9;
878}
879
880/* 876/*
881 * Request issue related functions. 877 * Request issue related functions.
882 */ 878 */
@@ -942,6 +938,8 @@ extern void blk_queue_io_opt(struct request_queue *q, unsigned int opt);
942extern void blk_set_default_limits(struct queue_limits *lim); 938extern void blk_set_default_limits(struct queue_limits *lim);
943extern int blk_stack_limits(struct queue_limits *t, struct queue_limits *b, 939extern int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,
944 sector_t offset); 940 sector_t offset);
941extern int bdev_stack_limits(struct queue_limits *t, struct block_device *bdev,
942 sector_t offset);
945extern void disk_stack_limits(struct gendisk *disk, struct block_device *bdev, 943extern void disk_stack_limits(struct gendisk *disk, struct block_device *bdev,
946 sector_t offset); 944 sector_t offset);
947extern void blk_queue_stack_limits(struct request_queue *t, struct request_queue *b); 945extern void blk_queue_stack_limits(struct request_queue *t, struct request_queue *b);
@@ -1114,11 +1112,18 @@ static inline int queue_alignment_offset(struct request_queue *q)
1114 return q->limits.alignment_offset; 1112 return q->limits.alignment_offset;
1115} 1113}
1116 1114
1115static inline int queue_limit_alignment_offset(struct queue_limits *lim, sector_t offset)
1116{
1117 unsigned int granularity = max(lim->physical_block_size, lim->io_min);
1118
1119 offset &= granularity - 1;
1120 return (granularity + lim->alignment_offset - offset) & (granularity - 1);
1121}
1122
1117static inline int queue_sector_alignment_offset(struct request_queue *q, 1123static inline int queue_sector_alignment_offset(struct request_queue *q,
1118 sector_t sector) 1124 sector_t sector)
1119{ 1125{
1120 return ((sector << 9) - q->limits.alignment_offset) 1126 return queue_limit_alignment_offset(&q->limits, sector << 9);
1121 & (q->limits.io_min - 1);
1122} 1127}
1123 1128
1124static inline int bdev_alignment_offset(struct block_device *bdev) 1129static inline int bdev_alignment_offset(struct block_device *bdev)
@@ -1134,6 +1139,37 @@ static inline int bdev_alignment_offset(struct block_device *bdev)
1134 return q->limits.alignment_offset; 1139 return q->limits.alignment_offset;
1135} 1140}
1136 1141
1142static inline int queue_discard_alignment(struct request_queue *q)
1143{
1144 if (q->limits.discard_misaligned)
1145 return -1;
1146
1147 return q->limits.discard_alignment;
1148}
1149
1150static inline int queue_sector_discard_alignment(struct request_queue *q,
1151 sector_t sector)
1152{
1153 struct queue_limits *lim = &q->limits;
1154 unsigned int alignment = (sector << 9) & (lim->discard_granularity - 1);
1155
1156 return (lim->discard_granularity + lim->discard_alignment - alignment)
1157 & (lim->discard_granularity - 1);
1158}
1159
1160static inline unsigned int queue_discard_zeroes_data(struct request_queue *q)
1161{
1162 if (q->limits.discard_zeroes_data == 1)
1163 return 1;
1164
1165 return 0;
1166}
1167
1168static inline unsigned int bdev_discard_zeroes_data(struct block_device *bdev)
1169{
1170 return queue_discard_zeroes_data(bdev_get_queue(bdev));
1171}
1172
1137static inline int queue_dma_alignment(struct request_queue *q) 1173static inline int queue_dma_alignment(struct request_queue *q)
1138{ 1174{
1139 return q ? q->dma_alignment : 511; 1175 return q ? q->dma_alignment : 511;
@@ -1172,11 +1208,7 @@ static inline void put_dev_sector(Sector p)
1172} 1208}
1173 1209
1174struct work_struct; 1210struct work_struct;
1175struct delayed_work;
1176int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); 1211int kblockd_schedule_work(struct request_queue *q, struct work_struct *work);
1177int kblockd_schedule_delayed_work(struct request_queue *q,
1178 struct delayed_work *work,
1179 unsigned long delay);
1180 1212
1181#define MODULE_ALIAS_BLOCKDEV(major,minor) \ 1213#define MODULE_ALIAS_BLOCKDEV(major,minor) \
1182 MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor)) 1214 MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor))