Commit 427fd1d7 authored by Xiaodong Liu's avatar Xiaodong Liu Committed by Changpeng Liu
Browse files

bdev/raid: extract reset failure code



Break out the failure handling code to a separate
function.

Change-Id: Ic530bb4d33c19edb62360e06afe3946b963445b1
Signed-off-by: default avatarXiaodong Liu <xiaodong.liu@intel.com>
Reviewed-on: https://review.gerrithub.io/c/446008


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarwuzhouhui <wuzhouhui@kingsoft.com>
parent 4b92ffb3
Loading
Loading
Loading
Loading
+39 −10
Original line number Diff line number Diff line
@@ -494,6 +494,43 @@ raid_bdev_base_io_completion(struct spdk_bdev_io *bdev_io, bool success, void *c
	}
}

/*
 * brief:
 * raid_bdev_base_io_submit_fail_process processes IO requests for member disk
 * which failed to submit
 * params:
 * raid_bdev_io - pointer to raid bdev_io
 * pd_idx - base_dev index in raid_bdev
 * cb_fn - callback when the spdk_bdev_io for base_bdev becomes available
 * ret - return code
 * returns:
 * none
 */
static void
raid_bdev_base_io_submit_fail_process(struct spdk_bdev_io *raid_bdev_io, uint8_t pd_idx,
				      spdk_bdev_io_wait_cb cb_fn, int ret)
{
	struct raid_bdev_io *raid_io = (struct raid_bdev_io *)raid_bdev_io->driver_ctx;
	struct raid_bdev_io_channel *raid_ch = spdk_io_channel_get_ctx(raid_io->ch);
	struct raid_bdev *raid_bdev = (struct raid_bdev *)raid_bdev_io->bdev->ctxt;

	assert(ret != 0);

	if (ret == -ENOMEM) {
		raid_io->waitq_entry.bdev = raid_bdev->base_bdev_info[pd_idx].bdev;
		raid_io->waitq_entry.cb_fn = cb_fn;
		raid_io->waitq_entry.cb_arg = raid_bdev_io;
		spdk_bdev_queue_io_wait(raid_bdev->base_bdev_info[pd_idx].bdev,
					raid_ch->base_channel[pd_idx],
					&raid_io->waitq_entry);
		return;
	}

	SPDK_ERRLOG("bdev io submit error not due to ENOMEM, it should not happen\n");
	assert(false);
	spdk_bdev_io_complete(raid_bdev_io, SPDK_BDEV_IO_STATUS_FAILED);
}

/*
 * brief:
 * _raid_bdev_submit_reset_request_next function submits the next batch of reset requests
@@ -525,17 +562,9 @@ _raid_bdev_submit_reset_request_next(void *_bdev_io)
				      raid_bdev_base_io_completion, bdev_io);
		if (ret == 0) {
			raid_io->base_bdev_io_submitted++;
		} else if (ret == -ENOMEM) {
			raid_io->waitq_entry.bdev = raid_bdev->base_bdev_info[i].bdev;
			raid_io->waitq_entry.cb_fn = _raid_bdev_submit_reset_request_next;
			raid_io->waitq_entry.cb_arg = bdev_io;
			spdk_bdev_queue_io_wait(raid_bdev->base_bdev_info[i].bdev,
						raid_ch->base_channel[i],
						&raid_io->waitq_entry);
			return;
		} else {
			assert(false);
			spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED);
			raid_bdev_base_io_submit_fail_process(bdev_io, i,
							      _raid_bdev_submit_reset_request_next, ret);
			return;
		}
	}