summaryrefslogtreecommitdiff
path: root/drivers/block/elevator.c
diff options
context:
space:
mode:
authorNate Diller <nate@namesys.com>2005-10-30 15:02:24 -0800
committerLinus Torvalds <torvalds@g5.osdl.org>2005-10-30 17:37:20 -0800
commit2ca7d93bb27876e5fd4ebfcb3b00627107bdad4d (patch)
treedb3dbc868db28f9983ce99911ee7795042fba502 /drivers/block/elevator.c
parent3fa63c7d82ab9a12a5d0a299069f8df9f35aa011 (diff)
downloadlwn-2ca7d93bb27876e5fd4ebfcb3b00627107bdad4d.tar.gz
lwn-2ca7d93bb27876e5fd4ebfcb3b00627107bdad4d.zip
[PATCH] block cleanups: Fix iosched module refcount leak
If the requested I/O scheduler is already in place, elevator_switch simply leaves the queue alone, and returns. However, it forgets to call elevator_put, so 'echo [current_sched] > /sys/block/[dev]/queue/scheduler' will leak a reference, causing the current_sched module to be permanently pinned in memory. Signed-off-by: Nate Diller <nate@namesys.com> Acked-by: Jens Axboe <axboe@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/block/elevator.c')
-rw-r--r--drivers/block/elevator.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/block/elevator.c b/drivers/block/elevator.c
index 3b652eba2d20..36f1057084b0 100644
--- a/drivers/block/elevator.c
+++ b/drivers/block/elevator.c
@@ -753,8 +753,10 @@ ssize_t elv_iosched_store(request_queue_t *q, const char *name, size_t count)
return -EINVAL;
}
- if (!strcmp(elevator_name, q->elevator->elevator_type->elevator_name))
+ if (!strcmp(elevator_name, q->elevator->elevator_type->elevator_name)) {
+ elevator_put(e);
return count;
+ }
elevator_switch(q, e);
return count;