diff options
author | Edward Tomasz Napierala <trasz@FreeBSD.org> | 2013-10-09 12:03:04 +0000 |
---|---|---|
committer | Edward Tomasz Napierala <trasz@FreeBSD.org> | 2013-10-09 12:03:04 +0000 |
commit | 1008ac5eb7b01f2c2dd02c21a49c587e3615428d (patch) | |
tree | a3caab6e0ecc84ff09d8c357cc58191e7bfb5125 /sys/dev/iscsi/iscsi.c | |
parent | c11a15bf8d77625b462f4007508b8dee6cee22cb (diff) | |
download | src-1008ac5eb7b01f2c2dd02c21a49c587e3615428d.tar.gz src-1008ac5eb7b01f2c2dd02c21a49c587e3615428d.zip |
Notes
Diffstat (limited to 'sys/dev/iscsi/iscsi.c')
-rw-r--r-- | sys/dev/iscsi/iscsi.c | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/sys/dev/iscsi/iscsi.c b/sys/dev/iscsi/iscsi.c index 8bd22079cc6b..2d347f3d884a 100644 --- a/sys/dev/iscsi/iscsi.c +++ b/sys/dev/iscsi/iscsi.c @@ -726,10 +726,15 @@ iscsi_error_callback(struct icl_conn *ic) static void iscsi_pdu_handle_nop_in(struct icl_pdu *response) { + struct iscsi_session *is; struct iscsi_bhs_nop_out *bhsno; struct iscsi_bhs_nop_in *bhsni; struct icl_pdu *request; + void *data = NULL; + size_t datasize; + int error; + is = PDU_SESSION(response); bhsni = (struct iscsi_bhs_nop_in *)response->ip_bhs; if (bhsni->bhsni_target_transfer_tag == 0xffffffff) { @@ -741,22 +746,47 @@ iscsi_pdu_handle_nop_in(struct icl_pdu *response) return; } + datasize = icl_pdu_data_segment_length(response); + if (datasize > 0) { + data = malloc(datasize, M_ISCSI, M_NOWAIT | M_ZERO); + if (data == NULL) { + ISCSI_SESSION_WARN(is, "failed to allocate memory; " + "reconnecting"); + icl_pdu_free(response); + iscsi_session_reconnect(is); + return; + } + icl_pdu_get_data(response, 0, data, datasize); + } + request = icl_pdu_new_bhs(response->ip_conn, M_NOWAIT); if (request == NULL) { + ISCSI_SESSION_WARN(is, "failed to allocate memory; " + "reconnecting"); + free(data, M_ISCSI); icl_pdu_free(response); + iscsi_session_reconnect(is); return; } bhsno = (struct iscsi_bhs_nop_out *)request->ip_bhs; bhsno->bhsno_opcode = ISCSI_BHS_OPCODE_NOP_OUT | ISCSI_BHS_OPCODE_IMMEDIATE; bhsno->bhsno_flags = 0x80; - bhsno->bhsno_initiator_task_tag = 0xffffffff; /* XXX */ + bhsno->bhsno_initiator_task_tag = 0xffffffff; bhsno->bhsno_target_transfer_tag = bhsni->bhsni_target_transfer_tag; - - request->ip_data_len = response->ip_data_len; - request->ip_data_mbuf = response->ip_data_mbuf; - response->ip_data_len = 0; - response->ip_data_mbuf = NULL; + if (datasize > 0) { + error = icl_pdu_append_data(request, data, datasize, M_NOWAIT); + if (error != 0) { + ISCSI_SESSION_WARN(is, "failed to allocate memory; " + "reconnecting"); + free(data, M_ISCSI); + icl_pdu_free(request); + icl_pdu_free(response); + iscsi_session_reconnect(is); + return; + } + free(data, M_ISCSI); + } icl_pdu_free(response); iscsi_pdu_queue_locked(request); |