]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - block/elevator.c
x86: force enable HPET on (some?) ICH9 boards
[linux-2.6-omap-h63xx.git] / block / elevator.c
index e452deb803957c1f71d71901ef669a630036363b..8cd5775acd7a2d4c1111acb0f823a57a46819dc0 100644 (file)
@@ -185,9 +185,7 @@ static elevator_t *elevator_alloc(struct request_queue *q,
 
        eq->ops = &e->ops;
        eq->elevator_type = e;
-       kobject_init(&eq->kobj);
-       kobject_set_name(&eq->kobj, "%s", "iosched");
-       eq->kobj.ktype = &elv_ktype;
+       kobject_init(&eq->kobj, &elv_ktype);
        mutex_init(&eq->sysfs_lock);
 
        eq->hash = kmalloc_node(sizeof(struct hlist_head) * ELV_HASH_ENTRIES,
@@ -743,7 +741,21 @@ struct request *elv_next_request(struct request_queue *q)
                        q->boundary_rq = NULL;
                }
 
-               if ((rq->cmd_flags & REQ_DONTPREP) || !q->prep_rq_fn)
+               if (rq->cmd_flags & REQ_DONTPREP)
+                       break;
+
+               if (q->dma_drain_size && rq->data_len) {
+                       /*
+                        * make sure space for the drain appears we
+                        * know we can do this because max_hw_segments
+                        * has been adjusted to be one fewer than the
+                        * device can handle
+                        */
+                       rq->nr_phys_segments++;
+                       rq->nr_hw_segments++;
+               }
+
+               if (!q->prep_rq_fn)
                        break;
 
                ret = q->prep_rq_fn(q, rq);
@@ -756,6 +768,16 @@ struct request *elv_next_request(struct request_queue *q)
                         * avoid resource deadlock.  REQ_STARTED will
                         * prevent other fs requests from passing this one.
                         */
+                       if (q->dma_drain_size && rq->data_len &&
+                           !(rq->cmd_flags & REQ_DONTPREP)) {
+                               /*
+                                * remove the space for the drain we added
+                                * so that we don't add it again
+                                */
+                               --rq->nr_phys_segments;
+                               --rq->nr_hw_segments;
+                       }
+
                        rq = NULL;
                        break;
                } else if (ret == BLKPREP_KILL) {
@@ -931,9 +953,7 @@ int elv_register_queue(struct request_queue *q)
        elevator_t *e = q->elevator;
        int error;
 
-       e->kobj.parent = &q->kobj;
-
-       error = kobject_add(&e->kobj);
+       error = kobject_add(&e->kobj, &q->kobj, "%s", "iosched");
        if (!error) {
                struct elv_fs_entry *attr = e->elevator_type->elevator_attrs;
                if (attr) {