Commit b54e1f88 authored by Herton Ronaldo Krzesinski's avatar Herton Ronaldo Krzesinski Committed by Jens Axboe

floppy: don't call alloc_ordered_workqueue inside the alloc_disk loop

Since commit 070ad7e7 ("floppy: convert to delayed work and single-thread
wq"), we end up calling alloc_ordered_workqueue multiple times inside
the loop, which shouldn't be intended. Besides the leak, other side
effect in the current code is if blk_init_queue fails, we would end up
calling unregister_blkdev even if we didn't call yet register_blkdev.

Just moved the allocation of floppy_wq before the loop, and adjusted the
code accordingly.

Cc: stable@vger.kernel.org # 3.5+
Acked-by: default avatarVivek Goyal <vgoyal@redhat.com>
Reviewed-by: default avatarBen Hutchings <ben@decadent.org.uk>
Signed-off-by: default avatarHerton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 2911758f
...@@ -4137,6 +4137,10 @@ static int __init do_floppy_init(void) ...@@ -4137,6 +4137,10 @@ static int __init do_floppy_init(void)
raw_cmd = NULL; raw_cmd = NULL;
floppy_wq = alloc_ordered_workqueue("floppy", 0);
if (!floppy_wq)
return -ENOMEM;
for (dr = 0; dr < N_DRIVE; dr++) { for (dr = 0; dr < N_DRIVE; dr++) {
disks[dr] = alloc_disk(1); disks[dr] = alloc_disk(1);
if (!disks[dr]) { if (!disks[dr]) {
...@@ -4144,16 +4148,10 @@ static int __init do_floppy_init(void) ...@@ -4144,16 +4148,10 @@ static int __init do_floppy_init(void)
goto out_put_disk; goto out_put_disk;
} }
floppy_wq = alloc_ordered_workqueue("floppy", 0);
if (!floppy_wq) {
err = -ENOMEM;
goto out_put_disk;
}
disks[dr]->queue = blk_init_queue(do_fd_request, &floppy_lock); disks[dr]->queue = blk_init_queue(do_fd_request, &floppy_lock);
if (!disks[dr]->queue) { if (!disks[dr]->queue) {
err = -ENOMEM; err = -ENOMEM;
goto out_destroy_workq; goto out_put_disk;
} }
blk_queue_max_hw_sectors(disks[dr]->queue, 64); blk_queue_max_hw_sectors(disks[dr]->queue, 64);
...@@ -4317,8 +4315,6 @@ static int __init do_floppy_init(void) ...@@ -4317,8 +4315,6 @@ static int __init do_floppy_init(void)
out_unreg_region: out_unreg_region:
blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256); blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
platform_driver_unregister(&floppy_driver); platform_driver_unregister(&floppy_driver);
out_destroy_workq:
destroy_workqueue(floppy_wq);
out_unreg_blkdev: out_unreg_blkdev:
unregister_blkdev(FLOPPY_MAJOR, "fd"); unregister_blkdev(FLOPPY_MAJOR, "fd");
out_put_disk: out_put_disk:
...@@ -4334,6 +4330,7 @@ static int __init do_floppy_init(void) ...@@ -4334,6 +4330,7 @@ static int __init do_floppy_init(void)
} }
put_disk(disks[dr]); put_disk(disks[dr]);
} }
destroy_workqueue(floppy_wq);
return err; return err;
} }
......
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