summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--etc/iscsid.conf16
-rw-r--r--usr/discovery.c6
-rw-r--r--usr/idbm.c61
-rw-r--r--usr/iscsiadm.c8
-rw-r--r--usr/iscsid.c2
-rw-r--r--usr/iscsistart.c4
-rw-r--r--usr/session_info.c2
-rw-r--r--usr/util.c103
-rw-r--r--usr/util.h9
9 files changed, 128 insertions, 83 deletions
diff --git a/etc/iscsid.conf b/etc/iscsid.conf
index a065d53..8d986a7 100644
--- a/etc/iscsid.conf
+++ b/etc/iscsid.conf
@@ -14,6 +14,22 @@
#isns.address = 192.168.0.1
#isns.port = 3205
+######################
+# iscsid daemon config
+######################
+# If you want iscsid to start the first time a iscsi tool
+# needs to access it, instead of starting it when the init
+# scripts run, set the iscsid startup command here. This
+# should normally only need to be done by distro package
+# maintainers.
+#
+# Default for Fedora and RHEL. (uncomment to activate).
+# iscsid.startup = /etc/rc.d/init.d/iscsid force-start
+#
+# Default for upstream open-iscsi scripts (uncomment to activate).
+iscsid.startup = /sbin/iscsid
+
+
#############################
# NIC/HBA and driver settings
#############################
diff --git a/usr/discovery.c b/usr/discovery.c
index 3c9b64b..5c7ea66 100644
--- a/usr/discovery.c
+++ b/usr/discovery.c
@@ -130,7 +130,7 @@ int discovery_offload_sendtargets(int host_no, int do_login,
* and get back the results. We should do this since it would
* allows us to then process the results like software iscsi.
*/
- rc = do_iscsid(&req, &rsp);
+ rc = do_iscsid(&req, &rsp, 1);
if (rc) {
log_error("Could not offload sendtargets to %s.\n",
drec->address);
@@ -564,7 +564,7 @@ static int request_initiator_name(void)
memset(&req, 0, sizeof(req));
req.command = MGMT_IPC_CONFIG_INAME;
- rc = do_iscsid(&req, &rsp);
+ rc = do_iscsid(&req, &rsp, 1);
if (rc)
return EIO;
@@ -574,7 +574,7 @@ static int request_initiator_name(void)
memset(&req, 0, sizeof(req));
req.command = MGMT_IPC_CONFIG_IALIAS;
- rc = do_iscsid(&req, &rsp);
+ rc = do_iscsid(&req, &rsp, 0);
if (rc)
/* alias is optional so return ok */
return 0;
diff --git a/usr/idbm.c b/usr/idbm.c
index 30c2102..ee38e64 100644
--- a/usr/idbm.c
+++ b/usr/idbm.c
@@ -127,67 +127,6 @@ static struct idbm *db;
_n++; \
} while(0)
-/*
- * from linux kernel
- */
-static char *strstrip(char *s)
-{
- size_t size;
- char *end;
-
- size = strlen(s);
- if (!size)
- return s;
-
- end = s + size - 1;
- while (end >= s && isspace(*end))
- end--;
- *(end + 1) = '\0';
-
- while (*s && isspace(*s))
- s++;
-
- return s;
-}
-
-static char *get_global_string_param(char *pathname, const char *key)
-{
- FILE *f = NULL;
- int len;
- char *line, buffer[1024];
- char *name = NULL;
-
- if (!pathname) {
- log_error("No pathname to load %s from", key);
- return NULL;
- }
-
- len = strlen(key);
- if ((f = fopen(pathname, "r"))) {
- while ((line = fgets(buffer, sizeof (buffer), f))) {
-
- line = strstrip(line);
-
- if (strncmp(line, key, len) == 0) {
- char *end = line + len;
-
- /*
- * make sure ther is something after the
- * key.
- */
- if (strlen(end))
- name = strdup(line + len);
- }
- }
- fclose(f);
- if (name)
- log_debug(5, "%s=%s", key, name);
- } else
- log_error("can't open %s configuration file %s", key, pathname);
-
- return name;
-}
-
char *get_iscsi_initiatorname(char *pathname)
{
char *name;
diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c
index 4cd02fe..9d2ce71 100644
--- a/usr/iscsiadm.c
+++ b/usr/iscsiadm.c
@@ -198,7 +198,7 @@ static void kill_iscsid(int priority)
memset(&req, 0, sizeof(req));
req.command = MGMT_IPC_IMMEDIATE_STOP;
- rc = do_iscsid(&req, &rsp);
+ rc = do_iscsid(&req, &rsp, 0);
if (rc) {
iscsid_handle_error(rc);
log_error("Could not stop iscsid. Trying sending iscsid "
@@ -794,7 +794,7 @@ static char *get_config_file(void)
memset(&req, 0, sizeof(req));
req.command = MGMT_IPC_CONFIG_FILE;
- rc = do_iscsid(&req, &rsp);
+ rc = do_iscsid(&req, &rsp, 1);
if (rc)
return NULL;
@@ -844,7 +844,7 @@ session_stats(void *data, struct session_info *info)
req.command = MGMT_IPC_SESSION_STATS;
req.u.session.sid = info->sid;
- rc = do_iscsid(&req, &rsp);
+ rc = do_iscsid(&req, &rsp, 1);
if (rc)
return EIO;
@@ -1277,7 +1277,7 @@ static int isns_dev_attr_query(discovery_rec_t *drec,
memset(&req, 0, sizeof(iscsiadm_req_t));
req.command = MGMT_IPC_ISNS_DEV_ATTR_QUERY;
- err = do_iscsid(&req, &rsp);
+ err = do_iscsid(&req, &rsp, 1);
if (err) {
iscsid_handle_error(err);
return EIO;
diff --git a/usr/iscsid.c b/usr/iscsid.c
index 6f27be8..d152c80 100644
--- a/usr/iscsid.c
+++ b/usr/iscsid.c
@@ -261,7 +261,7 @@ static int sync_session(void *data, struct session_info *info)
memcpy(&req.u.session.rec, &rec, sizeof(node_rec_t));
retry:
- rc = do_iscsid(&req, &rsp);
+ rc = do_iscsid(&req, &rsp, 0);
if (rc == MGMT_IPC_ERR_ISCSID_NOTCONN && retries < 30) {
retries++;
sleep(1);
diff --git a/usr/iscsistart.c b/usr/iscsistart.c
index 90f4e24..8482ad5 100644
--- a/usr/iscsistart.c
+++ b/usr/iscsistart.c
@@ -115,7 +115,7 @@ static int stop_event_loop(void)
memset(&req, 0, sizeof(req));
req.command = MGMT_IPC_IMMEDIATE_STOP;
- rc = do_iscsid(&req, &rsp);
+ rc = do_iscsid(&req, &rsp, 0);
if (rc) {
iscsid_handle_error(rc);
log_error("Could not stop event_loop\n");
@@ -146,7 +146,7 @@ static int login_session(void)
memcpy(&req.u.session.rec, &config_rec, sizeof(node_rec_t));
retry:
- rc = do_iscsid(&req, &rsp);
+ rc = do_iscsid(&req, &rsp, 0);
/*
* handle race where iscsid proc is starting up while we are
* trying to connect.
diff --git a/usr/session_info.c b/usr/session_info.c
index 631e006..1124a06 100644
--- a/usr/session_info.c
+++ b/usr/session_info.c
@@ -107,7 +107,7 @@ static int print_iscsi_state(int sid, char *prefix)
req.command = MGMT_IPC_SESSION_INFO;
req.u.session.sid = sid;
- err = do_iscsid(&req, &rsp);
+ err = do_iscsid(&req, &rsp, 1);
/*
* for drivers like qla4xxx, iscsid does not display
* anything here since it does not know about it.
diff --git a/usr/util.c b/usr/util.c
index 5b31e89..6234fd5 100644
--- a/usr/util.c
+++ b/usr/util.c
@@ -4,6 +4,7 @@
#include <stdio.h>
#include <string.h>
#include <errno.h>
+#include <ctype.h>
#include <sys/un.h>
#include <sys/time.h>
#include <sys/resource.h>
@@ -119,9 +120,88 @@ int increase_max_files(void)
return 0;
}
+/*
+ * from linux kernel
+ */
+char *strstrip(char *s)
+{
+ size_t size;
+ char *end;
+
+ size = strlen(s);
+ if (!size)
+ return s;
+
+ end = s + size - 1;
+ while (end >= s && isspace(*end))
+ end--;
+ *(end + 1) = '\0';
+
+ while (*s && isspace(*s))
+ s++;
+
+ return s;
+}
+
+char *get_global_string_param(char *pathname, const char *key)
+{
+ FILE *f = NULL;
+ int len;
+ char *line, buffer[1024];
+ char *name = NULL;
+
+ if (!pathname) {
+ log_error("No pathname to load %s from", key);
+ return NULL;
+ }
+
+ len = strlen(key);
+ if ((f = fopen(pathname, "r"))) {
+ while ((line = fgets(buffer, sizeof (buffer), f))) {
+
+ line = strstrip(line);
+
+ if (strncmp(line, key, len) == 0) {
+ char *end = line + len;
+
+ /*
+ * make sure there is something after the
+ * key.
+ */
+ if (strlen(end))
+ name = strdup(line + len);
+ }
+ }
+ fclose(f);
+ if (name)
+ log_debug(5, "%s=%s", key, name);
+ } else
+ log_error("can't open %s configuration file %s", key, pathname);
+
+ return name;
+}
+
+/* TODO: move iscsid client helpers to file */
+static void iscsid_startup(void)
+{
+ char *startup_cmd;
+
+ startup_cmd = get_global_string_param(CONFIG_FILE, "iscsid.startup = ");
+ if (!startup_cmd) {
+ log_error("iscsid is not running. Could not start it up "
+ "automatically using the startup command in "
+ "/etc/iscsi/iscsid.start. Please check that the "
+ "file exists or that your init scripts have "
+ "started iscsid.");
+ return;
+ }
+
+ system(startup_cmd);
+}
+
#define MAXSLEEP 128
-static mgmt_ipc_err_e iscsid_connect(int *fd)
+static mgmt_ipc_err_e iscsid_connect(int *fd, int start_iscsid)
{
int nsec;
struct sockaddr_un addr;
@@ -146,8 +226,12 @@ static mgmt_ipc_err_e iscsid_connect(int *fd)
/* If iscsid isn't there, there's no sense
* in retrying. */
- if (errno == ECONNREFUSED)
- break;
+ if (errno == ECONNREFUSED) {
+ if (start_iscsid && nsec == 1)
+ iscsid_startup();
+ else
+ break;
+ }
/*
* Delay before trying again
@@ -159,11 +243,11 @@ static mgmt_ipc_err_e iscsid_connect(int *fd)
return MGMT_IPC_ERR_ISCSID_NOTCONN;
}
-mgmt_ipc_err_e iscsid_request(int *fd, iscsiadm_req_t *req)
+mgmt_ipc_err_e iscsid_request(int *fd, iscsiadm_req_t *req, int start_iscsid)
{
int err;
- err = iscsid_connect(fd);
+ err = iscsid_connect(fd, start_iscsid);
if (err)
return err;
@@ -193,12 +277,13 @@ mgmt_ipc_err_e iscsid_response(int fd, iscsiadm_cmd_e cmd, iscsiadm_rsp_t *rsp)
return iscsi_err;
}
-mgmt_ipc_err_e do_iscsid(iscsiadm_req_t *req, iscsiadm_rsp_t *rsp)
+mgmt_ipc_err_e do_iscsid(iscsiadm_req_t *req, iscsiadm_rsp_t *rsp,
+ int start_iscsid)
{
int fd;
mgmt_ipc_err_e err;
- err = iscsid_request(&fd, req);
+ err = iscsid_request(&fd, req, start_iscsid);
if (err)
return err;
@@ -221,7 +306,7 @@ int iscsid_req_by_rec_async(iscsiadm_cmd_e cmd, node_rec_t *rec, int *fd)
req.command = cmd;
memcpy(&req.u.session.rec, rec, sizeof(node_rec_t));
- return iscsid_request(fd, &req);
+ return iscsid_request(fd, &req, 1);
}
int iscsid_req_by_rec(iscsiadm_cmd_e cmd, node_rec_t *rec)
@@ -242,7 +327,7 @@ int iscsid_req_by_sid_async(iscsiadm_cmd_e cmd, int sid, int *fd)
req.command = cmd;
req.u.session.sid = sid;
- return iscsid_request(fd, &req);
+ return iscsid_request(fd, &req, 1);
}
int iscsid_req_by_sid(iscsiadm_cmd_e cmd, int sid)
diff --git a/usr/util.h b/usr/util.h
index b88fd65..1d94496 100644
--- a/usr/util.h
+++ b/usr/util.h
@@ -13,9 +13,11 @@ extern int oom_adjust(void);
extern void daemon_init(void);
extern int increase_max_files(void);
-extern int do_iscsid(struct iscsiadm_req *req, struct iscsiadm_rsp *rsp);
+extern int do_iscsid(struct iscsiadm_req *req, struct iscsiadm_rsp *rsp,
+ int iscsid_start);
extern void iscsid_handle_error(int err);
-extern int iscsid_request(int *fd, struct iscsiadm_req *req);
+extern int iscsid_request(int *fd, struct iscsiadm_req *req,
+ int iscsid_start);
extern int iscsid_response(int fd, int cmd, struct iscsiadm_rsp *rsp);
extern int iscsid_req_wait(int cmd, int fd);
extern int iscsid_req_by_rec_async(int cmd, struct node_rec *rec, int *fd);
@@ -31,4 +33,7 @@ extern int __iscsi_match_session(struct node_rec *rec, char *targetname,
char *address, int port,
struct iface_rec *iface);
+extern char *strstrip(char *s);
+extern char *get_global_string_param(char *pathname, const char *key);
+
#endif