From f93770c25d8c9d8da82436a4afa177c25a90e1c1 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Thu, 3 Oct 2019 10:53:50 +0900 Subject: [PATCH] lib/iscsi: Separate allocating data buffer and reading PDU payload When we introduce state machine, allocating data buffer and reading PDU payload will be done in the different state. Hence separate them into the different code block. Signed-off-by: Shuhei Matsumoto Change-Id: Ic54a31d7da9dbc46f558ad0f0ad26bf8b99a3ea7 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/470101 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Jim Harris Reviewed-by: Paul Luse Reviewed-by: Changpeng Liu --- lib/iscsi/iscsi.c | 48 +++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/lib/iscsi/iscsi.c b/lib/iscsi/iscsi.c index b3cf2e8b1..512e156d3 100644 --- a/lib/iscsi/iscsi.c +++ b/lib/iscsi/iscsi.c @@ -4684,32 +4684,32 @@ spdk_iscsi_read_pdu(struct spdk_iscsi_conn *conn, struct spdk_iscsi_pdu **_pdu) data_len = ISCSI_ALIGN(DGET24(pdu->bhs.data_segment_len)); + if (data_len != 0 && pdu->data_buf == NULL) { + if (data_len <= spdk_get_max_immediate_data_size()) { + pool = g_spdk_iscsi.pdu_immediate_data_pool; + pdu->data_buf_len = SPDK_BDEV_BUF_SIZE_WITH_MD(spdk_get_max_immediate_data_size()); + } else if (data_len <= SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH) { + pool = g_spdk_iscsi.pdu_data_out_pool; + pdu->data_buf_len = SPDK_BDEV_BUF_SIZE_WITH_MD(SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH); + } else { + SPDK_ERRLOG("Data(%d) > MaxSegment(%d)\n", + data_len, SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH); + rc = SPDK_ISCSI_CONNECTION_FATAL; + goto error; + } + pdu->mobj = spdk_mempool_get(pool); + if (pdu->mobj == NULL) { + return 0; + } + pdu->data_buf = pdu->mobj->buf; + + if (spdk_unlikely(spdk_iscsi_get_dif_ctx(conn, pdu, &pdu->dif_ctx))) { + pdu->dif_insert_or_strip = true; + } + } + /* copy the actual data into local buffer */ if (pdu->data_valid_bytes < data_len) { - if (pdu->data_buf == NULL) { - if (data_len <= spdk_get_max_immediate_data_size()) { - pool = g_spdk_iscsi.pdu_immediate_data_pool; - pdu->data_buf_len = SPDK_BDEV_BUF_SIZE_WITH_MD(spdk_get_max_immediate_data_size()); - } else if (data_len <= SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH) { - pool = g_spdk_iscsi.pdu_data_out_pool; - pdu->data_buf_len = SPDK_BDEV_BUF_SIZE_WITH_MD(SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH); - } else { - SPDK_ERRLOG("Data(%d) > MaxSegment(%d)\n", - data_len, SPDK_ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH); - rc = SPDK_ISCSI_CONNECTION_FATAL; - goto error; - } - pdu->mobj = spdk_mempool_get(pool); - if (pdu->mobj == NULL) { - return 0; - } - pdu->data_buf = pdu->mobj->buf; - - if (spdk_unlikely(spdk_iscsi_get_dif_ctx(conn, pdu, &pdu->dif_ctx))) { - pdu->dif_insert_or_strip = true; - } - } - rc = iscsi_conn_read_data_segment(conn, pdu, data_len); if (rc < 0) { goto error;