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:
Родитель
c87228f16f
Коммит
53d0f8dbde
|
@ -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",
|
||||||
|
|
Загрузка…
Ссылка в новой задаче