amiflop: clean up on errors during setup

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>
This commit is contained in:
Omar Sandoval 2018-10-11 12:20:46 -07:00 коммит произвёл Jens Axboe
Родитель c87228f16f
Коммит 53d0f8dbde
1 изменённых файлов: 40 добавлений и 44 удалений

Просмотреть файл

@ -1818,11 +1818,41 @@ static const struct block_device_operations floppy_fops = {
.check_events = amiga_check_events, .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) static int __init fd_probe_drives(void)
{ {
int drive,drives,nomem; int drive,drives,nomem;
printk(KERN_INFO "FD: probing units\nfound "); pr_info("FD: probing units\nfound");
drives=0; drives=0;
nomem=0; nomem=0;
for(drive=0;drive<FD_MAX_UNITS;drive++) { for(drive=0;drive<FD_MAX_UNITS;drive++) {
@ -1830,27 +1860,17 @@ static int __init fd_probe_drives(void)
fd_probe(drive); fd_probe(drive);
if (unit[drive].type->code == FD_NODRIVE) if (unit[drive].type->code == FD_NODRIVE)
continue; continue;
disk = alloc_disk(1);
disk = fd_alloc_disk(drive);
if (!disk) { if (!disk) {
unit[drive].type->code = FD_NODRIVE; pr_cont(" no mem for fd%d", drive);
nomem = 1;
continue; continue;
} }
unit[drive].gendisk = disk; 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++; drives++;
if ((unit[drive].trackbuf = kmalloc(FLOPPY_MAX_SECTORS * 512, GFP_KERNEL)) == NULL) {
printk("no mem for "); pr_cont(" fd%d",drive);
unit[drive].type = &drive_types[num_dr_types - 1]; /* FD_NODRIVE */
drives--;
nomem = 1;
}
printk("fd%d ",drive);
disk->major = FLOPPY_MAJOR; disk->major = FLOPPY_MAJOR;
disk->first_minor = drive; disk->first_minor = drive;
disk->fops = &floppy_fops; disk->fops = &floppy_fops;
@ -1861,11 +1881,11 @@ static int __init fd_probe_drives(void)
} }
if ((drives > 0) || (nomem == 0)) { if ((drives > 0) || (nomem == 0)) {
if (drives == 0) if (drives == 0)
printk("no drives"); pr_cont(" no drives");
printk("\n"); pr_cont("\n");
return drives; return drives;
} }
printk("\n"); pr_cont("\n");
return -ENOMEM; return -ENOMEM;
} }
@ -1948,30 +1968,6 @@ out_blkdev:
return ret; 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 = { static struct platform_driver amiga_floppy_driver = {
.driver = { .driver = {
.name = "amiga-floppy", .name = "amiga-floppy",