Commit 0ee40c66 authored by Linus Torvalds's avatar Linus Torvalds
parents 236fa081 2824bc93
...@@ -97,7 +97,6 @@ static struct elevator_type *elevator_find(const char *name) ...@@ -97,7 +97,6 @@ static struct elevator_type *elevator_find(const char *name)
struct elevator_type *e = NULL; struct elevator_type *e = NULL;
struct list_head *entry; struct list_head *entry;
spin_lock_irq(&elv_list_lock);
list_for_each(entry, &elv_list) { list_for_each(entry, &elv_list) {
struct elevator_type *__e; struct elevator_type *__e;
...@@ -108,7 +107,6 @@ static struct elevator_type *elevator_find(const char *name) ...@@ -108,7 +107,6 @@ static struct elevator_type *elevator_find(const char *name)
break; break;
} }
} }
spin_unlock_irq(&elv_list_lock);
return e; return e;
} }
...@@ -120,12 +118,15 @@ static void elevator_put(struct elevator_type *e) ...@@ -120,12 +118,15 @@ static void elevator_put(struct elevator_type *e)
static struct elevator_type *elevator_get(const char *name) static struct elevator_type *elevator_get(const char *name)
{ {
struct elevator_type *e = elevator_find(name); struct elevator_type *e;
if (!e) spin_lock_irq(&elv_list_lock);
return NULL;
if (!try_module_get(e->elevator_owner)) e = elevator_find(name);
return NULL; if (e && !try_module_get(e->elevator_owner))
e = NULL;
spin_unlock_irq(&elv_list_lock);
return e; return e;
} }
...@@ -153,11 +154,15 @@ static char chosen_elevator[16]; ...@@ -153,11 +154,15 @@ static char chosen_elevator[16];
static void elevator_setup_default(void) static void elevator_setup_default(void)
{ {
struct elevator_type *e;
/* /*
* check if default is set and exists * check if default is set and exists
*/ */
if (chosen_elevator[0] && elevator_find(chosen_elevator)) if (chosen_elevator[0] && (e = elevator_get(chosen_elevator))) {
elevator_put(e);
return; return;
}
#if defined(CONFIG_IOSCHED_AS) #if defined(CONFIG_IOSCHED_AS)
strcpy(chosen_elevator, "anticipatory"); strcpy(chosen_elevator, "anticipatory");
...@@ -555,10 +560,9 @@ void elv_unregister_queue(struct request_queue *q) ...@@ -555,10 +560,9 @@ void elv_unregister_queue(struct request_queue *q)
int elv_register(struct elevator_type *e) int elv_register(struct elevator_type *e)
{ {
spin_lock_irq(&elv_list_lock);
if (elevator_find(e->elevator_name)) if (elevator_find(e->elevator_name))
BUG(); BUG();
spin_lock_irq(&elv_list_lock);
list_add_tail(&e->list, &elv_list); list_add_tail(&e->list, &elv_list);
spin_unlock_irq(&elv_list_lock); spin_unlock_irq(&elv_list_lock);
......
...@@ -2433,13 +2433,15 @@ void disk_round_stats(struct gendisk *disk) ...@@ -2433,13 +2433,15 @@ void disk_round_stats(struct gendisk *disk)
{ {
unsigned long now = jiffies; unsigned long now = jiffies;
__disk_stat_add(disk, time_in_queue, if (now == disk->stamp)
disk->in_flight * (now - disk->stamp)); return;
disk->stamp = now;
if (disk->in_flight) if (disk->in_flight) {
__disk_stat_add(disk, io_ticks, (now - disk->stamp_idle)); __disk_stat_add(disk, time_in_queue,
disk->stamp_idle = now; disk->in_flight * (now - disk->stamp));
__disk_stat_add(disk, io_ticks, (now - disk->stamp));
}
disk->stamp = now;
} }
/* /*
......
...@@ -430,7 +430,7 @@ void del_gendisk(struct gendisk *disk) ...@@ -430,7 +430,7 @@ void del_gendisk(struct gendisk *disk)
disk->flags &= ~GENHD_FL_UP; disk->flags &= ~GENHD_FL_UP;
unlink_gendisk(disk); unlink_gendisk(disk);
disk_stat_set_all(disk, 0); disk_stat_set_all(disk, 0);
disk->stamp = disk->stamp_idle = 0; disk->stamp = 0;
devfs_remove_disk(disk); devfs_remove_disk(disk);
......
...@@ -119,7 +119,7 @@ struct gendisk { ...@@ -119,7 +119,7 @@ struct gendisk {
int policy; int policy;
atomic_t sync_io; /* RAID */ atomic_t sync_io; /* RAID */
unsigned long stamp, stamp_idle; unsigned long stamp;
int in_flight; int in_flight;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
struct disk_stats *dkstats; struct disk_stats *dkstats;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment