diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-10 13:52:45 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-10 13:52:45 -0400 |
| commit | e26feff647ef34423b048b940540a0059001ddb0 (patch) | |
| tree | acafe68602ee2f6f1a438c113073ffcc0040e949 /include/linux/blkdev.h | |
| parent | d403a6484f0341bf0624d17ece46f24f741b6a92 (diff) | |
| parent | b911e473d24633c19414b54b82b9ff0b1a2419d7 (diff) | |
Merge branch 'for-2.6.28' of git://git.kernel.dk/linux-2.6-block
* 'for-2.6.28' of git://git.kernel.dk/linux-2.6-block: (132 commits)
doc/cdrom: Trvial documentation error, file not present
block_dev: fix kernel-doc in new functions
block: add some comments around the bio read-write flags
block: mark bio_split_pool static
block: Find bio sector offset given idx and offset
block: gendisk integrity wrapper
block: Switch blk_integrity_compare from bdev to gendisk
block: Fix double put in blk_integrity_unregister
block: Introduce integrity data ownership flag
block: revert part of d7533ad0e132f92e75c1b2eb7c26387b25a583c1
bio.h: Remove unused conditional code
block: remove end_{queued|dequeued}_request()
block: change elevator to use __blk_end_request()
gdrom: change to use __blk_end_request()
memstick: change to use __blk_end_request()
virtio_blk: change to use __blk_end_request()
blktrace: use BLKTRACE_BDEV_SIZE as the name size for setup structure
block: add lld busy state exporting interface
block: Fix blk_start_queueing() to not kick a stopped queue
include blktrace_api.h in headers_install
...
Diffstat (limited to 'include/linux/blkdev.h')
| -rw-r--r-- | include/linux/blkdev.h | 151 |
1 files changed, 94 insertions, 57 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 53ea933cf60..a92d9e4ea96 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -16,7 +16,9 @@ | |||
| 16 | #include <linux/bio.h> | 16 | #include <linux/bio.h> |
| 17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
| 18 | #include <linux/stringify.h> | 18 | #include <linux/stringify.h> |
| 19 | #include <linux/gfp.h> | ||
| 19 | #include <linux/bsg.h> | 20 | #include <linux/bsg.h> |
| 21 | #include <linux/smp.h> | ||
| 20 | 22 | ||
| 21 | #include <asm/scatterlist.h> | 23 | #include <asm/scatterlist.h> |
| 22 | 24 | ||
| @@ -54,7 +56,6 @@ enum rq_cmd_type_bits { | |||
| 54 | REQ_TYPE_PM_SUSPEND, /* suspend request */ | 56 | REQ_TYPE_PM_SUSPEND, /* suspend request */ |
| 55 | REQ_TYPE_PM_RESUME, /* resume request */ | 57 | REQ_TYPE_PM_RESUME, /* resume request */ |
| 56 | REQ_TYPE_PM_SHUTDOWN, /* shutdown request */ | 58 | REQ_TYPE_PM_SHUTDOWN, /* shutdown request */ |
| 57 | REQ_TYPE_FLUSH, /* flush request */ | ||
| 58 | REQ_TYPE_SPECIAL, /* driver defined type */ | 59 | REQ_TYPE_SPECIAL, /* driver defined type */ |
| 59 | REQ_TYPE_LINUX_BLOCK, /* generic block layer message */ | 60 | REQ_TYPE_LINUX_BLOCK, /* generic block layer message */ |
| 60 | /* | 61 | /* |
| @@ -76,19 +77,18 @@ enum rq_cmd_type_bits { | |||
| 76 | * | 77 | * |
| 77 | */ | 78 | */ |
| 78 | enum { | 79 | enum { |
| 79 | /* | ||
| 80 | * just examples for now | ||
| 81 | */ | ||
| 82 | REQ_LB_OP_EJECT = 0x40, /* eject request */ | 80 | REQ_LB_OP_EJECT = 0x40, /* eject request */ |
| 83 | REQ_LB_OP_FLUSH = 0x41, /* flush device */ | 81 | REQ_LB_OP_FLUSH = 0x41, /* flush request */ |
| 82 | REQ_LB_OP_DISCARD = 0x42, /* discard sectors */ | ||
| 84 | }; | 83 | }; |
| 85 | 84 | ||
| 86 | /* | 85 | /* |
| 87 | * request type modified bits. first three bits match BIO_RW* bits, important | 86 | * request type modified bits. first two bits match BIO_RW* bits, important |
| 88 | */ | 87 | */ |
| 89 | enum rq_flag_bits { | 88 | enum rq_flag_bits { |
| 90 | __REQ_RW, /* not set, read. set, write */ | 89 | __REQ_RW, /* not set, read. set, write */ |
| 91 | __REQ_FAILFAST, /* no low level driver retries */ | 90 | __REQ_FAILFAST, /* no low level driver retries */ |
| 91 | __REQ_DISCARD, /* request to discard sectors */ | ||
| 92 | __REQ_SORTED, /* elevator knows about this request */ | 92 | __REQ_SORTED, /* elevator knows about this request */ |
| 93 | __REQ_SOFTBARRIER, /* may not be passed by ioscheduler */ | 93 | __REQ_SOFTBARRIER, /* may not be passed by ioscheduler */ |
| 94 | __REQ_HARDBARRIER, /* may not be passed by drive either */ | 94 | __REQ_HARDBARRIER, /* may not be passed by drive either */ |
| @@ -111,6 +111,7 @@ enum rq_flag_bits { | |||
| 111 | }; | 111 | }; |
| 112 | 112 | ||
| 113 | #define REQ_RW (1 << __REQ_RW) | 113 | #define REQ_RW (1 << __REQ_RW) |
| 114 | #define REQ_DISCARD (1 << __REQ_DISCARD) | ||
| 114 | #define REQ_FAILFAST (1 << __REQ_FAILFAST) | 115 | #define REQ_FAILFAST (1 << __REQ_FAILFAST) |
| 115 | #define REQ_SORTED (1 << __REQ_SORTED) | 116 | #define REQ_SORTED (1 << __REQ_SORTED) |
| 116 | #define REQ_SOFTBARRIER (1 << __REQ_SOFTBARRIER) | 117 | #define REQ_SOFTBARRIER (1 << __REQ_SOFTBARRIER) |
| @@ -140,12 +141,14 @@ enum rq_flag_bits { | |||
| 140 | */ | 141 | */ |
| 141 | struct request { | 142 | struct request { |
| 142 | struct list_head queuelist; | 143 | struct list_head queuelist; |
| 143 | struct list_head donelist; | 144 | struct call_single_data csd; |
| 145 | int cpu; | ||
| 144 | 146 | ||
| 145 | struct request_queue *q; | 147 | struct request_queue *q; |
| 146 | 148 | ||
| 147 | unsigned int cmd_flags; | 149 | unsigned int cmd_flags; |
| 148 | enum rq_cmd_type_bits cmd_type; | 150 | enum rq_cmd_type_bits cmd_type; |
| 151 | unsigned long atomic_flags; | ||
| 149 | 152 | ||
| 150 | /* Maintain bio traversal state for part by part I/O submission. | 153 | /* Maintain bio traversal state for part by part I/O submission. |
| 151 | * hard_* are block layer internals, no driver should touch them! | 154 | * hard_* are block layer internals, no driver should touch them! |
| @@ -190,13 +193,6 @@ struct request { | |||
| 190 | */ | 193 | */ |
| 191 | unsigned short nr_phys_segments; | 194 | unsigned short nr_phys_segments; |
| 192 | 195 | ||
| 193 | /* Number of scatter-gather addr+len pairs after | ||
| 194 | * physical and DMA remapping hardware coalescing is performed. | ||
| 195 | * This is the number of scatter-gather entries the driver | ||
| 196 | * will actually have to deal with after DMA mapping is done. | ||
| 197 | */ | ||
| 198 | unsigned short nr_hw_segments; | ||
| 199 | |||
| 200 | unsigned short ioprio; | 196 | unsigned short ioprio; |
| 201 | 197 | ||
| 202 | void *special; | 198 | void *special; |
| @@ -220,6 +216,8 @@ struct request { | |||
| 220 | void *data; | 216 | void *data; |
| 221 | void *sense; | 217 | void *sense; |
| 222 | 218 | ||
| 219 | unsigned long deadline; | ||
| 220 | struct list_head timeout_list; | ||
| 223 | unsigned int timeout; | 221 | unsigned int timeout; |
| 224 | int retries; | 222 | int retries; |
| 225 | 223 | ||
| @@ -233,6 +231,11 @@ struct request { | |||
| 233 | struct request *next_rq; | 231 | struct request *next_rq; |
| 234 | }; | 232 | }; |
| 235 | 233 | ||
| 234 | static inline unsigned short req_get_ioprio(struct request *req) | ||
| 235 | { | ||
| 236 | return req->ioprio; | ||
| 237 | } | ||
| 238 | |||
| 236 | /* | 239 | /* |
| 237 | * State information carried for REQ_TYPE_PM_SUSPEND and REQ_TYPE_PM_RESUME | 240 | * State information carried for REQ_TYPE_PM_SUSPEND and REQ_TYPE_PM_RESUME |
| 238 | * requests. Some step values could eventually be made generic. | 241 | * requests. Some step values could eventually be made generic. |
| @@ -252,6 +255,7 @@ typedef void (request_fn_proc) (struct request_queue *q); | |||
| 252 | typedef int (make_request_fn) (struct request_queue *q, struct bio *bio); | 255 | typedef int (make_request_fn) (struct request_queue *q, struct bio *bio); |
| 253 | typedef int (prep_rq_fn) (struct request_queue *, struct request *); | 256 | typedef int (prep_rq_fn) (struct request_queue *, struct request *); |
| 254 | typedef void (unplug_fn) (struct request_queue *); | 257 | typedef void (unplug_fn) (struct request_queue *); |
| 258 | typedef int (prepare_discard_fn) (struct request_queue *, struct request *); | ||
| 255 | 259 | ||
| 256 | struct bio_vec; | 260 | struct bio_vec; |
| 257 | struct bvec_merge_data { | 261 | struct bvec_merge_data { |
| @@ -265,6 +269,15 @@ typedef int (merge_bvec_fn) (struct request_queue *, struct bvec_merge_data *, | |||
| 265 | typedef void (prepare_flush_fn) (struct request_queue *, struct request *); | 269 | typedef void (prepare_flush_fn) (struct request_queue *, struct request *); |
| 266 | typedef void (softirq_done_fn)(struct request *); | 270 | typedef void (softirq_done_fn)(struct request *); |
| 267 | typedef int (dma_drain_needed_fn)(struct request *); | 271 | typedef int (dma_drain_needed_fn)(struct request *); |
| 272 | typedef int (lld_busy_fn) (struct request_queue *q); | ||
| 273 | |||
| 274 | enum blk_eh_timer_return { | ||
| 275 | BLK_EH_NOT_HANDLED, | ||
| 276 | BLK_EH_HANDLED, | ||
| 277 | BLK_EH_RESET_TIMER, | ||
| 278 | }; | ||
| 279 | |||
| 280 | typedef enum blk_eh_timer_return (rq_timed_out_fn)(struct request *); | ||
| 268 | 281 | ||
| 269 | enum blk_queue_state { | 282 | enum blk_queue_state { |
| 270 | Queue_down, | 283 | Queue_down, |
| @@ -307,10 +320,13 @@ struct request_queue | |||
| 307 | make_request_fn *make_request_fn; | 320 | make_request_fn *make_request_fn; |
| 308 | prep_rq_fn *prep_rq_fn; | 321 | prep_rq_fn *prep_rq_fn; |
| 309 | unplug_fn *unplug_fn; | 322 | unplug_fn *unplug_fn; |
| 323 | prepare_discard_fn *prepare_discard_fn; | ||
| 310 | merge_bvec_fn *merge_bvec_fn; | 324 | merge_bvec_fn *merge_bvec_fn; |
| 311 | prepare_flush_fn *prepare_flush_fn; | 325 | prepare_flush_fn *prepare_flush_fn; |
| 312 | softirq_done_fn *softirq_done_fn; | 326 | softirq_done_fn *softirq_done_fn; |
| 327 | rq_timed_out_fn *rq_timed_out_fn; | ||
| 313 | dma_drain_needed_fn *dma_drain_needed; | 328 | dma_drain_needed_fn *dma_drain_needed; |
| 329 | lld_busy_fn *lld_busy_fn; | ||
| 314 | 330 | ||
| 315 | /* | 331 | /* |
| 316 | * Dispatch queue sorting | 332 | * Dispatch queue sorting |
| @@ -385,6 +401,10 @@ struct request_queue | |||
| 385 | unsigned int nr_sorted; | 401 | unsigned int nr_sorted; |
| 386 | unsigned int in_flight; | 402 | unsigned int in_flight; |
| 387 | 403 | ||
| 404 | unsigned int rq_timeout; | ||
| 405 | struct timer_list timeout; | ||
| 406 | struct list_head timeout_list; | ||
| 407 | |||
| 388 | /* | 408 | /* |
| 389 | * sg stuff | 409 | * sg stuff |
| 390 | */ | 410 | */ |
| @@ -421,6 +441,10 @@ struct request_queue | |||
| 421 | #define QUEUE_FLAG_ELVSWITCH 8 /* don't use elevator, just do FIFO */ | 441 | #define QUEUE_FLAG_ELVSWITCH 8 /* don't use elevator, just do FIFO */ |
| 422 | #define QUEUE_FLAG_BIDI 9 /* queue supports bidi requests */ | 442 | #define QUEUE_FLAG_BIDI 9 /* queue supports bidi requests */ |
| 423 | #define QUEUE_FLAG_NOMERGES 10 /* disable merge attempts */ | 443 | #define QUEUE_FLAG_NOMERGES 10 /* disable merge attempts */ |
| 444 | #define QUEUE_FLAG_SAME_COMP 11 /* force complete on same CPU */ | ||
| 445 | #define QUEUE_FLAG_FAIL_IO 12 /* fake timeout */ | ||
| 446 | #define QUEUE_FLAG_STACKABLE 13 /* supports request stacking */ | ||
| 447 | #define QUEUE_FLAG_NONROT 14 /* non-rotational device (SSD) */ | ||
| 424 | 448 | ||
| 425 | static inline int queue_is_locked(struct request_queue *q) | 449 | static inline int queue_is_locked(struct request_queue *q) |
| 426 | { | 450 | { |
| @@ -526,7 +550,10 @@ enum { | |||
| 526 | #define blk_queue_tagged(q) test_bit(QUEUE_FLAG_QUEUED, &(q)->queue_flags) | 550 | #define blk_queue_tagge |
