Loading
+35 −7
Original line number Diff line number Diff line
@@ -1553,7 +1553,13 @@ int nvme_set_queue_count(struct nvme_ctrl *ctrl, int *count)

	status = nvme_set_features(ctrl, NVME_FEAT_NUM_QUEUES, q_count, NULL, 0,
			&result);
	if (status < 0)

	/*
	 * It's either a kernel error or the host observed a connection
	 * lost. In either case it's not possible communicate with the
	 * controller and thus enter the error code path.
	 */
	if (status < 0 || status == NVME_SC_HOST_PATH_ERROR)
		return status;

	/*
@@ -2853,7 +2859,7 @@ int nvme_get_log(struct nvme_ctrl *ctrl, u32 nsid, u8 log_page, u8 lsp, u8 csi,
static int nvme_get_effects_log(struct nvme_ctrl *ctrl, u8 csi,
				struct nvme_effects_log **log)
{
	struct nvme_effects_log	*cel = xa_load(&ctrl->cels, csi);
	struct nvme_effects_log *old, *cel = xa_load(&ctrl->cels, csi);
	int ret;

	if (cel)
@@ -2870,7 +2876,11 @@ static int nvme_get_effects_log(struct nvme_ctrl *ctrl, u8 csi,
		return ret;
	}

	xa_store(&ctrl->cels, csi, cel, GFP_KERNEL);
	old = xa_store(&ctrl->cels, csi, cel, GFP_KERNEL);
	if (xa_is_err(old)) {
		kfree(cel);
		return xa_err(old);
	}
out:
	*log = cel;
	return 0;
@@ -2941,6 +2951,25 @@ static int nvme_init_non_mdts_limits(struct nvme_ctrl *ctrl)
	return ret;
}

static int nvme_init_effects_log(struct nvme_ctrl *ctrl,
		u8 csi, struct nvme_effects_log **log)
{
	struct nvme_effects_log *effects, *old;

	effects = kzalloc(sizeof(*effects), GFP_KERNEL);
	if (!effects)
		return -ENOMEM;

	old = xa_store(&ctrl->cels, csi, effects, GFP_KERNEL);
	if (xa_is_err(old)) {
		kfree(effects);
		return xa_err(old);
	}

	*log = effects;
	return 0;
}

static void nvme_init_known_nvm_effects(struct nvme_ctrl *ctrl)
{
	struct nvme_effects_log	*log = ctrl->effects;
@@ -2987,10 +3016,9 @@ static int nvme_init_effects(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
	}

	if (!ctrl->effects) {
		ctrl->effects = kzalloc(sizeof(*ctrl->effects), GFP_KERNEL);
		if (!ctrl->effects)
			return -ENOMEM;
		xa_store(&ctrl->cels, NVME_CSI_NVM, ctrl->effects, GFP_KERNEL);
		ret = nvme_init_effects_log(ctrl, NVME_CSI_NVM, &ctrl->effects);
		if (ret < 0)
			return ret;
	}

	nvme_init_known_nvm_effects(ctrl);