lkml.org 
[lkml]   [2018]   [Nov]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.9 03/48] ataflop: fix error handling during setup
    Date
    From: Omar Sandoval <osandov@fb.com>

    [ Upstream commit 71327f547ee3a46ec5c39fdbbd268401b2578d0e ]

    Move queue allocation next to disk allocation to fix a couple of issues:

    - If add_disk() hasn't been called, we should clear disk->queue before
    calling put_disk().
    - If we fail to allocate a request queue, we still need to put all of
    the disks, not just the ones that we allocated queues for.

    Signed-off-by: Omar Sandoval <osandov@fb.com>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/block/ataflop.c | 25 +++++++++++++++----------
    1 file changed, 15 insertions(+), 10 deletions(-)

    diff --git a/drivers/block/ataflop.c b/drivers/block/ataflop.c
    index 2104b1b4ccda..9ab759bcebd5 100644
    --- a/drivers/block/ataflop.c
    +++ b/drivers/block/ataflop.c
    @@ -1933,6 +1933,11 @@ static int __init atari_floppy_init (void)
    unit[i].disk = alloc_disk(1);
    if (!unit[i].disk)
    goto Enomem;
    +
    + unit[i].disk->queue = blk_init_queue(do_fd_request,
    + &ataflop_lock);
    + if (!unit[i].disk->queue)
    + goto Enomem;
    }

    if (UseTrackbuffer < 0)
    @@ -1964,10 +1969,6 @@ static int __init atari_floppy_init (void)
    sprintf(unit[i].disk->disk_name, "fd%d", i);
    unit[i].disk->fops = &floppy_fops;
    unit[i].disk->private_data = &unit[i];
    - unit[i].disk->queue = blk_init_queue(do_fd_request,
    - &ataflop_lock);
    - if (!unit[i].disk->queue)
    - goto Enomem;
    set_capacity(unit[i].disk, MAX_DISK_SIZE * 2);
    add_disk(unit[i].disk);
    }
    @@ -1982,13 +1983,17 @@ static int __init atari_floppy_init (void)

    return 0;
    Enomem:
    - while (i--) {
    - struct request_queue *q = unit[i].disk->queue;
    + do {
    + struct gendisk *disk = unit[i].disk;

    - put_disk(unit[i].disk);
    - if (q)
    - blk_cleanup_queue(q);
    - }
    + if (disk) {
    + if (disk->queue) {
    + blk_cleanup_queue(disk->queue);
    + disk->queue = NULL;
    + }
    + put_disk(unit[i].disk);
    + }
    + } while (i--);

    unregister_blkdev(FLOPPY_MAJOR, "fd");
    return -ENOMEM;
    --
    2.17.1
    \
     
     \ /
      Last update: 2018-11-01 00:22    [W:4.165 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site