nfsd4: set cb_client inside setup_callback_client
[safe/jmp/linux-2.6] / block / elevator.c
index ff60177..7073a90 100644 (file)
@@ -65,7 +65,7 @@ DEFINE_TRACE(block_rq_issue);
 static int elv_iosched_allow_merge(struct request *rq, struct bio *bio)
 {
        struct request_queue *q = rq->q;
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
 
        if (e->ops->elevator_allow_merge_fn)
                return e->ops->elevator_allow_merge_fn(q, rq, bio);
@@ -208,13 +208,13 @@ __setup("elevator=", elevator_setup);
 
 static struct kobj_type elv_ktype;
 
-static elevator_t *elevator_alloc(struct request_queue *q,
+static struct elevator_queue *elevator_alloc(struct request_queue *q,
                                  struct elevator_type *e)
 {
-       elevator_t *eq;
+       struct elevator_queue *eq;
        int i;
 
-       eq = kmalloc_node(sizeof(elevator_t), GFP_KERNEL | __GFP_ZERO, q->node);
+       eq = kmalloc_node(sizeof(*eq), GFP_KERNEL | __GFP_ZERO, q->node);
        if (unlikely(!eq))
                goto err;
 
@@ -240,8 +240,9 @@ err:
 
 static void elevator_release(struct kobject *kobj)
 {
-       elevator_t *e = container_of(kobj, elevator_t, kobj);
+       struct elevator_queue *e;
 
+       e = container_of(kobj, struct elevator_queue, kobj);
        elevator_put(e->elevator_type);
        kfree(e->hash);
        kfree(e);
@@ -297,7 +298,7 @@ int elevator_init(struct request_queue *q, char *name)
 }
 EXPORT_SYMBOL(elevator_init);
 
-void elevator_exit(elevator_t *e)
+void elevator_exit(struct elevator_queue *e)
 {
        mutex_lock(&e->sysfs_lock);
        if (e->ops->elevator_exit_fn)
@@ -311,7 +312,7 @@ EXPORT_SYMBOL(elevator_exit);
 
 static void elv_activate_rq(struct request_queue *q, struct request *rq)
 {
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
 
        if (e->ops->elevator_activate_req_fn)
                e->ops->elevator_activate_req_fn(q, rq);
@@ -319,7 +320,7 @@ static void elv_activate_rq(struct request_queue *q, struct request *rq)
 
 static void elv_deactivate_rq(struct request_queue *q, struct request *rq)
 {
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
 
        if (e->ops->elevator_deactivate_req_fn)
                e->ops->elevator_deactivate_req_fn(q, rq);
@@ -338,7 +339,7 @@ static void elv_rqhash_del(struct request_queue *q, struct request *rq)
 
 static void elv_rqhash_add(struct request_queue *q, struct request *rq)
 {
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
 
        BUG_ON(ELV_ON_HASH(rq));
        hlist_add_head(&rq->hash, &e->hash[ELV_HASH_FN(rq_hash_key(rq))]);
@@ -352,7 +353,7 @@ static void elv_rqhash_reposition(struct request_queue *q, struct request *rq)
 
 static struct request *elv_rqhash_find(struct request_queue *q, sector_t offset)
 {
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
        struct hlist_head *hash_list = &e->hash[ELV_HASH_FN(offset)];
        struct hlist_node *entry, *next;
        struct request *rq;
@@ -494,7 +495,7 @@ EXPORT_SYMBOL(elv_dispatch_add_tail);
 
 int elv_merge(struct request_queue *q, struct request **req, struct bio *bio)
 {
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
        struct request *__rq;
        int ret;
 
@@ -529,7 +530,7 @@ int elv_merge(struct request_queue *q, struct request **req, struct bio *bio)
 
 void elv_merged_request(struct request_queue *q, struct request *rq, int type)
 {
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
 
        if (e->ops->elevator_merged_fn)
                e->ops->elevator_merged_fn(q, rq, type);
@@ -543,7 +544,7 @@ void elv_merged_request(struct request_queue *q, struct request *rq, int type)
 void elv_merge_requests(struct request_queue *q, struct request *rq,
                             struct request *next)
 {
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
 
        if (e->ops->elevator_merge_req_fn)
                e->ops->elevator_merge_req_fn(q, rq, next);
@@ -572,7 +573,7 @@ void elv_requeue_request(struct request_queue *q, struct request *rq)
        elv_insert(q, rq, ELEVATOR_INSERT_REQUEUE);
 }
 
-static void elv_drain_elevator(struct request_queue *q)
+void elv_drain_elevator(struct request_queue *q)
 {
        static int printed;
        while (q->elevator->ops->elevator_dispatch_fn(q, 1))
@@ -586,6 +587,31 @@ static void elv_drain_elevator(struct request_queue *q)
        }
 }
 
+/*
+ * Call with queue lock held, interrupts disabled
+ */
+void elv_quiesce_start(struct request_queue *q)
+{
+       queue_flag_set(QUEUE_FLAG_ELVSWITCH, q);
+
+       /*
+        * make sure we don't have any requests in flight
+        */
+       elv_drain_elevator(q);
+       while (q->rq.elvpriv) {
+               blk_start_queueing(q);
+               spin_unlock_irq(q->queue_lock);
+               msleep(10);
+               spin_lock_irq(q->queue_lock);
+               elv_drain_elevator(q);
+       }
+}
+
+void elv_quiesce_end(struct request_queue *q)
+{
+       queue_flag_clear(QUEUE_FLAG_ELVSWITCH, q);
+}
+
 void elv_insert(struct request_queue *q, struct request *rq, int where)
 {
        struct list_head *pos;
@@ -676,7 +702,7 @@ void elv_insert(struct request_queue *q, struct request *rq, int where)
        }
 
        if (unplug_it && blk_queue_plugged(q)) {
-               int nrq = q->rq.count[READ] + q->rq.count[WRITE]
+               int nrq = q->rq.count[BLK_RW_SYNC] + q->rq.count[BLK_RW_ASYNC]
                        - q->in_flight;
 
                if (nrq >= q->unplug_thresh)
@@ -846,7 +872,7 @@ void elv_dequeue_request(struct request_queue *q, struct request *rq)
 
 int elv_queue_empty(struct request_queue *q)
 {
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
 
        if (!list_empty(&q->queue_head))
                return 0;
@@ -860,7 +886,7 @@ EXPORT_SYMBOL(elv_queue_empty);
 
 struct request *elv_latter_request(struct request_queue *q, struct request *rq)
 {
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
 
        if (e->ops->elevator_latter_req_fn)
                return e->ops->elevator_latter_req_fn(q, rq);
@@ -869,7 +895,7 @@ struct request *elv_latter_request(struct request_queue *q, struct request *rq)
 
 struct request *elv_former_request(struct request_queue *q, struct request *rq)
 {
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
 
        if (e->ops->elevator_former_req_fn)
                return e->ops->elevator_former_req_fn(q, rq);
@@ -878,7 +904,7 @@ struct request *elv_former_request(struct request_queue *q, struct request *rq)
 
 int elv_set_request(struct request_queue *q, struct request *rq, gfp_t gfp_mask)
 {
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
 
        if (e->ops->elevator_set_req_fn)
                return e->ops->elevator_set_req_fn(q, rq, gfp_mask);
@@ -889,7 +915,7 @@ int elv_set_request(struct request_queue *q, struct request *rq, gfp_t gfp_mask)
 
 void elv_put_request(struct request_queue *q, struct request *rq)
 {
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
 
        if (e->ops->elevator_put_req_fn)
                e->ops->elevator_put_req_fn(rq);
@@ -897,7 +923,7 @@ void elv_put_request(struct request_queue *q, struct request *rq)
 
 int elv_may_queue(struct request_queue *q, int rw)
 {
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
 
        if (e->ops->elevator_may_queue_fn)
                return e->ops->elevator_may_queue_fn(q, rw);
@@ -920,7 +946,7 @@ EXPORT_SYMBOL(elv_abort_queue);
 
 void elv_completed_request(struct request_queue *q, struct request *rq)
 {
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
 
        /*
         * request is released from the driver, io must be done
@@ -955,13 +981,14 @@ void elv_completed_request(struct request_queue *q, struct request *rq)
 static ssize_t
 elv_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
 {
-       elevator_t *e = container_of(kobj, elevator_t, kobj);
        struct elv_fs_entry *entry = to_elv(attr);
+       struct elevator_queue *e;
        ssize_t error;
 
        if (!entry->show)
                return -EIO;
 
+       e = container_of(kobj, struct elevator_queue, kobj);
        mutex_lock(&e->sysfs_lock);
        error = e->ops ? entry->show(e, page) : -ENOENT;
        mutex_unlock(&e->sysfs_lock);
@@ -972,13 +999,14 @@ static ssize_t
 elv_attr_store(struct kobject *kobj, struct attribute *attr,
               const char *page, size_t length)
 {
-       elevator_t *e = container_of(kobj, elevator_t, kobj);
        struct elv_fs_entry *entry = to_elv(attr);
+       struct elevator_queue *e;
        ssize_t error;
 
        if (!entry->store)
                return -EIO;
 
+       e = container_of(kobj, struct elevator_queue, kobj);
        mutex_lock(&e->sysfs_lock);
        error = e->ops ? entry->store(e, page, length) : -ENOENT;
        mutex_unlock(&e->sysfs_lock);
@@ -997,7 +1025,7 @@ static struct kobj_type elv_ktype = {
 
 int elv_register_queue(struct request_queue *q)
 {
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
        int error;
 
        error = kobject_add(&e->kobj, &q->kobj, "%s", "iosched");
@@ -1015,7 +1043,7 @@ int elv_register_queue(struct request_queue *q)
        return error;
 }
 
-static void __elv_unregister_queue(elevator_t *e)
+static void __elv_unregister_queue(struct elevator_queue *e)
 {
        kobject_uevent(&e->kobj, KOBJ_REMOVE);
        kobject_del(&e->kobj);
@@ -1078,7 +1106,7 @@ EXPORT_SYMBOL_GPL(elv_unregister);
  */
 static int elevator_switch(struct request_queue *q, struct elevator_type *new_e)
 {
-       elevator_t *old_elevator, *e;
+       struct elevator_queue *old_elevator, *e;
        void *data;
 
        /*
@@ -1098,18 +1126,7 @@ static int elevator_switch(struct request_queue *q, struct elevator_type *new_e)
         * Turn on BYPASS and drain all requests w/ elevator private data
         */
        spin_lock_irq(q->queue_lock);
-
-       queue_flag_set(QUEUE_FLAG_ELVSWITCH, q);
-
-       elv_drain_elevator(q);
-
-       while (q->rq.elvpriv) {
-               blk_start_queueing(q);
-               spin_unlock_irq(q->queue_lock);
-               msleep(10);
-               spin_lock_irq(q->queue_lock);
-               elv_drain_elevator(q);
-       }
+       elv_quiesce_start(q);
 
        /*
         * Remember old elevator.
@@ -1133,7 +1150,7 @@ static int elevator_switch(struct request_queue *q, struct elevator_type *new_e)
         */
        elevator_exit(old_elevator);
        spin_lock_irq(q->queue_lock);
-       queue_flag_clear(QUEUE_FLAG_ELVSWITCH, q);
+       elv_quiesce_end(q);
        spin_unlock_irq(q->queue_lock);
 
        blk_add_trace_msg(q, "elv switch: %s", e->elevator_type->elevator_name);
@@ -1184,7 +1201,7 @@ ssize_t elv_iosched_store(struct request_queue *q, const char *name,
 
 ssize_t elv_iosched_show(struct request_queue *q, char *name)
 {
-       elevator_t *e = q->elevator;
+       struct elevator_queue *e = q->elevator;
        struct elevator_type *elv = e->elevator_type;
        struct elevator_type *__e;
        int len = 0;