diff options
Diffstat (limited to 'usr')
-rw-r--r-- | usr/config.h | 1 | ||||
-rw-r--r-- | usr/idbm.c | 14 | ||||
-rw-r--r-- | usr/idbm.h | 1 | ||||
-rw-r--r-- | usr/idbm_fields.h | 1 | ||||
-rw-r--r-- | usr/initiator.c | 5 | ||||
-rw-r--r-- | usr/iscsi_settings.h | 3 | ||||
-rw-r--r-- | usr/iscsi_sysfs.c | 7 | ||||
-rw-r--r-- | usr/iscsi_sysfs.h | 2 | ||||
-rw-r--r-- | usr/iscsiadm.c | 2 | ||||
-rw-r--r-- | usr/iscsid.c | 2 | ||||
-rw-r--r-- | usr/iscsistart.c | 3 |
11 files changed, 33 insertions, 8 deletions
diff --git a/usr/config.h b/usr/config.h index 5b1bb1d..3bcb93f 100644 --- a/usr/config.h +++ b/usr/config.h @@ -190,6 +190,7 @@ typedef struct session_rec { int queue_depth; int initial_login_retry_max; int nr_sessions; + int scan; struct iscsi_auth_config auth; struct iscsi_session_timeout_config timeo; struct iscsi_error_timeout_config err_timeo; @@ -462,6 +462,9 @@ idbm_recinfo_node(node_rec_t *r, recinfo_t *ri) session.iscsi.MaxOutstandingR2T, IDBM_SHOW, num, 1); __recinfo_int(SESSION_ERL, ri, r, session.iscsi.ERL, IDBM_SHOW, num, 1); + __recinfo_int_o2(SESSION_SCAN, ri, r, + session.scan, IDBM_SHOW, "manual", "auto", + num, 1); for (i = 0; i < ISCSI_CONN_MAX; i++) { char key[NAME_MAXVAL]; @@ -2492,7 +2495,7 @@ static void idbm_rm_disc_node_links(char *disc_dir) log_debug(5, "disc removal removing link %s %s %s %s", target, address, port, iface_id); - memset(rec, 0, sizeof(*rec)); + memset(rec, 0, sizeof(*rec)); strlcpy(rec->name, target, TARGET_NAME_MAXLEN); rec->tpgt = atoi(tpgt); rec->conn[0].port = atoi(port); @@ -2728,6 +2731,14 @@ idbm_slp_defaults(struct iscsi_slp_config *cfg) sizeof(struct iscsi_slp_config)); } +int +idbm_session_autoscan(struct iscsi_session *session) +{ + if (session) + return session->nrec.session.scan; + return db->nrec.session.scan; +} + struct user_param *idbm_alloc_user_param(char *name, char *value) { struct user_param *param; @@ -2983,6 +2994,7 @@ void idbm_node_setup_defaults(node_rec_t *rec) rec->session.info = NULL; rec->session.sid = 0; rec->session.multiple = 0; + rec->session.scan = DEF_INITIAL_SCAN; idbm_setup_session_defaults(&rec->session.iscsi); for (i=0; i<ISCSI_CONN_MAX; i++) { @@ -140,6 +140,7 @@ extern int idbm_add_discovery(discovery_rec_t *newrec); extern void idbm_sendtargets_defaults(struct iscsi_sendtargets_config *cfg); extern void idbm_isns_defaults(struct iscsi_isns_config *cfg); extern void idbm_slp_defaults(struct iscsi_slp_config *cfg); +extern int idbm_session_autoscan(struct iscsi_session *session); extern int idbm_discovery_read(discovery_rec_t *rec, int type, char *addr, int port); extern int idbm_rec_read(node_rec_t *out_rec, char *target_name, diff --git a/usr/idbm_fields.h b/usr/idbm_fields.h index 5790a03..4a92758 100644 --- a/usr/idbm_fields.h +++ b/usr/idbm_fields.h @@ -45,6 +45,7 @@ #define SESSION_MAX_CONNS "node.session.iscsi.MaxConnections" #define SESSION_MAX_R2T "node.session.iscsi.MaxOutstandingR2T" #define SESSION_ERL "node.session.iscsi.ERL" +#define SESSION_SCAN "node.session.scan" /* connections fields */ #define CONN_ADDR "node.conn[%d].address" diff --git a/usr/initiator.c b/usr/initiator.c index ed174b5..a86d1e6 100644 --- a/usr/initiator.c +++ b/usr/initiator.c @@ -997,7 +997,7 @@ static void session_scan_host(struct iscsi_session *session, int hostno, { pid_t pid; - pid = iscsi_sysfs_scan_host(hostno, 1); + pid = iscsi_sysfs_scan_host(hostno, 1, idbm_session_autoscan(session)); if (pid == 0) { mgmt_ipc_write_rsp(qtask, ISCSI_SUCCESS); @@ -1201,7 +1201,8 @@ static void iscsi_recv_async_msg(iscsi_conn_t *conn, struct iscsi_hdr *hdr) break; } - if (sshdr.asc == 0x3f && sshdr.ascq == 0x0e) + if (sshdr.asc == 0x3f && sshdr.ascq == 0x0e + && idbm_session_autoscan(session)) session_scan_host(session, session->hostno, NULL); break; case ISCSI_ASYNC_MSG_REQUEST_LOGOUT: diff --git a/usr/iscsi_settings.h b/usr/iscsi_settings.h index 3d923c8..296ff40 100644 --- a/usr/iscsi_settings.h +++ b/usr/iscsi_settings.h @@ -45,3 +45,6 @@ /* login retries */ #define DEF_INITIAL_LOGIN_RETRIES_MAX 4 + +/* autoscan enabled */ +#define DEF_INITIAL_SCAN 1 diff --git a/usr/iscsi_sysfs.c b/usr/iscsi_sysfs.c index 8ca668f..2f94b63 100644 --- a/usr/iscsi_sysfs.c +++ b/usr/iscsi_sysfs.c @@ -1883,12 +1883,15 @@ void iscsi_sysfs_rescan_device(void *data, int hostno, int target, int lun) strlen(write_buf)); } -pid_t iscsi_sysfs_scan_host(int hostno, int async) +pid_t iscsi_sysfs_scan_host(int hostno, int async, int full_scan) { char id[NAME_SIZE]; - char *write_buf = "- - -"; + char write_buf[6] = "- - 0"; pid_t pid = 0; + if (full_scan) + write_buf[4] = '-'; + if (async) pid = fork(); if (pid == 0) { diff --git a/usr/iscsi_sysfs.h b/usr/iscsi_sysfs.h index 9a56105..3492ce6 100644 --- a/usr/iscsi_sysfs.h +++ b/usr/iscsi_sysfs.h @@ -87,7 +87,7 @@ extern void iscsi_sysfs_get_negotiated_session_conf(int sid, struct iscsi_session_operational_config *conf); extern void iscsi_sysfs_get_negotiated_conn_conf(int sid, struct iscsi_conn_operational_config *conf); -extern pid_t iscsi_sysfs_scan_host(int hostno, int async); +extern pid_t iscsi_sysfs_scan_host(int hostno, int async, int full); extern int iscsi_sysfs_get_session_state(char *state, int sid); extern int iscsi_sysfs_get_host_state(char *state, int host_no); extern int iscsi_sysfs_get_device_state(char *state, int host_no, int target, diff --git a/usr/iscsiadm.c b/usr/iscsiadm.c index 5818596..6c27f3e 100644 --- a/usr/iscsiadm.c +++ b/usr/iscsiadm.c @@ -773,7 +773,7 @@ static int rescan_portal(void *data, struct session_info *info) iscsi_sysfs_for_each_device(NULL, host_no, info->sid, iscsi_sysfs_rescan_device); /* now scan for new devices */ - iscsi_sysfs_scan_host(host_no, 0); + iscsi_sysfs_scan_host(host_no, 0, 1); return 0; } diff --git a/usr/iscsid.c b/usr/iscsid.c index 81a14f2..813eb3d 100644 --- a/usr/iscsid.c +++ b/usr/iscsid.c @@ -216,7 +216,7 @@ static int sync_session(void *data, struct session_info *info) iscsi_err_to_str(err)); return 0; } - iscsi_sysfs_scan_host(host_no, 0); + iscsi_sysfs_scan_host(host_no, 0, idbm_session_autoscan(NULL)); return 0; } diff --git a/usr/iscsistart.c b/usr/iscsistart.c index 5cf0972..67ac475 100644 --- a/usr/iscsistart.c +++ b/usr/iscsistart.c @@ -140,6 +140,7 @@ static int apply_params(struct node_rec *rec) rec->session.initial_login_retry_max = -1; rec->conn[0].timeo.noop_out_interval = -1; rec->conn[0].timeo.noop_out_timeout = -1; + rec->session.scan = -1; list_for_each_entry(param, &user_params, list) { /* @@ -183,6 +184,8 @@ static int apply_params(struct node_rec *rec) rec->conn[0].timeo.noop_out_interval = 0; if (rec->conn[0].timeo.noop_out_timeout == -1) rec->conn[0].timeo.noop_out_timeout = 0; + if (rec->session.scan == -1) + rec->session.scan = DEF_INITIAL_SCAN; return 0; } |