Commit 71327f54 authored by Omar Sandoval's avatar Omar Sandoval Committed by Jens Axboe

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: default avatarOmar Sandoval <osandov@fb.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 3e6b8c3c
...@@ -2014,6 +2014,11 @@ static int __init atari_floppy_init (void) ...@@ -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) ...@@ -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) ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment