[Pkg-iscsi-maintainers] [SCM] Debian Open-iSCSI Packaging branch, upstream-mnc, updated. 2.0-872-101-g2616afb

Mike Christie michaelc at cs.wisc.edu
Mon May 2 18:56:32 UTC 2011


The following commit has been merged in the upstream-mnc branch:
commit 508c5df5ef6433049e2162188a7f3831953a6df0
Author: Mike Christie <michaelc at cs.wisc.edu>
Date:   Sun Jan 30 22:53:42 2011 -0600

    iscsi tools: convert discovery code to iscsi error codes
    
    This just converts the iscsi discovery code
    to the iscsi_err.h error codes.

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);

-- 
Debian Open-iSCSI Packaging



More information about the Pkg-iscsi-maintainers mailing list