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

Commit 59cf70e2 authored by Asai Thambi SP's avatar Asai Thambi SP Committed by Jens Axboe
Browse files

mtip32xx: Fix for rmmod crash when drive is in FTL rebuild



When FTL rebuild is in progress, alloc_disk() initializes the disk
but device node will be created by add_disk() only after successful
completion of FTL rebuild. So, skip deletion of device node in
removal path when FTL rebuild is in progress.

Signed-off-by: default avatarSelvan Mani <smani@micron.com>
Signed-off-by: default avatarAsai Thambi S P <asamymuthupa@micron.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent d8a18d2d
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -2968,9 +2968,7 @@ static int mtip_service_thread(void *data)
		}

		if (test_bit(MTIP_PF_REBUILD_BIT, &port->flags)) {
			if (mtip_ftl_rebuild_poll(dd) < 0)
				set_bit(MTIP_DDF_REBUILD_FAILED_BIT,
							&dd->dd_flag);
			if (mtip_ftl_rebuild_poll(dd) == 0)
				clear_bit(MTIP_PF_REBUILD_BIT, &port->flags);
		}
	}
@@ -3851,7 +3849,6 @@ static int mtip_block_initialize(struct driver_data *dd)

	mtip_hw_debugfs_init(dd);

skip_create_disk:
	memset(&dd->tags, 0, sizeof(dd->tags));
	dd->tags.ops = &mtip_mq_ops;
	dd->tags.nr_hw_queues = 1;
@@ -3881,6 +3878,7 @@ static int mtip_block_initialize(struct driver_data *dd)
	dd->disk->queue		= dd->queue;
	dd->queue->queuedata	= dd;

skip_create_disk:
	/* Initialize the protocol layer. */
	wait_for_rebuild = mtip_hw_get_identify(dd);
	if (wait_for_rebuild < 0) {
@@ -4041,6 +4039,7 @@ static int mtip_block_remove(struct driver_data *dd)
		dd->bdev = NULL;
	}
	if (dd->disk) {
		if (test_bit(MTIP_DDF_INIT_DONE_BIT, &dd->dd_flag))
			del_gendisk(dd->disk);
		if (dd->disk->queue) {
			blk_cleanup_queue(dd->queue);
@@ -4082,6 +4081,7 @@ static int mtip_block_shutdown(struct driver_data *dd)
		dev_info(&dd->pdev->dev,
			"Shutting down %s ...\n", dd->disk->disk_name);

		if (test_bit(MTIP_DDF_INIT_DONE_BIT, &dd->dd_flag))
			del_gendisk(dd->disk);
		if (dd->disk->queue) {
			blk_cleanup_queue(dd->queue);