diff options
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/bio.h | 3 | ||||
| -rw-r--r-- | include/linux/blk.h | 21 | ||||
| -rw-r--r-- | include/linux/blkdev.h | 28 | ||||
| -rw-r--r-- | include/linux/elevator.h | 7 |
4 files changed, 38 insertions, 21 deletions
diff --git a/include/linux/bio.h b/include/linux/bio.h index 93ac8216aae4..d272c152ebda 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -101,6 +101,7 @@ struct bio { #define BIO_EOF 2 /* out-out-bounds error */ #define BIO_SEG_VALID 3 /* nr_hw_seg valid */ #define BIO_CLONED 4 /* doesn't own data */ +#define BIO_BOUNCED 5 /* bio is a bounce bio */ #define bio_flagged(bio, flag) ((bio)->bi_flags & (1 << (flag))) /* @@ -201,7 +202,7 @@ struct bio { extern struct bio *bio_alloc(int, int); extern void bio_put(struct bio *); -extern int bio_endio(struct bio *, unsigned int, int); +extern void bio_endio(struct bio *, unsigned int, int); struct request_queue; extern inline int bio_phys_segments(struct request_queue *, struct bio *); extern inline int bio_hw_segments(struct request_queue *, struct bio *); diff --git a/include/linux/blk.h b/include/linux/blk.h index 7fbd3f6acae8..6f47ea7c853c 100644 --- a/include/linux/blk.h +++ b/include/linux/blk.h @@ -39,33 +39,20 @@ void initrd_init(void); */ extern int end_that_request_first(struct request *, int, int); +extern int end_that_request_chunk(struct request *, int, int); extern void end_that_request_last(struct request *); struct request *elv_next_request(request_queue_t *q); static inline void blkdev_dequeue_request(struct request *req) { - list_del(&req->queuelist); + BUG_ON(list_empty(&req->queuelist)); + + list_del_init(&req->queuelist); if (req->q) elv_remove_request(req->q, req); } -#define _elv_add_request_core(q, rq, where, plug) \ - do { \ - if ((plug)) \ - blk_plug_device((q)); \ - (q)->elevator.elevator_add_req_fn((q), (rq), (where)); \ - } while (0) - -#define _elv_add_request(q, rq, back, p) do { \ - if ((back)) \ - _elv_add_request_core((q), (rq), (q)->queue_head.prev, (p)); \ - else \ - _elv_add_request_core((q), (rq), &(q)->queue_head, (p)); \ -} while (0) - -#define elv_add_request(q, rq, back) _elv_add_request((q), (rq), (back), 1) - #if defined(MAJOR_NR) || defined(IDE_DRIVER) #if (MAJOR_NR != SCSI_TAPE_MAJOR) && (MAJOR_NR != OSST_MAJOR) #if !defined(IDE_DRIVER) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 42e81a4a0cab..de87dee16f83 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]; @@ -215,6 +217,7 @@ struct request_queue unsigned int max_segment_size; unsigned long seg_boundary_mask; + unsigned int dma_alignment; wait_queue_head_t queue_wait; @@ -254,6 +257,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,7 +278,7 @@ 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)) \ @@ -339,6 +349,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 +396,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) diff --git a/include/linux/elevator.h b/include/linux/elevator.h index 8a54a1c5e5af..62092e8ed2ad 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h @@ -40,8 +40,8 @@ struct elevator_s /* * block elevator interface */ -extern void __elv_add_request(request_queue_t *, struct request *, - struct list_head *); +extern void elv_add_request(request_queue_t *, struct request *, int, int); +extern void __elv_add_request(request_queue_t *, struct request *, int, int); extern int elv_merge(request_queue_t *, struct list_head **, struct bio *); extern void elv_merge_requests(request_queue_t *, struct request *, struct request *); @@ -50,6 +50,9 @@ extern void elv_remove_request(request_queue_t *, struct request *); extern int elv_queue_empty(request_queue_t *); extern inline struct list_head *elv_get_sort_head(request_queue_t *, struct request *); +#define __elv_add_request_pos(q, rq, pos) \ + (q)->elevator.elevator_add_req_fn((q), (rq), (pos)) + /* * noop I/O scheduler. always merges, always inserts new request at tail */ |
