summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/iscsiadm.810
-rw-r--r--include/iscsi_err.h4
-rw-r--r--usr/discovery.c124
-rw-r--r--usr/discoveryd.c53
-rw-r--r--usr/idbm.c6
-rw-r--r--usr/iscsi_err.c2
-rw-r--r--usr/iscsiadm.c12
7 files changed, 128 insertions, 83 deletions
diff --git a/doc/iscsiadm.8 b/doc/iscsiadm.8
index 8e4868e..177d3cd 100644
--- a/doc/iscsiadm.8
+++ b/doc/iscsiadm.8
@@ -435,6 +435,16 @@ ISCSI_ERR_HOST_NOT_FOUND - could not lookup host.
24
ISCSI_ERR_LOGIN_AUTH_FAILED - login failed due to authorization failure.
+.TP
+.B
+25
+ISCSI_ERR_ISNS_QUERY - iSNS query failure.
+
+.TP
+.B
+26
+ISCSI_ERR_ISNS_REG_FAILED - iSNS registration/deregistration failed.
+
.SH EXAMPLES
diff --git a/include/iscsi_err.h b/include/iscsi_err.h
index 9f7475e..d1d94b5 100644
--- a/include/iscsi_err.h
+++ b/include/iscsi_err.h
@@ -54,6 +54,10 @@ enum {
ISCSI_ERR_HOST_NOT_FOUND = 23,
/* Login failed due to authorization failure */
ISCSI_ERR_LOGIN_AUTH_FAILED = 24,
+ /* iSNS query failure */
+ ISCSI_ERR_ISNS_QUERY = 25,
+ /* iSNS registration/deregistration failed */
+ ISCSI_ERR_ISNS_REG_FAILED = 26,
/* Always last. Indicates end of error code space */
ISCSI_MAX_ERR_VAL,
diff --git a/usr/discovery.c b/usr/discovery.c
index 63792ec..70b077c 100644
--- a/usr/discovery.c
+++ b/usr/discovery.c
@@ -112,14 +112,14 @@ int discovery_isns_set_servername(char *address, int port)
if (port > USHRT_MAX) {
log_error("Invalid port %d\n", port);
- return EINVAL;
+ return ISCSI_ERR_INVAL;
}
/* 5 for port and 1 for colon and 1 for null */
len = strlen(address) + 7;
server = calloc(1, len);
if (!server)
- return ENOMEM;
+ return ISCSI_ERR_NOMEM;
snprintf(server, len, "%s:%d", address, port);
isns_assign_string(&isns_config.ic_server_name, server);
@@ -141,11 +141,11 @@ int discovery_isns_query(struct discovery_rec *drec, const char *iname,
isns_config.ic_security = 0;
source = isns_source_create_iscsi(iname);
if (!source)
- return ENOMEM;
+ return ISCSI_ERR_NOMEM;
clnt = isns_create_client(NULL, iname);
if (!clnt) {
- rc = ENOMEM;
+ rc = ISCSI_ERR_NOMEM;
goto free_src;
}
@@ -163,7 +163,7 @@ int discovery_isns_query(struct discovery_rec *drec, const char *iname,
qry = isns_create_query2(clnt, &key_attrs, source);
if (!qry) {
- rc = ENOMEM;
+ rc = ISCSI_ERR_NOMEM;
goto free_clnt;
}
@@ -182,11 +182,11 @@ int discovery_isns_query(struct discovery_rec *drec, const char *iname,
break;
case ISNS_SOURCE_UNKNOWN:
/* server requires that we are registered but we are not */
- rc = ENOENT;
+ rc = ISCSI_ERR_ISNS_REG_FAILED;
goto free_query;
default:
log_error("iSNS discovery failed: %s", isns_strerror(status));
- rc = EIO;
+ rc = ISCSI_ERR_ISNS_QUERY;
goto free_query;
}
@@ -194,7 +194,7 @@ int discovery_isns_query(struct discovery_rec *drec, const char *iname,
if (status) {
log_error("Unable to extract object list from query "
"response: %s\n", isns_strerror(status));
- rc = EIO;
+ rc = ISCSI_ERR;
goto free_query;
}
@@ -244,7 +244,7 @@ int discovery_isns_query(struct discovery_rec *drec, const char *iname,
rec = calloc(1, sizeof(*rec));
if (!rec) {
- rc = ENOMEM;
+ rc = ISCSI_ERR_NOMEM;
goto destroy_list;
}
@@ -296,11 +296,11 @@ static int discovery_isns_reg_node(const char *iname, int op_reg)
source = isns_source_create_iscsi(iname);
if (!source)
- return ENOMEM;
+ return ISCSI_ERR_NOMEM;
clnt = isns_create_client(NULL, iname);
if (!clnt) {
- rc = ENOMEM;
+ rc = ISCSI_ERR_NOMEM;
goto free_src;
}
@@ -308,7 +308,7 @@ static int discovery_isns_reg_node(const char *iname, int op_reg)
ISNS_DEVICE_DEREGISTER,
source, NULL);
if (!reg) {
- rc = ENOMEM;
+ rc = ISCSI_ERR_NOMEM;
goto free_clnt;
}
@@ -323,7 +323,7 @@ static int discovery_isns_reg_node(const char *iname, int op_reg)
log_error("Could not %s %s with iSNS server: %s.",
reg ? "register" : "deregister", iname,
isns_strerror(status));
- rc = EIO;
+ rc = ISCSI_ERR_ISNS_REG_FAILED;
} else
log_debug(1, "%s %s with iSNS server successful.",
op_reg ? "register" : "deregister", iname);
@@ -347,7 +347,7 @@ int discovery_isns(void *data, struct iface_rec *iface,
if (request_initiator_name() || initiator_name[0] == '\0') {
log_error("Cannot perform discovery. Initiatorname "
"required.");
- return EINVAL;
+ return ISCSI_ERR_INVAL;
}
iname = initiator_name;
}
@@ -357,7 +357,7 @@ int discovery_isns(void *data, struct iface_rec *iface,
return rc;
retry:
rc = discovery_isns_query(drec, iname, NULL, rec_list);
- if (!registered && rc == ENOENT) {
+ if (!registered && rc == ISCSI_ERR_ISNS_REG_FAILED) {
rc = discovery_isns_reg_node(iname, 1);
if (!rc) {
registered = 1;
@@ -401,7 +401,7 @@ int discovery_fw(void *data, struct iface_rec *iface,
if (!rec) {
log_error("Could not convert firmware info to "
"node record.\n");
- rc = ENOMEM;
+ rc = ISCSI_ERR_NOMEM;
goto free_targets;
}
rec->disc_type = drec->type;
@@ -433,10 +433,10 @@ int discovery_offload_sendtargets(int host_no, int do_login,
/* resolve the DiscoveryAddress to an IP address */
sprintf(default_port, "%d", drec->port);
- if (resolve_address(drec->address, default_port, &ss)) {
- log_error("Cannot resolve host name %s.", drec->address);
- return EIO;
- }
+ rc = resolve_address(drec->address, default_port, &ss);
+ if (rc)
+ return rc;
+
req.u.st.ss = ss;
/*
@@ -453,7 +453,7 @@ int discovery_offload_sendtargets(int host_no, int do_login,
log_error("Could not offload sendtargets to %s.\n",
drec->address);
iscsi_err_print_msg(rc);
- return EIO;
+ return rc;
}
return 0;
@@ -495,7 +495,7 @@ request_targets(iscsi_session_t *session)
if (!iscsi_add_text(hdr, data, sizeof (data), "SendTargets", "All")) {
log_error("failed to add SendTargets text key");
- exit(1);
+ return 0;
}
text.ttt = ISCSI_RESERVED_TAG;
@@ -1060,7 +1060,7 @@ static int iscsi_create_leading_conn(struct iscsi_session *session)
session->use_ipc = 0;
if (!iscsi_io_connect(conn))
- return ENOTCONN;
+ return ISCSI_ERR_TRANS;
session->id = 1;
return 0;
@@ -1075,7 +1075,7 @@ static int iscsi_create_leading_conn(struct iscsi_session *session)
if (conn->socket_fd < 0) {
log_error("Could not open netlink interface (err %d)\n",
errno);
- return errno;
+ return ISCSI_ERR_INTERNAL;
}
host_no = iscsi_sysfs_get_host_no_from_hwinfo(iface, &rc);
@@ -1093,6 +1093,7 @@ static int iscsi_create_leading_conn(struct iscsi_session *session)
if (rc) {
log_error("Could not set host net params (err %d)\n",
rc);
+ rc = ISCSI_ERR_INTERNAL;
goto close_ipc;
}
@@ -1100,17 +1101,18 @@ static int iscsi_create_leading_conn(struct iscsi_session *session)
log_debug(2, "%s discovery ep connect\n", __FUNCTION__);
rc = t->template->ep_connect(conn, 1);
if (rc < 0) {
- rc = ENOTCONN;
+ rc = ISCSI_ERR_TRANS;
goto fail;
}
do {
rc = t->template->ep_poll(conn, 1);
- if (rc < 0)
+ if (rc < 0) {
+ rc = ISCSI_ERR_TRANS;
goto disconnect;
- else if (rc == 0) {
+ } else if (rc == 0) {
if (sleep_count == conn->login_timeout) {
- rc = ETIMEDOUT;
+ rc = ISCSI_ERR_TRANS_TIMEOUT;
goto disconnect;
}
sleep_count++;
@@ -1126,6 +1128,7 @@ static int iscsi_create_leading_conn(struct iscsi_session *session)
&session->id, &host_no);
if (rc) {
log_error("Could not create kernel session (err %d).\n", rc);
+ rc = ISCSI_ERR_INTERNAL;
goto disconnect;
}
log_debug(2, "%s discovery created session %u\n", __FUNCTION__,
@@ -1136,6 +1139,7 @@ static int iscsi_create_leading_conn(struct iscsi_session *session)
rc = ipc->create_conn(t->handle, session->id, conn->id, &conn->id);
if (rc) {
log_error("Could not create connection (err %d)", rc);
+ rc = ISCSI_ERR_INTERNAL;
goto disconnect;
}
@@ -1146,6 +1150,7 @@ static int iscsi_create_leading_conn(struct iscsi_session *session)
log_error("Could not bind conn %d:%d to session %d, "
"(err %d)", session->id, conn->id,
session->id, rc);
+ rc = ISCSI_ERR_INTERNAL;
goto disconnect;
}
@@ -1176,8 +1181,8 @@ close_ipc:
conn->socket_fd = -1;
}
fail:
- log_error("Connection to discovery portal %s failed (err %d)",
- conn->host, rc);
+ log_error("Connection to discovery portal %s failed: %s",
+ conn->host, iscsi_err_to_str(rc));
return rc;
}
@@ -1223,7 +1228,7 @@ static int iscsi_create_session(struct iscsi_session *session,
char *data, unsigned int data_len)
{
struct iscsi_conn *conn = &session->conn[0];
- int rc, login_delay = 0;
+ int login_status, rc = 0, login_delay = 0;
uint8_t status_class = 0, status_detail = 0;
unsigned int login_failures = 0;
char serv[NI_MAXSERV];
@@ -1279,7 +1284,8 @@ redirect_reconnect:
conn->host, serv, login_delay);
sleep(login_delay);
}
- if (iscsi_create_leading_conn(session)) {
+ rc = iscsi_create_leading_conn(session);
+ if (rc) {
login_failures++;
goto reconnect;
}
@@ -1298,12 +1304,13 @@ redirect_reconnect:
status_class = 0;
status_detail = 0;
+ rc = ISCSI_ERR_LOGIN;
memset(data, 0, data_len);
- rc = iscsi_login(session, 0, data, data_len,
- &status_class, &status_detail);
+ login_status = iscsi_login(session, 0, data, data_len,
+ &status_class, &status_detail);
- switch (rc) {
+ switch (login_status) {
case LOGIN_OK:
case LOGIN_REDIRECT:
break;
@@ -1322,7 +1329,8 @@ redirect_reconnect:
case LOGIN_VERSION_MISMATCH:
case LOGIN_INVALID_PDU:
log_error("discovery login to %s failed, giving up %d",
- conn->host, rc);
+ conn->host, login_status);
+ rc = ISCSI_ERR_FATAL_LOGIN;
goto login_failed;
}
@@ -1361,10 +1369,20 @@ redirect_reconnect:
}
break;
case ISCSI_STATUS_CLS_INITIATOR_ERR:
- log_error(
- "discovery login to %s rejected: "
- "initiator error (%02x/%02x), non-retryable, giving up",
- conn->host, status_class, status_detail);
+ switch (status_detail) {
+ case ISCSI_LOGIN_STATUS_AUTH_FAILED:
+ case ISCSI_LOGIN_STATUS_TGT_FORBIDDEN:
+ log_error("discovery login to %s rejected: "
+ "initiator failed authorization\n",
+ conn->host);
+ rc = ISCSI_ERR_LOGIN_AUTH_FAILED;
+ goto login_failed;
+ default:
+ log_error("discovery login to %s rejected: initiator "
+ "error (%02x/%02x), non-retryable, giving up",
+ conn->host, status_class, status_detail);
+ rc = ISCSI_ERR_FATAL_LOGIN;
+ }
goto login_failed;
case ISCSI_STATUS_CLS_TARGET_ERR:
log_error(
@@ -1391,6 +1409,7 @@ redirect_reconnect:
if (rc) {
log_error("Could not set iscsi params for conn %d:%d (err "
"%d)\n", session->id, conn->id, rc);
+ rc = ISCSI_ERR_INTERNAL;
goto login_failed;
}
@@ -1398,6 +1417,7 @@ redirect_reconnect:
if (ipc->start_conn(t->handle, session->id, conn->id, &rc) || rc) {
log_error("Cannot start conn %d:%d (err %d)",
session->id, conn->id, rc);
+ rc = ISCSI_ERR_INTERNAL;
goto login_failed;
}
@@ -1405,7 +1425,7 @@ redirect_reconnect:
login_failed:
iscsi_destroy_session(session);
- return ENOTCONN;
+ return rc;
}
int discovery_sendtargets(void *fndata, struct iface_rec *iface,
@@ -1437,7 +1457,7 @@ int discovery_sendtargets(void *fndata, struct iface_rec *iface,
log_error("Discovery process to %s:%d failed to "
"create a discovery session.",
drec->address, drec->port);
- return 1;
+ return ISCSI_ERR_NOMEM;
}
ipc_ev_context.conn = &session->conn[0];
@@ -1452,7 +1472,7 @@ int discovery_sendtargets(void *fndata, struct iface_rec *iface,
/* allocate data buffers for SendTargets data */
data = malloc(session->conn[0].max_recv_dlength);
if (!data) {
- rc = 1;
+ rc = ISCSI_ERR_NOMEM;
goto free_session;
}
data_len = session->conn[0].max_recv_dlength;
@@ -1460,10 +1480,10 @@ int discovery_sendtargets(void *fndata, struct iface_rec *iface,
str_init_buffer(&sendtargets, 0);
/* resolve the DiscoveryAddress to an IP address */
- if (iscsi_setup_portal(&session->conn[0], drec->address,
- drec->port)) {
+ rc = iscsi_setup_portal(&session->conn[0], drec->address,
+ drec->port);
+ if (rc) {
log_error("cannot resolve host name %s", drec->address);
- rc = 1;
goto free_sendtargets;
}
@@ -1474,10 +1494,8 @@ int discovery_sendtargets(void *fndata, struct iface_rec *iface,
reconnect:
rc = iscsi_create_session(session, &drec->u.sendtargets,
data, data_len);
- if (rc) {
- rc = 1;
+ if (rc)
goto free_sendtargets;
- }
/* reinitialize */
str_truncate_buffer(&sendtargets, 0);
@@ -1517,7 +1535,7 @@ repoll:
if (iscsi_timer_expired(&connection_timer)) {
log_warning("Discovery session to %s:%d timed out.",
drec->address, drec->port);
- rc = 1;
+ rc = ISCSI_ERR_TRANS_TIMEOUT;
goto reconnect;
}
@@ -1537,7 +1555,7 @@ repoll:
"response, terminating",
drec->address,
drec->port);
- rc = 1;
+ rc = ISCSI_ERR_PDU_TIMEOUT;
goto free_sendtargets;
}
@@ -1562,7 +1580,7 @@ repoll:
log_warning("discovery session to %s:%d "
"terminating after hangup",
drec->address, drec->port);
- rc = 1;
+ rc = ISCSI_ERR_TRANS;
goto free_sendtargets;
}
@@ -1579,7 +1597,7 @@ repoll:
}
} else if (rc < 0) {
log_error("poll error");
- rc = 1;
+ rc = ISCSI_ERR;
goto free_sendtargets;
}
diff --git a/usr/discoveryd.c b/usr/discoveryd.c
index 51f73d8..de080ea 100644
--- a/usr/discoveryd.c
+++ b/usr/discoveryd.c
@@ -44,6 +44,7 @@
#include "isns.h"
#include "paths.h"
#include "message.h"
+#include "iscsi_err.h"
#define DISC_DEF_POLL_INVL 30
@@ -242,12 +243,12 @@ static int isns_build_objs(isns_portal_info_t *portal_info,
nportals = isns_get_nr_portals();
log_debug(4, "got %d portals", nportals);
if (!nportals)
- return ENODEV;
+ return ISCSI_ERR_NO_OBJS_FOUND;
iflist = calloc(nportals, sizeof(isns_portal_info_t));
if (!iflist) {
log_error("Unable to allocate %d portals.", nportals);
- return ENOMEM;
+ return ISCSI_ERR_NOMEM;
}
nportals = isns_enumerate_portals(iflist, nportals);
@@ -255,7 +256,7 @@ static int isns_build_objs(isns_portal_info_t *portal_info,
log_error("Unable to enumerate portals - "
"no usable interfaces found\n");
free(iflist);
- return ENODEV;
+ return ISCSI_ERR_NO_OBJS_FOUND;
}
for (i = 0; i < nportals; ++i) {
iflist[i].addr.sin6_port = portal_info->addr.sin6_port;
@@ -267,7 +268,7 @@ static int isns_build_objs(isns_portal_info_t *portal_info,
if (!isns_entity_id) {
isns_entity_id = calloc(1, 256);
if (!isns_entity_id)
- return ENOMEM;
+ return ISCSI_ERR_NOMEM;
rc = getnameinfo((struct sockaddr *) &portal_info->addr,
sizeof(portal_info->addr),
@@ -277,14 +278,14 @@ static int isns_build_objs(isns_portal_info_t *portal_info,
isns_entity_id = NULL;
log_error("Could not get hostname for EID.");
- return EIO;
+ return ISCSI_ERR;
}
}
entity = isns_create_entity(ISNS_ENTITY_PROTOCOL_ISCSI, isns_entity_id);
if (!entity) {
log_error("Could not create iSNS entity.");
- return ENOMEM;
+ return ISCSI_ERR_NOMEM;
}
isns_object_list_append(objs, entity);
@@ -293,14 +294,14 @@ static int isns_build_objs(isns_portal_info_t *portal_info,
portal = isns_create_portal(portal_info, entity);
if (!portal) {
- rc = ENOMEM;
+ rc = ISCSI_ERR_NOMEM;
goto fail;
}
isns_object_list_append(objs, portal);
if (!isns_object_set_uint32(portal, ISNS_TAG_SCN_PORT,
isns_portal_tcpudp_port(portal_info))) {
- rc = EINVAL;
+ rc = ISCSI_ERR_INVAL;
goto fail;
}
}
@@ -310,7 +311,7 @@ static int isns_build_objs(isns_portal_info_t *portal_info,
ISNS_ISCSI_INITIATOR_MASK,
NULL);
if (!inode) {
- rc = ENOMEM;
+ rc = ISCSI_ERR_NOMEM;
goto fail;
}
isns_object_list_append(objs, inode);
@@ -558,7 +559,7 @@ static int isns_setup_registration_refresh(isns_simple_t *rsp, int poll_inval)
log_error("Unable to extract object list from "
"registration response: %s\n",
isns_strerror(status));
- return EIO;
+ return ISCSI_ERR;
}
for (i = 0; i < objs.iol_count; ++i) {
@@ -577,7 +578,7 @@ static int isns_setup_registration_refresh(isns_simple_t *rsp, int poll_inval)
refresh_data = calloc(1, sizeof(*refresh_data));
if (!refresh_data) {
- rc = ENOMEM;
+ rc = ISCSI_ERR_NOMEM;
goto free_objs;
}
INIT_LIST_HEAD(&refresh_data->list);
@@ -653,7 +654,7 @@ static int isns_register_objs(isns_client_t *clnt, isns_object_list_t *objs,
reg = isns_create_registration(clnt, entity);
if (!reg)
- return ENOMEM;
+ return ISCSI_ERR_NOMEM;
for (i = 0; i < objs->iol_count; ++i)
isns_registration_add_object(reg, objs->iol_data[i]);
@@ -663,7 +664,7 @@ static int isns_register_objs(isns_client_t *clnt, isns_object_list_t *objs,
if (status != ISNS_SUCCESS) {
log_error("Could not register with iSNS server: %s",
isns_strerror(status));
- rc = EIO;
+ rc = ISCSI_ERR;
goto free_reg;
}
log_debug(4, "Registered objs");
@@ -686,7 +687,7 @@ static int isns_register_objs(isns_client_t *clnt, isns_object_list_t *objs,
if (!reg) {
isns_cancel_refresh_timers();
- rc = ENOMEM;
+ rc = ISCSI_ERR_NOMEM;
goto done;
}
@@ -702,7 +703,7 @@ static int isns_register_objs(isns_client_t *clnt, isns_object_list_t *objs,
*/
if (poll_inval < 0) {
isns_cancel_refresh_timers();
- rc = EIO;
+ rc = ISCSI_ERR;
break;
}
}
@@ -726,7 +727,7 @@ static int isns_scn_register(isns_socket_t *svr_sock, int poll_inval)
clnt = isns_create_default_client(NULL);
if (!clnt) {
log_error("iSNS setup failed. Could not connect to server.");
- return ENOTCONN;
+ return ISCSI_ERR_TRANS;
}
isns_socket_set_disconnect_fatal(clnt->ic_socket);
@@ -734,7 +735,7 @@ static int isns_scn_register(isns_socket_t *svr_sock, int poll_inval)
if (!isns_socket_get_portal_info(svr_sock, &portal_info)) {
log_error("Could not get portal info for iSNS registration.");
- rc = ENODEV;
+ rc = ISCSI_ERR_NO_OBJS_FOUND;
goto destroy_clnt;
}
@@ -796,7 +797,7 @@ static int isns_create_node_list(const char *def_iname)
if (def_iname) {
node = isns_create_node(def_iname);
if (!node) {
- rc = ENOMEM;
+ rc = ISCSI_ERR_NOMEM;
goto fail;
}
list_add_tail(&node->list, &isns_initiators);
@@ -807,7 +808,7 @@ static int isns_create_node_list(const char *def_iname)
!isns_lookup_node(iface->iname)) {
node = isns_create_node(iface->iname);
if (!node) {
- rc = ENOMEM;
+ rc = ISCSI_ERR_NOMEM;
goto fail;
}
list_add_tail(&node->list, &isns_initiators);
@@ -942,7 +943,7 @@ static int isns_eventd(const char *def_iname, char *disc_addr, int port,
isns_create_node_list(def_iname);
if (list_empty(&isns_initiators)) {
log_error("iSNS registration failed. Initiatorname not set.");
- return EINVAL;
+ return ISCSI_ERR_INVAL;
}
/* use def_iname or if not set the first iface's iname for the src */
@@ -954,7 +955,7 @@ static int isns_eventd(const char *def_iname, char *disc_addr, int port,
isns_config.ic_control_socket = ISNS_EVENTD_CTL;
if (discovery_isns_set_servername(disc_addr, port)) {
- rc = ENOMEM;
+ rc = ISCSI_ERR_NOMEM;
goto fail;
}
@@ -963,13 +964,13 @@ static int isns_eventd(const char *def_iname, char *disc_addr, int port,
db = isns_db_open(NULL);
if (!db) {
log_error("iSNS setup failed. Could not create db.");
- rc = ENOMEM;
+ rc = ISCSI_ERR_NOMEM;
goto fail;
}
svr = isns_create_server(node->source, db, &isns_callback_service_ops);
if (!svr) {
log_error("iSNS setup failed. Could not create server.");
- rc = ENOTCONN;
+ rc = ISCSI_ERR_TRANS;
goto fail;
}
isns_server_set_scn_callback(svr, isns_scn_callback);
@@ -977,7 +978,7 @@ static int isns_eventd(const char *def_iname, char *disc_addr, int port,
svr_sock = isns_create_server_socket(NULL, NULL, AF_INET6, SOCK_DGRAM);
if (!svr_sock) {
log_error("iSNS setup failed. Could not create server socket.");
- rc = ENOTCONN;
+ rc = ISCSI_ERR_TRANS;
goto fail;
}
@@ -1076,7 +1077,7 @@ static int st_start(void *data, struct discovery_rec *drec)
log_debug(1, "st_start %s:%d %d", drec->address, drec->port,
drec->u.sendtargets.use_discoveryd);
if (!drec->u.sendtargets.use_discoveryd)
- return ENOSYS;
+ return ISCSI_ERR_INVAL;
fork_disc(NULL, drec, drec->u.sendtargets.discoveryd_poll_inval,
do_st_disc_and_login);
@@ -1093,7 +1094,7 @@ static int isns_start(void *data, struct discovery_rec *drec)
log_debug(1, "isns_start %s:%d %d", drec->address, drec->port,
drec->u.isns.use_discoveryd);
if (!drec->u.isns.use_discoveryd)
- return ENOSYS;
+ return ISCSI_ERR_INVAL;
fork_disc(data, drec, drec->u.isns.discoveryd_poll_inval, start_isns);
return 0;
diff --git a/usr/idbm.c b/usr/idbm.c
index 331d684..a73b410 100644
--- a/usr/idbm.c
+++ b/usr/idbm.c
@@ -1860,10 +1860,12 @@ static int idbm_bind_iface_to_nodes(idbm_disc_nodes_fn *disc_node_fn,
{
struct node_rec *rec, *tmp;
struct list_head new_recs;
+ int rc;
INIT_LIST_HEAD(&new_recs);
- if (disc_node_fn(data, iface, &new_recs))
- return ISCSI_ERR;
+ rc = disc_node_fn(data, iface, &new_recs);
+ if (rc)
+ return rc;
list_for_each_entry_safe(rec, tmp, &new_recs, list) {
list_del_init(&rec->list);
diff --git a/usr/iscsi_err.c b/usr/iscsi_err.c
index 360a7ae..a1ad2bd 100644
--- a/usr/iscsi_err.c
+++ b/usr/iscsi_err.c
@@ -47,6 +47,8 @@ static char *iscsi_err_msgs[] = {
/* 23 */ "sysfs lookup failure",
/* 23 */ "host not found",
/* 24 */ "iSCSI login failed due to authorization failure",
+ /* 25 */ "iSNS query failed",
+ /* 26 */ "iSNS registration failed",
};
char *iscsi_err_to_str(int err)
diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c
index db52520..3c8abd2 100644
--- a/usr/iscsiadm.c
+++ b/usr/iscsiadm.c
@@ -948,8 +948,12 @@ do_software_sendtargets(discovery_rec_t *drec, struct list_head *ifaces,
rc = idbm_bind_ifaces_to_nodes(discovery_sendtargets, drec, ifaces,
&rec_list);
if (rc) {
- log_error("Could not perform SendTargets discovery.");
+ log_error("Could not perform SendTargets discovery: %s",
+ iscsi_err_to_str(rc));
return rc;
+ } else if (list_empty(&rec_list)) {
+ log_error("No portals found");
+ return ISCSI_ERR_NO_OBJS_FOUND;
}
rc = exec_disc_op_on_recs(drec, &rec_list, info_level, do_login, op);
@@ -1043,8 +1047,12 @@ static int do_isns(discovery_rec_t *drec, struct list_head *ifaces,
rc = idbm_bind_ifaces_to_nodes(discovery_isns, drec, ifaces,
&rec_list);
if (rc) {
- log_error("Could not perform iSNS discovery.");
+ log_error("Could not perform iSNS discovery: %s",
+ iscsi_err_to_str(rc));
return rc;
+ } else if (list_empty(&rec_list)) {
+ log_error("No portals found");
+ return ISCSI_ERR_NO_OBJS_FOUND;
}
rc = exec_disc_op_on_recs(drec, &rec_list, info_level, do_login, op);