diff options
Diffstat (limited to 'include/linux/blkdev.h')
| -rw-r--r-- | include/linux/blkdev.h | 82 |
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 | ||
| 324 | struct request_queue | 328 | struct 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 | ||
| 760 | extern void rq_flush_dcache_pages(struct request *rq); | ||
| 761 | #else | ||
| 762 | static inline void rq_flush_dcache_pages(struct request *rq) | ||
| 763 | { | ||
| 764 | } | ||
| 765 | #endif | ||
| 766 | |||
| 752 | extern int blk_register_queue(struct gendisk *disk); | 767 | extern int blk_register_queue(struct gendisk *disk); |
| 753 | extern void blk_unregister_queue(struct gendisk *disk); | 768 | extern void blk_unregister_queue(struct gendisk *disk); |
| 754 | extern void register_disk(struct gendisk *dev); | 769 | extern 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 | ||
| 826 | static 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 | |||
| 833 | static 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 | */ |
| 848 | static inline sector_t blk_rq_pos(const struct request *rq) | 849 | static 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 | ||
| 875 | static 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); | |||
| 942 | extern void blk_set_default_limits(struct queue_limits *lim); | 938 | extern void blk_set_default_limits(struct queue_limits *lim); |
| 943 | extern int blk_stack_limits(struct queue_limits *t, struct queue_limits *b, | 939 | extern int blk_stack_limits(struct queue_limits *t, struct queue_limits *b, |
| 944 | sector_t offset); | 940 | sector_t offset); |
| 941 | extern int bdev_stack_limits(struct queue_limits *t, struct block_device *bdev, | ||
| 942 | sector_t offset); | ||
| 945 | extern void disk_stack_limits(struct gendisk *disk, struct block_device *bdev, | 943 | extern void disk_stack_limits(struct gendisk *disk, struct block_device *bdev, |
| 946 | sector_t offset); | 944 | sector_t offset); |
| 947 | extern void blk_queue_stack_limits(struct request_queue *t, struct request_queue *b); | 945 | extern 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 | ||
| 1115 | static 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 | |||
| 1117 | static inline int queue_sector_alignment_offset(struct request_queue *q, | 1123 | static 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 | ||
| 1124 | static inline int bdev_alignment_offset(struct block_device *bdev) | 1129 | static 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 | ||
| 1142 | static 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 | |||
| 1150 | static 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 | |||
| 1160 | static 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 | |||
| 1168 | static inline unsigned int bdev_discard_zeroes_data(struct block_device *bdev) | ||
| 1169 | { | ||
| 1170 | return queue_discard_zeroes_data(bdev_get_queue(bdev)); | ||
| 1171 | } | ||
| 1172 | |||
| 1137 | static inline int queue_dma_alignment(struct request_queue *q) | 1173 | static 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 | ||
| 1174 | struct work_struct; | 1210 | struct work_struct; |
| 1175 | struct delayed_work; | ||
| 1176 | int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); | 1211 | int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); |
| 1177 | int 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)) |
