lkml.org 
[lkml]   [2019]   [Nov]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 062/306] amiflop: clean up on errors during setup
    Date
    From: Omar Sandoval <osandov@fb.com>

    [ Upstream commit 53d0f8dbde89cf6c862c7a62e00c6123e02cba41 ]

    The error handling in fd_probe_drives() doesn't clean up at all. Fix it
    up in preparation for converting to blk-mq. While we're here, get rid of
    the commented out amiga_floppy_remove().

    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/amiflop.c | 84 ++++++++++++++++++++---------------------
    1 file changed, 40 insertions(+), 44 deletions(-)

    diff --git a/drivers/block/amiflop.c b/drivers/block/amiflop.c
    index 3aaf6af3ec23d..2158e130744e0 100644
    --- a/drivers/block/amiflop.c
    +++ b/drivers/block/amiflop.c
    @@ -1701,11 +1701,41 @@ static const struct block_device_operations floppy_fops = {
    .check_events = amiga_check_events,
    };

    +static struct gendisk *fd_alloc_disk(int drive)
    +{
    + struct gendisk *disk;
    +
    + disk = alloc_disk(1);
    + if (!disk)
    + goto out;
    +
    + disk->queue = blk_init_queue(do_fd_request, &amiflop_lock);
    + if (IS_ERR(disk->queue)) {
    + disk->queue = NULL;
    + goto out_put_disk;
    + }
    +
    + unit[drive].trackbuf = kmalloc(FLOPPY_MAX_SECTORS * 512, GFP_KERNEL);
    + if (!unit[drive].trackbuf)
    + goto out_cleanup_queue;
    +
    + return disk;
    +
    +out_cleanup_queue:
    + blk_cleanup_queue(disk->queue);
    + disk->queue = NULL;
    +out_put_disk:
    + put_disk(disk);
    +out:
    + unit[drive].type->code = FD_NODRIVE;
    + return NULL;
    +}
    +
    static int __init fd_probe_drives(void)
    {
    int drive,drives,nomem;

    - printk(KERN_INFO "FD: probing units\nfound ");
    + pr_info("FD: probing units\nfound");
    drives=0;
    nomem=0;
    for(drive=0;drive<FD_MAX_UNITS;drive++) {
    @@ -1713,27 +1743,17 @@ static int __init fd_probe_drives(void)
    fd_probe(drive);
    if (unit[drive].type->code == FD_NODRIVE)
    continue;
    - disk = alloc_disk(1);
    +
    + disk = fd_alloc_disk(drive);
    if (!disk) {
    - unit[drive].type->code = FD_NODRIVE;
    + pr_cont(" no mem for fd%d", drive);
    + nomem = 1;
    continue;
    }
    unit[drive].gendisk = disk;
    -
    - disk->queue = blk_init_queue(do_fd_request, &amiflop_lock);
    - if (!disk->queue) {
    - unit[drive].type->code = FD_NODRIVE;
    - continue;
    - }
    -
    drives++;
    - if ((unit[drive].trackbuf = kmalloc(FLOPPY_MAX_SECTORS * 512, GFP_KERNEL)) == NULL) {
    - printk("no mem for ");
    - unit[drive].type = &drive_types[num_dr_types - 1]; /* FD_NODRIVE */
    - drives--;
    - nomem = 1;
    - }
    - printk("fd%d ",drive);
    +
    + pr_cont(" fd%d",drive);
    disk->major = FLOPPY_MAJOR;
    disk->first_minor = drive;
    disk->fops = &floppy_fops;
    @@ -1744,11 +1764,11 @@ static int __init fd_probe_drives(void)
    }
    if ((drives > 0) || (nomem == 0)) {
    if (drives == 0)
    - printk("no drives");
    - printk("\n");
    + pr_cont(" no drives");
    + pr_cont("\n");
    return drives;
    }
    - printk("\n");
    + pr_cont("\n");
    return -ENOMEM;
    }

    @@ -1831,30 +1851,6 @@ static int __init amiga_floppy_probe(struct platform_device *pdev)
    return ret;
    }

    -#if 0 /* not safe to unload */
    -static int __exit amiga_floppy_remove(struct platform_device *pdev)
    -{
    - int i;
    -
    - for( i = 0; i < FD_MAX_UNITS; i++) {
    - if (unit[i].type->code != FD_NODRIVE) {
    - struct request_queue *q = unit[i].gendisk->queue;
    - del_gendisk(unit[i].gendisk);
    - put_disk(unit[i].gendisk);
    - kfree(unit[i].trackbuf);
    - if (q)
    - blk_cleanup_queue(q);
    - }
    - }
    - blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
    - free_irq(IRQ_AMIGA_CIAA_TB, NULL);
    - free_irq(IRQ_AMIGA_DSKBLK, NULL);
    - custom.dmacon = DMAF_DISK; /* disable DMA */
    - amiga_chip_free(raw_buf);
    - unregister_blkdev(FLOPPY_MAJOR, "fd");
    -}
    -#endif
    -
    static struct platform_driver amiga_floppy_driver = {
    .driver = {
    .name = "amiga-floppy",
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-11-27 22:29    [W:4.066 / U:0.260 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site