diff options
-rw-r--r-- | doc/iscsiadm.8 | 10 | ||||
-rw-r--r-- | include/iscsi_err.h | 4 | ||||
-rw-r--r-- | usr/discovery.c | 124 | ||||
-rw-r--r-- | usr/discoveryd.c | 53 | ||||
-rw-r--r-- | usr/idbm.c | 6 | ||||
-rw-r--r-- | usr/iscsi_err.c | 2 | ||||
-rw-r--r-- | usr/iscsiadm.c | 12 |
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; @@ -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); |