Commit 53d0f8db authored by Omar Sandoval's avatar Omar Sandoval Committed by Jens Axboe
Browse files

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: default avatarOmar Sandoval <osandov@fb.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent c87228f1
Loading
Loading
Loading
Loading
+40 −44
Original line number Diff line number Diff line
@@ -1818,11 +1818,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++) {
@@ -1830,27 +1860,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;
@@ -1861,11 +1881,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;
}
 
@@ -1948,30 +1968,6 @@ out_blkdev:
	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",