Commit da574235 authored by Pawel Baldysiak's avatar Pawel Baldysiak Committed by Tomasz Zawadzki
Browse files

nvmf_tgt: Add passtrhu support for cmds_and_effects log page



Handling of this log page requries fixup.
If sent passthru - end result should contain
cmds that are supported by SPDK + cmds that are
handled by custom handler.

Change-Id: I408d0272a3825e1a6f6e3a0a7a6925ca88e59b6a
Signed-off-by: default avatarPawel Baldysiak <pawel.baldysiak@dell.com>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/26457


Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
parent 815bf097
Loading
Loading
Loading
Loading
+37 −1
Original line number Diff line number Diff line
@@ -383,6 +383,41 @@ get_log_page_offset_and_len(struct spdk_nvmf_request *req, size_t page_size, uin
	*copy_len = spdk_min(page_size - *offset, len);
}

static void
fixup_get_cmds_and_effects_log_page(struct spdk_nvmf_request *req)
{
	struct spdk_nvme_cmds_and_effect_log_page nvme_log_data = {};
	struct spdk_nvme_cmds_and_effect_log_page nvmf_log_data = {};
	struct spdk_nvmf_ctrlr *ctrlr = spdk_nvmf_request_get_ctrlr(req);
	uint32_t page_size = sizeof(struct spdk_nvme_cmds_and_effect_log_page);
	uint64_t offset;
	size_t datalen, copy_len = 0;

	get_log_page_offset_and_len(req, page_size, &offset, &copy_len);

	if (copy_len == 0) {
		return;
	}

	/* This is cmds_and_effects log page from the NVMe drive */
	datalen = spdk_nvmf_request_copy_to_buf(req, (uint8_t *) &nvme_log_data + offset,
						copy_len);

	/* Those are cmds_and_effects log page from SPDK */
	spdk_nvmf_get_cmds_and_effects_log_page(ctrlr, &nvmf_log_data);

	/* if vendor specific commands are supported, mark it as supported in result stuct */
	if (g_spdk_nvmf_tgt_conf.admin_passthru.vendor_specific) {
		int i;
		for (i = SPDK_NVME_OPC_VENDOR_SPECIFIC_START; i <= SPDK_NVME_MAX_OPC; i++) {
			nvmf_log_data.admin_cmds_supported[i] = nvme_log_data.admin_cmds_supported[i];
		}
	}

	/* Copy the fixed SPDK struct to the request */
	spdk_nvmf_request_copy_from_buf(req, (uint8_t *) &nvmf_log_data + offset, datalen);
}

static void
fixup_get_supported_log_pages(struct spdk_nvmf_request *req)
{
@@ -529,8 +564,9 @@ nvmf_custom_get_log_page_hdlr(struct spdk_nvmf_request *req)
	case SPDK_NVME_LOG_CHANGED_NS_LIST:
	/* SPDK is not supporting get/set_feature passthru, so disable log page with drive supported features */
	case SPDK_NVME_LOG_FEATURE_IDS_EFFECTS:
	case SPDK_NVME_LOG_COMMAND_EFFECTS_LOG:
		return -1;
	case SPDK_NVME_LOG_COMMAND_EFFECTS_LOG:
		return nvmf_admin_passthru_generic_hdlr(req, fixup_get_cmds_and_effects_log_page);
	case SPDK_NVME_LOG_SUPPORTED_LOG_PAGES:
		return nvmf_admin_passthru_generic_hdlr(req, fixup_get_supported_log_pages);
	default: