]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - include/linux/blkdev.h
block: fix memory hotplug and bouncing in block layer
[linux-2.6-omap-h63xx.git] / include / linux / blkdev.h
index 90392a9d7a9c782f3745db67b89b03bd67ba588c..c5065e3d2ca9eea3e1a4319d117cdf4d5abbd539 100644 (file)
@@ -112,6 +112,7 @@ enum rq_flag_bits {
        __REQ_RW_SYNC,          /* request is sync (O_DIRECT) */
        __REQ_ALLOCED,          /* request came from our alloc pool */
        __REQ_RW_META,          /* metadata io request */
+       __REQ_COPY_USER,        /* contains copies of user pages */
        __REQ_NR_BITS,          /* stops here */
 };
 
@@ -133,11 +134,14 @@ enum rq_flag_bits {
 #define REQ_RW_SYNC    (1 << __REQ_RW_SYNC)
 #define REQ_ALLOCED    (1 << __REQ_ALLOCED)
 #define REQ_RW_META    (1 << __REQ_RW_META)
+#define REQ_COPY_USER  (1 << __REQ_COPY_USER)
 
 #define BLK_MAX_CDB    16
 
 /*
- * try to put the fields that are referenced together in the same cacheline
+ * try to put the fields that are referenced together in the same cacheline.
+ * if you modify this structure, be sure to check block/blk-core.c:rq_init()
+ * as well!
  */
 struct request {
        struct list_head queuelist;
@@ -215,6 +219,7 @@ struct request {
        unsigned char cmd[BLK_MAX_CDB];
 
        unsigned int data_len;
+       unsigned int extra_len; /* length of alignment and padding */
        unsigned int sense_len;
        void *data;
        void *sense;
@@ -256,6 +261,7 @@ struct bio_vec;
 typedef int (merge_bvec_fn) (struct request_queue *, struct bio *, struct bio_vec *);
 typedef void (prepare_flush_fn) (struct request_queue *, struct request *);
 typedef void (softirq_done_fn)(struct request *);
+typedef int (dma_drain_needed_fn)(struct request *);
 
 enum blk_queue_state {
        Queue_down,
@@ -292,6 +298,7 @@ struct request_queue
        merge_bvec_fn           *merge_bvec_fn;
        prepare_flush_fn        *prepare_flush_fn;
        softirq_done_fn         *softirq_done_fn;
+       dma_drain_needed_fn     *dma_drain_needed;
 
        /*
         * Dispatch queue sorting
@@ -357,6 +364,7 @@ struct request_queue
        unsigned long           seg_boundary_mask;
        void                    *dma_drain_buffer;
        unsigned int            dma_drain_size;
+       unsigned int            dma_pad_mask;
        unsigned int            dma_alignment;
 
        struct blk_queue_tag    *queue_tags;
@@ -527,8 +535,13 @@ extern unsigned long blk_max_low_pfn, blk_max_pfn;
  * BLK_BOUNCE_ANY      : don't bounce anything
  * BLK_BOUNCE_ISA      : bounce pages above ISA DMA boundary
  */
+
+#if BITS_PER_LONG == 32
 #define BLK_BOUNCE_HIGH                ((u64)blk_max_low_pfn << PAGE_SHIFT)
-#define BLK_BOUNCE_ANY         ((u64)blk_max_pfn << PAGE_SHIFT)
+#else
+#define BLK_BOUNCE_HIGH                -1ULL
+#endif
+#define BLK_BOUNCE_ANY         (-1ULL)
 #define BLK_BOUNCE_ISA         (ISA_DMA_THRESHOLD)
 
 /*
@@ -696,8 +709,10 @@ extern void blk_queue_max_hw_segments(struct request_queue *, unsigned short);
 extern void blk_queue_max_segment_size(struct request_queue *, unsigned int);
 extern void blk_queue_hardsect_size(struct request_queue *, unsigned short);
 extern void blk_queue_stack_limits(struct request_queue *t, struct request_queue *b);
-extern int blk_queue_dma_drain(struct request_queue *q, void *buf,
-                              unsigned int size);
+extern void blk_queue_dma_pad(struct request_queue *, unsigned int);
+extern int blk_queue_dma_drain(struct request_queue *q,
+                              dma_drain_needed_fn *dma_drain_needed,
+                              void *buf, unsigned int size);
 extern void blk_queue_segment_boundary(struct request_queue *, unsigned long);
 extern void blk_queue_prep_rq(struct request_queue *, prep_rq_fn *pfn);
 extern void blk_queue_merge_bvec(struct request_queue *, merge_bvec_fn *);