diff options
Diffstat (limited to 'include/linux/blkdev.h')
| -rw-r--r-- | include/linux/blkdev.h | 72 |
1 files changed, 43 insertions, 29 deletions
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 42e81a4a0cab..cb3b342d4163 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -26,6 +26,8 @@ struct request { struct list_head queuelist; /* looking for ->queue? you must _not_ * access it directly, use * blkdev_dequeue_request! */ + int ref_count; + void *elevator_private; unsigned char cmd[16]; @@ -37,6 +39,7 @@ struct request { struct gendisk *rq_disk; int errors; sector_t sector; + unsigned long start_time; unsigned long nr_sectors; sector_t hard_sector; /* the hard_* are block layer * internals, no driver should @@ -64,7 +67,10 @@ struct request { /* For packet commands */ unsigned int data_len; - void *data, *sense; + void *data; + + unsigned int sense_len; + void *sense; unsigned int timeout; struct completion *waiting; @@ -126,7 +132,6 @@ typedef int (merge_request_fn) (request_queue_t *, struct request *, typedef int (merge_requests_fn) (request_queue_t *, struct request *, struct request *); typedef void (request_fn_proc) (request_queue_t *q); -typedef request_queue_t * (queue_proc) (kdev_t dev); typedef int (make_request_fn) (request_queue_t *q, struct bio *bio); typedef int (prep_rq_fn) (request_queue_t *, struct request *); typedef void (unplug_fn) (void *q); @@ -150,12 +155,6 @@ struct blk_queue_tag { int max_depth; }; -/* - * Default nr free requests per queue, ll_rw_blk will scale it down - * according to available RAM at init time - */ -#define QUEUE_NR_REQUESTS 8192 - struct request_queue { /* @@ -215,10 +214,17 @@ struct request_queue unsigned int max_segment_size; unsigned long seg_boundary_mask; + unsigned int dma_alignment; wait_queue_head_t queue_wait; struct blk_queue_tag *queue_tags; + + /* + * sg stuff + */ + unsigned int sg_timeout; + unsigned int sg_reserved_size; }; #define RQ_INACTIVE (-1) @@ -254,6 +260,13 @@ struct request_queue */ #define blk_queue_headactive(q, head_active) +/* + * q->prep_rq_fn return values + */ +#define BLKPREP_OK 0 /* serve it */ +#define BLKPREP_KILL 1 /* fatal error, kill */ +#define BLKPREP_DEFER 2 /* leave on queue */ + extern unsigned long blk_max_low_pfn, blk_max_pfn; /* @@ -268,39 +281,19 @@ extern unsigned long blk_max_low_pfn, blk_max_pfn; #define BLK_BOUNCE_ISA (ISA_DMA_THRESHOLD) extern int init_emergency_isa_pool(void); -void blk_queue_bounce(request_queue_t *q, struct bio **bio); +inline void blk_queue_bounce(request_queue_t *q, struct bio **bio); #define rq_for_each_bio(bio, rq) \ if ((rq->bio)) \ for (bio = (rq)->bio; bio; bio = bio->bi_next) -struct blk_dev_struct { - /* - * queue_proc has to be atomic - */ - request_queue_t request_queue; - queue_proc *queue; - void *data; -}; - struct sec_size { unsigned block_size; unsigned block_size_bits; }; -/* - * Used to indicate the default queue for drivers that don't bother - * to implement multiple queues. We have this access macro here - * so as to eliminate the need for each and every block device - * driver to know about the internal structure of blk_dev[]. - */ -#define BLK_DEFAULT_QUEUE(_MAJOR) &blk_dev[_MAJOR].request_queue - -extern struct sec_size * blk_sec[MAX_BLKDEV]; -extern struct blk_dev_struct blk_dev[MAX_BLKDEV]; extern void register_disk(struct gendisk *dev); extern void generic_make_request(struct bio *bio); -extern inline request_queue_t *bdev_get_queue(struct block_device *bdev); extern void blk_put_request(struct request *); extern void blk_attempt_remerge(request_queue_t *, struct request *); extern void __blk_attempt_remerge(request_queue_t *, struct request *); @@ -318,6 +311,11 @@ extern void blk_start_queue(request_queue_t *q); extern void blk_stop_queue(request_queue_t *q); extern void __blk_stop_queue(request_queue_t *q); +static inline request_queue_t *bdev_get_queue(struct block_device *bdev) +{ + return bdev->bd_disk->queue; +} + /* * get ready for proper ref counting */ @@ -339,6 +337,7 @@ extern void blk_queue_segment_boundary(request_queue_t *, unsigned long); extern void blk_queue_assign_lock(request_queue_t *, spinlock_t *); extern void blk_queue_prep_rq(request_queue_t *, prep_rq_fn *pfn); extern void blk_queue_merge_bvec(request_queue_t *, merge_bvec_fn *); +extern void blk_queue_dma_alignment(request_queue_t *, int); extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); extern int blk_rq_map_sg(request_queue_t *, struct request *, struct scatterlist *); @@ -385,6 +384,21 @@ static inline int bdev_hardsect_size(struct block_device *bdev) return queue_hardsect_size(bdev_get_queue(bdev)); } +static inline int queue_dma_alignment(request_queue_t *q) +{ + int retval = 511; + + if (q && q->dma_alignment) + retval = q->dma_alignment; + + return retval; +} + +static inline int bdev_dma_aligment(struct block_device *bdev) +{ + return queue_dma_alignment(bdev_get_queue(bdev)); +} + #define blk_finished_io(nsects) do { } while (0) #define blk_started_io(nsects) do { } while (0) |
