Commit 56fe6fdf authored by John Levon's avatar John Levon Committed by Jim Harris
Browse files

lib/nvmf: relocate iov utility code



Move the IOV handling code in ctrlr.c to the top of the file, for
subsequent use.

Signed-off-by: default avatarJohn Levon <john.levon@nutanix.com>
Change-Id: Ibddde1cb964d8aaecf4673ffa6d4147d0a48020c
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16120


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: default avatarThanos Makatos <thanos.makatos@nutanix.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
parent b6f67477
Loading
Loading
Loading
Loading
+63 −63
Original line number Diff line number Diff line
@@ -51,6 +51,69 @@ static struct spdk_nvmf_custom_admin_cmd g_nvmf_custom_admin_cmd_hdlrs[SPDK_NVME

static void _nvmf_request_complete(void *ctx);

struct copy_iovs_ctx {
	struct iovec *iovs;
	int iovcnt;
	int cur_iov_idx;
	size_t cur_iov_offset;
};

static void
_clear_iovs(struct iovec *iovs, int iovcnt)
{
	int iov_idx = 0;
	struct iovec *iov;

	while (iov_idx < iovcnt) {
		iov = &iovs[iov_idx];
		memset(iov->iov_base, 0, iov->iov_len);
		iov_idx++;
	}
}

static void
_init_copy_iovs_ctx(struct copy_iovs_ctx *copy_ctx, struct iovec *iovs, int iovcnt)
{
	copy_ctx->iovs = iovs;
	copy_ctx->iovcnt = iovcnt;
	copy_ctx->cur_iov_idx = 0;
	copy_ctx->cur_iov_offset = 0;
}

static size_t
_copy_buf_to_iovs(struct copy_iovs_ctx *copy_ctx, const void *buf, size_t buf_len)
{
	size_t len, iov_remain_len, copied_len = 0;
	struct iovec *iov;

	if (buf_len == 0) {
		return 0;
	}

	while (copy_ctx->cur_iov_idx < copy_ctx->iovcnt) {
		iov = &copy_ctx->iovs[copy_ctx->cur_iov_idx];
		iov_remain_len = iov->iov_len - copy_ctx->cur_iov_offset;
		if (iov_remain_len == 0) {
			copy_ctx->cur_iov_idx++;
			copy_ctx->cur_iov_offset = 0;
			continue;
		}

		len = spdk_min(iov_remain_len, buf_len - copied_len);
		memcpy((char *)iov->iov_base + copy_ctx->cur_iov_offset,
		       (const char *)buf + copied_len,
		       len);
		copied_len += len;
		copy_ctx->cur_iov_offset += len;

		if (buf_len == copied_len) {
			return copied_len;
		}
	}

	return copied_len;
}

static inline void
nvmf_invalid_connect_response(struct spdk_nvmf_fabric_connect_rsp *rsp,
			      uint8_t iattr, uint16_t ipo)
@@ -2052,69 +2115,6 @@ nvmf_ctrlr_async_event_request(struct spdk_nvmf_request *req)
	return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS;
}

struct copy_iovs_ctx {
	struct iovec *iovs;
	int iovcnt;
	int cur_iov_idx;
	size_t cur_iov_offset;
};

static void
_clear_iovs(struct iovec *iovs, int iovcnt)
{
	int iov_idx = 0;
	struct iovec *iov;

	while (iov_idx < iovcnt) {
		iov = &iovs[iov_idx];
		memset(iov->iov_base, 0, iov->iov_len);
		iov_idx++;
	}
}

static void
_init_copy_iovs_ctx(struct copy_iovs_ctx *copy_ctx, struct iovec *iovs, int iovcnt)
{
	copy_ctx->iovs = iovs;
	copy_ctx->iovcnt = iovcnt;
	copy_ctx->cur_iov_idx = 0;
	copy_ctx->cur_iov_offset = 0;
}

static size_t
_copy_buf_to_iovs(struct copy_iovs_ctx *copy_ctx, const void *buf, size_t buf_len)
{
	size_t len, iov_remain_len, copied_len = 0;
	struct iovec *iov;

	if (buf_len == 0) {
		return 0;
	}

	while (copy_ctx->cur_iov_idx < copy_ctx->iovcnt) {
		iov = &copy_ctx->iovs[copy_ctx->cur_iov_idx];
		iov_remain_len = iov->iov_len - copy_ctx->cur_iov_offset;
		if (iov_remain_len == 0) {
			copy_ctx->cur_iov_idx++;
			copy_ctx->cur_iov_offset = 0;
			continue;
		}

		len = spdk_min(iov_remain_len, buf_len - copied_len);
		memcpy((char *)iov->iov_base + copy_ctx->cur_iov_offset,
		       (const char *)buf + copied_len,
		       len);
		copied_len += len;
		copy_ctx->cur_iov_offset += len;

		if (buf_len == copied_len) {
			return copied_len;
		}
	}

	return copied_len;
}

static void
nvmf_get_firmware_slot_log_page(struct iovec *iovs, int iovcnt, uint64_t offset, uint32_t length)
{