lkml.org 
[lkml]   [2012]   [Aug]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH v3 1/6] floppy: don't call alloc_ordered_workqueue inside the alloc_disk loop
    From
    Date
    On Mon, 2012-08-13 at 15:16 -0300, Herton Ronaldo Krzesinski wrote:
    > Since commit 070ad7e ("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: Vivek Goyal <vgoyal@redhat.com>
    > Signed-off-by: Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>

    Reviewed-by: Ben Hutchings <ben@decadent.org.uk>

    > ---
    > drivers/block/floppy.c | 15 ++++++---------
    > 1 file changed, 6 insertions(+), 9 deletions(-)
    >
    > diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
    > index a7d6347..c8d9e68 100644
    > --- a/drivers/block/floppy.c
    > +++ b/drivers/block/floppy.c
    > @@ -4138,6 +4138,10 @@ static int __init do_floppy_init(void)
    >
    > raw_cmd = NULL;
    >
    > + floppy_wq = alloc_ordered_workqueue("floppy", 0);
    > + if (!floppy_wq)
    > + return -ENOMEM;
    > +
    > for (dr = 0; dr < N_DRIVE; dr++) {
    > disks[dr] = alloc_disk(1);
    > if (!disks[dr]) {
    > @@ -4145,16 +4149,10 @@ static int __init do_floppy_init(void)
    > 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);
    > if (!disks[dr]->queue) {
    > err = -ENOMEM;
    > - goto out_destroy_workq;
    > + goto out_put_disk;
    > }
    >
    > blk_queue_max_hw_sectors(disks[dr]->queue, 64);
    > @@ -4318,8 +4316,6 @@ out_release_dma:
    > out_unreg_region:
    > blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
    > platform_driver_unregister(&floppy_driver);
    > -out_destroy_workq:
    > - destroy_workqueue(floppy_wq);
    > out_unreg_blkdev:
    > unregister_blkdev(FLOPPY_MAJOR, "fd");
    > out_put_disk:
    > @@ -4335,6 +4331,7 @@ out_put_disk:
    > }
    > put_disk(disks[dr]);
    > }
    > + destroy_workqueue(floppy_wq);
    > return err;
    > }
    >

    --
    Ben Hutchings
    I say we take off; nuke the site from orbit. It's the only way to be sure.
    [unhandled content-type:application/pgp-signature]
    \
     
     \ /
      Last update: 2012-08-14 04:42    [from the cache]
    ©2003-2014 Jasper Spaans. hosted at Digital Ocean