Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 309193
b: refs/heads/master
c: 5a5bafd
h: refs/heads/master
i:
  309191: 6b432ed
v: v3
  • Loading branch information
Tejun Heo authored and Jens Axboe committed Mar 6, 2012
1 parent 6a91f79 commit db4e9e1
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 46 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b95ada558c9e69c69ffd6950eb644ee8a3dba18f
refs/heads/master: 5a5bafdc396b1da7570f84fb96a0f8a288970c5e
90 changes: 45 additions & 45 deletions trunk/block/elevator.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,11 +121,10 @@ static struct elevator_type *elevator_get(const char *name)
return e;
}

static int elevator_init_queue(struct request_queue *q,
struct elevator_queue *eq)
static int elevator_init_queue(struct request_queue *q)
{
eq->elevator_data = eq->type->ops.elevator_init_fn(q);
if (eq->elevator_data)
q->elevator->elevator_data = q->elevator->type->ops.elevator_init_fn(q);
if (q->elevator->elevator_data)
return 0;
return -ENOMEM;
}
Expand Down Expand Up @@ -188,7 +187,6 @@ static void elevator_release(struct kobject *kobj)
int elevator_init(struct request_queue *q, char *name)
{
struct elevator_type *e = NULL;
struct elevator_queue *eq;
int err;

if (unlikely(q->elevator))
Expand Down Expand Up @@ -222,17 +220,16 @@ int elevator_init(struct request_queue *q, char *name)
}
}

eq = elevator_alloc(q, e);
if (!eq)
q->elevator = elevator_alloc(q, e);
if (!q->elevator)
return -ENOMEM;

err = elevator_init_queue(q, eq);
err = elevator_init_queue(q);
if (err) {
kobject_put(&eq->kobj);
kobject_put(&q->elevator->kobj);
return err;
}

q->elevator = eq;
return 0;
}
EXPORT_SYMBOL(elevator_init);
Expand Down Expand Up @@ -801,8 +798,9 @@ static struct kobj_type elv_ktype = {
.release = elevator_release,
};

int __elv_register_queue(struct request_queue *q, struct elevator_queue *e)
int elv_register_queue(struct request_queue *q)
{
struct elevator_queue *e = q->elevator;
int error;

error = kobject_add(&e->kobj, &q->kobj, "%s", "iosched");
Expand All @@ -820,11 +818,6 @@ int __elv_register_queue(struct request_queue *q, struct elevator_queue *e)
}
return error;
}

int elv_register_queue(struct request_queue *q)
{
return __elv_register_queue(q, q->elevator);
}
EXPORT_SYMBOL(elv_register_queue);

void elv_unregister_queue(struct request_queue *q)
Expand Down Expand Up @@ -907,51 +900,58 @@ EXPORT_SYMBOL_GPL(elv_unregister);
*/
static int elevator_switch(struct request_queue *q, struct elevator_type *new_e)
{
struct elevator_queue *old_elevator, *e;
struct elevator_queue *old = q->elevator;
bool registered = old->registered;
int err;

/* allocate new elevator */
e = elevator_alloc(q, new_e);
if (!e)
return -ENOMEM;

err = elevator_init_queue(q, e);
if (err) {
kobject_put(&e->kobj);
return err;
}

/* turn on BYPASS and drain all requests w/ elevator private data */
/*
* Turn on BYPASS and drain all requests w/ elevator private data.
* Block layer doesn't call into a quiesced elevator - all requests
* are directly put on the dispatch list without elevator data
* using INSERT_BACK. All requests have SOFTBARRIER set and no
* merge happens either.
*/
elv_quiesce_start(q);

/* unregister old queue, register new one and kill old elevator */
if (q->elevator->registered) {
/* unregister and clear all auxiliary data of the old elevator */
if (registered)
elv_unregister_queue(q);
err = __elv_register_queue(q, e);
if (err)
goto fail_register;
}

/* done, clear io_cq's, switch elevators and turn off BYPASS */
spin_lock_irq(q->queue_lock);
ioc_clear_queue(q);
old_elevator = q->elevator;
q->elevator = e;
spin_unlock_irq(q->queue_lock);

elevator_exit(old_elevator);
/* allocate, init and register new elevator */
err = -ENOMEM;
q->elevator = elevator_alloc(q, new_e);
if (!q->elevator)
goto fail_init;

err = elevator_init_queue(q);
if (err) {
kobject_put(&q->elevator->kobj);
goto fail_init;
}

if (registered) {
err = elv_register_queue(q);
if (err)
goto fail_register;
}

/* done, kill the old one and finish */
elevator_exit(old);
elv_quiesce_end(q);

blk_add_trace_msg(q, "elv switch: %s", e->type->elevator_name);
blk_add_trace_msg(q, "elv switch: %s", new_e->elevator_name);

return 0;

fail_register:
/*
* switch failed, exit the new io scheduler and reattach the old
* one again (along with re-adding the sysfs dir)
*/
elevator_exit(e);
elevator_exit(q->elevator);
fail_init:
/* switch failed, restore and re-register old elevator */
q->elevator = old;
elv_register_queue(q);
elv_quiesce_end(q);

Expand Down

0 comments on commit db4e9e1

Please sign in to comment.