Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 210522
b: refs/heads/master
c: 5dd531a
h: refs/heads/master
v: v3
  • Loading branch information
Jens Axboe committed Aug 23, 2010
1 parent f907762 commit c7b5cad
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 14 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: 220eb7fd984bfc7e6b4005fdf32efe9cd8af7cf2
refs/heads/master: 5dd531a03ad721b41911ddb32e6e0481404e7aaf
44 changes: 31 additions & 13 deletions trunk/block/elevator.c
Original file line number Diff line number Diff line change
Expand Up @@ -1009,18 +1009,19 @@ static int elevator_switch(struct request_queue *q, struct elevator_type *new_e)
{
struct elevator_queue *old_elevator, *e;
void *data;
int err;

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

data = elevator_init_queue(q, e);
if (!data) {
kobject_put(&e->kobj);
return 0;
return -ENOMEM;
}

/*
Expand All @@ -1043,7 +1044,8 @@ static int elevator_switch(struct request_queue *q, struct elevator_type *new_e)

__elv_unregister_queue(old_elevator);

if (elv_register_queue(q))
err = elv_register_queue(q);
if (err)
goto fail_register;

/*
Expand All @@ -1056,7 +1058,7 @@ static int elevator_switch(struct request_queue *q, struct elevator_type *new_e)

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

return 1;
return 0;

fail_register:
/*
Expand All @@ -1071,17 +1073,19 @@ static int elevator_switch(struct request_queue *q, struct elevator_type *new_e)
queue_flag_clear(QUEUE_FLAG_ELVSWITCH, q);
spin_unlock_irq(q->queue_lock);

return 0;
return err;
}

ssize_t elv_iosched_store(struct request_queue *q, const char *name,
size_t count)
/*
* Switch this queue to the given IO scheduler.
*/
int elevator_change(struct request_queue *q, const char *name)
{
char elevator_name[ELV_NAME_MAX];
struct elevator_type *e;

if (!q->elevator)
return count;
return -ENXIO;

strlcpy(elevator_name, name, sizeof(elevator_name));
e = elevator_get(strstrip(elevator_name));
Expand All @@ -1092,13 +1096,27 @@ ssize_t elv_iosched_store(struct request_queue *q, const char *name,

if (!strcmp(elevator_name, q->elevator->elevator_type->elevator_name)) {
elevator_put(e);
return count;
return 0;
}

if (!elevator_switch(q, e))
printk(KERN_ERR "elevator: switch to %s failed\n",
elevator_name);
return count;
return elevator_switch(q, e);
}
EXPORT_SYMBOL(elevator_change);

ssize_t elv_iosched_store(struct request_queue *q, const char *name,
size_t count)
{
int ret;

if (!q->elevator)
return count;

ret = elevator_change(q, name);
if (!ret)
return count;

printk(KERN_ERR "elevator: switch to %s failed\n", name);
return ret;
}

ssize_t elv_iosched_show(struct request_queue *q, char *name)
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/elevator.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ extern ssize_t elv_iosched_store(struct request_queue *, const char *, size_t);

extern int elevator_init(struct request_queue *, char *);
extern void elevator_exit(struct elevator_queue *);
extern int elevator_change(struct request_queue *, const char *);
extern int elv_rq_merge_ok(struct request *, struct bio *);

/*
Expand Down

0 comments on commit c7b5cad

Please sign in to comment.