ataflop: fix error handling during setup
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>
This commit is contained in:
committed by
Jens Axboe
parent
3e6b8c3c4b
commit
71327f547e
@ -2014,6 +2014,11 @@ static int __init atari_floppy_init (void)
|
|||||||
unit[i].disk = alloc_disk(1);
|
unit[i].disk = alloc_disk(1);
|
||||||
if (!unit[i].disk)
|
if (!unit[i].disk)
|
||||||
goto Enomem;
|
goto Enomem;
|
||||||
|
|
||||||
|
unit[i].disk->queue = blk_init_queue(do_fd_request,
|
||||||
|
&ataflop_lock);
|
||||||
|
if (!unit[i].disk->queue)
|
||||||
|
goto Enomem;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UseTrackbuffer < 0)
|
if (UseTrackbuffer < 0)
|
||||||
@ -2045,10 +2050,6 @@ static int __init atari_floppy_init (void)
|
|||||||
sprintf(unit[i].disk->disk_name, "fd%d", i);
|
sprintf(unit[i].disk->disk_name, "fd%d", i);
|
||||||
unit[i].disk->fops = &floppy_fops;
|
unit[i].disk->fops = &floppy_fops;
|
||||||
unit[i].disk->private_data = &unit[i];
|
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);
|
set_capacity(unit[i].disk, MAX_DISK_SIZE * 2);
|
||||||
add_disk(unit[i].disk);
|
add_disk(unit[i].disk);
|
||||||
}
|
}
|
||||||
@ -2063,13 +2064,17 @@ static int __init atari_floppy_init (void)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
Enomem:
|
Enomem:
|
||||||
while (i--) {
|
do {
|
||||||
struct request_queue *q = unit[i].disk->queue;
|
struct gendisk *disk = unit[i].disk;
|
||||||
|
|
||||||
put_disk(unit[i].disk);
|
if (disk) {
|
||||||
if (q)
|
if (disk->queue) {
|
||||||
blk_cleanup_queue(q);
|
blk_cleanup_queue(disk->queue);
|
||||||
}
|
disk->queue = NULL;
|
||||||
|
}
|
||||||
|
put_disk(unit[i].disk);
|
||||||
|
}
|
||||||
|
} while (i--);
|
||||||
|
|
||||||
unregister_blkdev(FLOPPY_MAJOR, "fd");
|
unregister_blkdev(FLOPPY_MAJOR, "fd");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
Reference in New Issue
Block a user