vserver 2.0 rc7
[linux-2.6.git] / include / linux / blkdev.h
index 5615a3c..ef1afc1 100644 (file)
@@ -93,6 +93,9 @@ struct io_context *get_io_context(int gfp_flags);
 void copy_io_context(struct io_context **pdst, struct io_context **psrc);
 void swap_io_context(struct io_context **ioc1, struct io_context **ioc2);
 
+struct request;
+typedef void (rq_end_io_fn)(struct request *);
+
 struct request_list {
        int count[2];
        int starved[2];
@@ -176,6 +179,12 @@ struct request {
         * For Power Management requests
         */
        struct request_pm_state *pm;
+
+       /*
+        * completion callback. end_io_data should be folded in with waiting
+        */
+       rq_end_io_fn *end_io;
+       void *end_io_data;
 };
 
 /*
@@ -210,6 +219,7 @@ enum rq_flag_bits {
        __REQ_PM_SHUTDOWN,      /* shutdown request */
        __REQ_BAR_PREFLUSH,     /* barrier pre-flush done */
        __REQ_BAR_POSTFLUSH,    /* barrier post-flush */
+       __REQ_BAR_FLUSH,        /* rq is the flush request */
        __REQ_NR_BITS,          /* stops here */
 };
 
@@ -237,6 +247,7 @@ enum rq_flag_bits {
 #define REQ_PM_SHUTDOWN        (1 << __REQ_PM_SHUTDOWN)
 #define REQ_BAR_PREFLUSH       (1 << __REQ_BAR_PREFLUSH)
 #define REQ_BAR_POSTFLUSH      (1 << __REQ_BAR_POSTFLUSH)
+#define REQ_BAR_FLUSH  (1 << __REQ_BAR_FLUSH)
 
 /*
  * State information carried for REQ_PM_SUSPEND and REQ_PM_RESUME
@@ -266,6 +277,8 @@ struct bio_vec;
 typedef int (merge_bvec_fn) (request_queue_t *, struct bio *, struct bio_vec *);
 typedef void (activity_fn) (void *data, int rw);
 typedef int (issue_flush_fn) (request_queue_t *, struct gendisk *, sector_t *);
+typedef int (prepare_flush_fn) (request_queue_t *, struct request *);
+typedef void (end_flush_fn) (request_queue_t *, struct request *);
 
 enum blk_queue_state {
        Queue_down,
@@ -309,6 +322,8 @@ struct request_queue
        merge_bvec_fn           *merge_bvec_fn;
        activity_fn             *activity_fn;
        issue_flush_fn          *issue_flush_fn;
+       prepare_flush_fn        *prepare_flush_fn;
+       end_flush_fn            *end_flush_fn;
 
        /*
         * Auto-unplugging state
@@ -332,7 +347,7 @@ struct request_queue
         * queue needs bounce pages for pages above this limit
         */
        unsigned long           bounce_pfn;
-       int                     bounce_gfp;
+       unsigned int            bounce_gfp;
 
        /*
         * various queue flags, see QUEUE_* below
@@ -340,8 +355,11 @@ struct request_queue
        unsigned long           queue_flags;
 
        /*
-        * protects queue structures from reentrancy
+        * protects queue structures from reentrancy. ->__queue_lock should
+        * _never_ be used directly, it is queue private. always use
+        * ->queue_lock.
         */
+       spinlock_t              __queue_lock;
        spinlock_t              *queue_lock;
 
        /*
@@ -380,6 +398,18 @@ struct request_queue
        unsigned int            sg_reserved_size;
 
        struct list_head        drain_list;
+
+       /*
+        * reserved for flush operations
+        */
+       struct request          *flush_rq;
+       unsigned char           ordered;
+};
+
+enum {
+       QUEUE_ORDERED_NONE,
+       QUEUE_ORDERED_TAG,
+       QUEUE_ORDERED_FLUSH,
 };
 
 #define RQ_INACTIVE            (-1)
@@ -396,12 +426,13 @@ struct request_queue
 #define QUEUE_FLAG_DEAD                5       /* queue being torn down */
 #define QUEUE_FLAG_REENTER     6       /* Re-entrancy avoidance */
 #define QUEUE_FLAG_PLUGGED     7       /* queue is plugged */
-#define QUEUE_FLAG_ORDERED     8       /* supports ordered writes */
-#define QUEUE_FLAG_DRAIN       9       /* draining queue for sched switch */
+#define QUEUE_FLAG_DRAIN       8       /* draining queue for sched switch */
+#define QUEUE_FLAG_FLUSH       9       /* doing barrier flush sequence */
 
 #define blk_queue_plugged(q)   test_bit(QUEUE_FLAG_PLUGGED, &(q)->queue_flags)
 #define blk_queue_tagged(q)    test_bit(QUEUE_FLAG_QUEUED, &(q)->queue_flags)
 #define blk_queue_stopped(q)   test_bit(QUEUE_FLAG_STOPPED, &(q)->queue_flags)
+#define blk_queue_flushing(q)  test_bit(QUEUE_FLAG_FLUSH, &(q)->queue_flags)
 
 #define blk_fs_request(rq)     ((rq)->flags & REQ_CMD)
 #define blk_pc_request(rq)     ((rq)->flags & REQ_BLOCK_PC)
@@ -509,10 +540,10 @@ extern void blk_unregister_queue(struct gendisk *disk);
 extern void register_disk(struct gendisk *dev);
 extern void generic_make_request(struct bio *bio);
 extern void blk_put_request(struct request *);
+extern void blk_end_sync_rq(struct request *rq);
 extern void blk_attempt_remerge(request_queue_t *, struct request *);
 extern void __blk_attempt_remerge(request_queue_t *, struct request *);
 extern struct request *blk_get_request(request_queue_t *, int, int);
-extern void blk_put_request(struct request *);
 extern void blk_insert_request(request_queue_t *, struct request *, int, void *, int);
 extern void blk_requeue_request(request_queue_t *, struct request *);
 extern void blk_plug_device(request_queue_t *);
@@ -602,6 +633,9 @@ extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bd
 extern void blk_queue_ordered(request_queue_t *, int);
 extern void blk_queue_issue_flush_fn(request_queue_t *, issue_flush_fn *);
 extern int blkdev_scsi_issue_flush_fn(request_queue_t *, struct gendisk *, sector_t *);
+extern struct request *blk_start_pre_flush(request_queue_t *,struct request *);
+extern int blk_complete_barrier_rq(request_queue_t *, struct request *, int);
+extern int blk_complete_barrier_rq_locked(request_queue_t *, struct request *, int);
 
 extern int blk_rq_map_sg(request_queue_t *, struct request *, struct scatterlist *);
 extern void blk_dump_rq_flags(struct request *, char *);