summaryrefslogtreecommitdiff
path: root/usr/io.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/io.c')
-rw-r--r--usr/io.c47
1 files changed, 25 insertions, 22 deletions
diff --git a/usr/io.c b/usr/io.c
index 8fb806d..24a09d6 100644
--- a/usr/io.c
+++ b/usr/io.c
@@ -503,7 +503,7 @@ iscsi_io_send_pdu(iscsi_conn_t *conn, struct iscsi_hdr *hdr,
/* set a timeout, since the socket calls may take a long time
* to timeout on their own
*/
- if (!ipc) {
+ if (!session->use_ipc) {
memset(&action, 0, sizeof (struct sigaction));
memset(&old, 0, sizeof (struct sigaction));
action.sa_sigaction = NULL;
@@ -566,7 +566,7 @@ iscsi_io_send_pdu(iscsi_conn_t *conn, struct iscsi_hdr *hdr,
else
pad_bytes = 0;
- if (ipc)
+ if (session->use_ipc)
ipc->send_pdu_begin(session->t->handle, session->id,
conn->id, end - header,
ntoh24(hdr->dlength) + pad_bytes);
@@ -575,8 +575,8 @@ iscsi_io_send_pdu(iscsi_conn_t *conn, struct iscsi_hdr *hdr,
vec[0].iov_base = header;
vec[0].iov_len = end - header;
- if (!ipc)
- rc = writev(session->ctrl_fd, vec, 1);
+ if (!session->use_ipc)
+ rc = writev(conn->socket_fd, vec, 1);
else
rc = ipc->writev(0, vec, 1);
if (timedout) {
@@ -603,13 +603,13 @@ iscsi_io_send_pdu(iscsi_conn_t *conn, struct iscsi_hdr *hdr,
vec[1].iov_base = (void *) &pad;
vec[1].iov_len = pad_bytes;
- if (!ipc)
- rc = writev(session->ctrl_fd, vec, 2);
+ if (!session->use_ipc)
+ rc = writev(conn->socket_fd, vec, 2);
else
rc = ipc->writev(0, vec, 2);
if (timedout) {
log_error("socket %d write timed out",
- conn->socket_fd);
+ conn->socket_fd);
ret = 0;
goto done;
} else if ((rc <= 0) && (errno != EAGAIN)) {
@@ -627,7 +627,7 @@ iscsi_io_send_pdu(iscsi_conn_t *conn, struct iscsi_hdr *hdr,
}
}
- if (ipc) {
+ if (session->use_ipc) {
if (ipc->send_pdu_end(session->t->handle, session->id,
conn->id, &rc)) {
ret = 0;
@@ -638,7 +638,7 @@ iscsi_io_send_pdu(iscsi_conn_t *conn, struct iscsi_hdr *hdr,
ret = 1;
done:
- if (!ipc) {
+ if (!session->use_ipc) {
alarm(0);
sigaction(SIGALRM, &old, NULL);
timedout = 0;
@@ -670,7 +670,7 @@ iscsi_io_recv_pdu(iscsi_conn_t *conn, struct iscsi_hdr *hdr,
/* set a timeout, since the socket calls may take a long
* time to timeout on their own
*/
- if (!ipc) {
+ if (!session->use_ipc) {
memset(&action, 0, sizeof (struct sigaction));
memset(&old, 0, sizeof (struct sigaction));
action.sa_sigaction = NULL;
@@ -680,7 +680,10 @@ iscsi_io_recv_pdu(iscsi_conn_t *conn, struct iscsi_hdr *hdr,
timedout = 0;
alarm(timeout);
} else {
- if (ipc->recv_pdu_begin(conn)) {
+ failed = ipc->recv_pdu_begin(conn);
+ if (failed == -EAGAIN)
+ return -EAGAIN;
+ else if (failed < 0) {
failed = 1;
goto done;
}
@@ -688,14 +691,14 @@ iscsi_io_recv_pdu(iscsi_conn_t *conn, struct iscsi_hdr *hdr,
/* read a response header */
do {
- if (!ipc)
- rlen = read(session->ctrl_fd, header,
+ if (!session->use_ipc)
+ rlen = read(conn->socket_fd, header,
sizeof (*hdr) - h_bytes);
else
rlen = ipc->read(header, sizeof (*hdr) - h_bytes);
if (timedout) {
log_error("socket %d header read timed out",
- conn->socket_fd);
+ conn->socket_fd);
failed = 1;
goto done;
} else if (rlen == 0) {
@@ -714,7 +717,7 @@ iscsi_io_recv_pdu(iscsi_conn_t *conn, struct iscsi_hdr *hdr,
} while (h_bytes < sizeof (*hdr));
log_debug(4, "read %d PDU header bytes, opcode 0x%x, dlength %u, "
- "data %p, max %u", h_bytes, hdr->opcode,
+ "data %p, max %u", h_bytes, hdr->opcode & ISCSI_OPCODE_MASK,
ntoh24(hdr->dlength), data, max_data_length);
/* check for additional headers */
@@ -745,14 +748,14 @@ iscsi_io_recv_pdu(iscsi_conn_t *conn, struct iscsi_hdr *hdr,
/* read the rest into our buffer */
d_bytes = 0;
while (d_bytes < dlength) {
- if (!ipc)
- rlen = read(session->ctrl_fd, data + d_bytes,
+ if (!session->use_ipc)
+ rlen = read(conn->socket_fd, data + d_bytes,
dlength - d_bytes);
else
rlen = ipc->read(data + d_bytes, dlength - d_bytes);
if (timedout) {
log_error("socket %d data read timed out",
- conn->socket_fd);
+ conn->socket_fd);
failed = 1;
goto done;
} else if (rlen == 0) {
@@ -772,7 +775,7 @@ iscsi_io_recv_pdu(iscsi_conn_t *conn, struct iscsi_hdr *hdr,
/* handle PDU data padding.
* data is padded in case of kernel_io */
pad = dlength % ISCSI_PAD_LEN;
- if (pad && !ipc) {
+ if (pad && !session->use_ipc) {
int pad_bytes = pad = ISCSI_PAD_LEN - pad;
char bytes[ISCSI_PAD_LEN];
@@ -780,7 +783,7 @@ iscsi_io_recv_pdu(iscsi_conn_t *conn, struct iscsi_hdr *hdr,
rlen = read(conn->socket_fd, &bytes, pad_bytes);
if (timedout) {
log_error("socket %d pad read timed out",
- conn->socket_fd);
+ conn->socket_fd);
failed = 1;
goto done;
} else if (rlen == 0) {
@@ -828,7 +831,7 @@ iscsi_io_recv_pdu(iscsi_conn_t *conn, struct iscsi_hdr *hdr,
}
done:
- if (!ipc) {
+ if (!session->use_ipc) {
alarm(0);
sigaction(SIGALRM, &old, NULL);
} else {
@@ -840,7 +843,7 @@ done:
if (timedout || failed) {
timedout = 0;
- return 0;
+ return -EIO;
}
return h_bytes + ahs_bytes + d_bytes;