Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+15 −10
Original line number Diff line number Diff line
@@ -2014,6 +2014,11 @@ static int __init atari_floppy_init (void)
		unit[i].disk = alloc_disk(1);
		if (!unit[i].disk)
			goto Enomem;

		unit[i].disk->queue = blk_init_queue(do_fd_request,
						     &ataflop_lock);
		if (!unit[i].disk->queue)
			goto Enomem;
	}

	if (UseTrackbuffer < 0)
@@ -2045,10 +2050,6 @@ static int __init atari_floppy_init (void)
		sprintf(unit[i].disk->disk_name, "fd%d", i);
		unit[i].disk->fops = &floppy_fops;
		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);
		add_disk(unit[i].disk);
	}
@@ -2063,13 +2064,17 @@ static int __init atari_floppy_init (void)

	return 0;
Enomem:
	while (i--) {
		struct request_queue *q = unit[i].disk->queue;
	do {
		struct gendisk *disk = unit[i].disk;

		if (disk) {
			if (disk->queue) {
				blk_cleanup_queue(disk->queue);
				disk->queue = NULL;
			}
			put_disk(unit[i].disk);
		if (q)
			blk_cleanup_queue(q);
		}
	} while (i--);

	unregister_blkdev(FLOPPY_MAJOR, "fd");
	return -ENOMEM;