In iscsid the initiator is kind of a singleton. So lets make use of this and remove the initiator argument from all function calls.
This compiles for me but I can't currently test this out. -- :wq Claudio Index: initiator.c =================================================================== RCS file: /cvs/src/usr.sbin/iscsid/initiator.c,v retrieving revision 1.15 diff -u -p -r1.15 initiator.c --- initiator.c 16 Jan 2015 15:57:06 -0000 1.15 +++ initiator.c 19 Jan 2021 13:09:31 -0000 @@ -33,7 +33,7 @@ #include "iscsid.h" #include "log.h" -struct initiator *initiator; +static struct initiator *initiator; struct task_login { struct task task; @@ -62,7 +62,7 @@ void initiator_logout_cb(struct connecti struct session_params initiator_sess_defaults; struct connection_params initiator_conn_defaults; -struct initiator * +void initiator_init(void) { if (!(initiator = calloc(1, sizeof(*initiator)))) @@ -78,24 +78,34 @@ initiator_init(void) initiator_conn_defaults = iscsi_conn_defaults; initiator_sess_defaults.MaxConnections = ISCSID_DEF_CONNS; initiator_conn_defaults.MaxRecvDataSegmentLength = 65536; - - return initiator; } void -initiator_cleanup(struct initiator *i) +initiator_cleanup(void) { struct session *s; - while ((s = TAILQ_FIRST(&i->sessions)) != NULL) { - TAILQ_REMOVE(&i->sessions, s, entry); + while ((s = TAILQ_FIRST(&initiator->sessions)) != NULL) { + TAILQ_REMOVE(&initiator->sessions, s, entry); session_cleanup(s); } free(initiator); } void -initiator_shutdown(struct initiator *i) +initiator_set_config(struct initiator_config *ic) +{ + initiator->config = *ic; +} + +struct initiator_config * +initiator_get_config(void) +{ + return &initiator->config; +} + +void +initiator_shutdown(void) { struct session *s; @@ -106,7 +116,7 @@ initiator_shutdown(struct initiator *i) } int -initiator_isdown(struct initiator *i) +initiator_isdown(void) { struct session *s; int inprogres = 0; @@ -119,6 +129,46 @@ initiator_isdown(struct initiator *i) } struct session * +initiator_new_session(u_int8_t st) +{ + struct session *s; + + if (!(s = calloc(1, sizeof(*s)))) + return NULL; + + /* use the same qualifier unless there is a conflict */ + s->isid_base = initiator->config.isid_base; + s->isid_qual = initiator->config.isid_qual; + s->cmdseqnum = arc4random(); + s->itt = arc4random(); + s->state = SESS_INIT; + + if (st == SESSION_TYPE_DISCOVERY) + s->target = 0; + else + s->target = initiator->target++; + + TAILQ_INIT(&s->connections); + TAILQ_INIT(&s->tasks); + + TAILQ_INSERT_HEAD(&initiator->sessions, s, entry); + + return s; +} + +struct session * +initiator_find_session(char *name) +{ + struct session *s; + + TAILQ_FOREACH(s, &initiator->sessions, entry) { + if (strcmp(s->config.SessionName, name) == 0) + return s; + } + return NULL; +} + +struct session * initiator_t2s(u_int target) { struct session *s; @@ -128,6 +178,12 @@ initiator_t2s(u_int target) return s; } return NULL; +} + +struct session_head * +initiator_get_sessions(void) +{ + return &initiator->sessions; } void Index: iscsid.c =================================================================== RCS file: /cvs/src/usr.sbin/iscsid/iscsid.c,v retrieving revision 1.20 diff -u -p -r1.20 iscsid.c --- iscsid.c 23 Jan 2017 08:40:07 -0000 1.20 +++ iscsid.c 19 Jan 2021 13:15:23 -0000 @@ -38,7 +38,6 @@ void main_sig_handler(int, short, void __dead void usage(void); void shutdown_cb(int, short, void *); -struct initiator *initiator; struct event exit_ev; int exit_rounds; #define ISCSI_EXIT_WAIT 5 @@ -146,13 +145,13 @@ main(int argc, char *argv[]) signal(SIGPIPE, SIG_IGN); control_event_init(); - initiator = initiator_init(); + initiator_init(); event_dispatch(); /* do some cleanup on the way out */ control_cleanup(ctrlsock); - initiator_cleanup(initiator); + initiator_cleanup(); log_info("exiting."); return 0; } @@ -162,7 +161,7 @@ shutdown_cb(int fd, short event, void *a { struct timeval tv; - if (exit_rounds++ >= ISCSI_EXIT_WAIT || initiator_isdown(initiator)) + if (exit_rounds++ >= ISCSI_EXIT_WAIT || initiator_isdown()) event_loopexit(NULL); timerclear(&tv); @@ -182,7 +181,7 @@ main_sig_handler(int sig, short event, v case SIGTERM: case SIGINT: case SIGHUP: - initiator_shutdown(initiator); + initiator_shutdown(); evtimer_set(&exit_ev, shutdown_cb, NULL); timerclear(&tv); if (evtimer_add(&exit_ev, &tv) == -1) @@ -209,6 +208,7 @@ iscsid_ctrl_dispatch(void *ch, struct pd { struct ctrlmsghdr *cmh; struct initiator_config *ic; + struct session_head *sh; struct session_config *sc; struct session *s; int *valp; @@ -225,7 +225,7 @@ iscsid_ctrl_dispatch(void *ch, struct pd break; } ic = pdu_getbuf(pdu, NULL, 1); - memcpy(&initiator->config, ic, sizeof(initiator->config)); + initiator_set_config(ic); control_compose(ch, CTRL_SUCCESS, NULL, 0); break; case CTRL_SESSION_CONFIG: @@ -247,9 +247,9 @@ iscsid_ctrl_dispatch(void *ch, struct pd else sc->InitiatorName = NULL; - s = session_find(initiator, sc->SessionName); + s = initiator_find_session(sc->SessionName); if (s == NULL) { - s = session_new(initiator, sc->SessionType); + s = initiator_new_session(sc->SessionType); if (s == NULL) { control_compose(ch, CTRL_FAILURE, NULL, 0); goto done; @@ -277,10 +277,11 @@ iscsid_ctrl_dispatch(void *ch, struct pd sizeof(struct vscsi_stats)); break; case CTRL_SHOW_SUM: - control_compose(ch, CTRL_INITIATOR_CONFIG, &initiator->config, - sizeof(initiator->config)); + ic = initiator_get_config(); + control_compose(ch, CTRL_INITIATOR_CONFIG, ic, sizeof(*ic)); - TAILQ_FOREACH(s, &initiator->sessions, entry) { + sh = initiator_get_sessions(); + TAILQ_FOREACH(s, sh, entry) { struct ctrldata cdv[3]; bzero(cdv, sizeof(cdv)); Index: iscsid.h =================================================================== RCS file: /cvs/src/usr.sbin/iscsid/iscsid.h,v retrieving revision 1.16 diff -u -p -r1.16 iscsid.h --- iscsid.h 2 Sep 2016 16:22:31 -0000 1.16 +++ iscsid.h 19 Jan 2021 13:14:49 -0000 @@ -313,11 +313,16 @@ void iscsi_merge_sess_params(struct sess void iscsi_merge_conn_params(struct connection_params *, struct connection_params *, struct connection_params *); -struct initiator *initiator_init(void); -void initiator_cleanup(struct initiator *); -void initiator_shutdown(struct initiator *); -int initiator_isdown(struct initiator *); -struct session *initiator_t2s(u_int); +void initiator_init(void); +void initiator_cleanup(void); +void initiator_set_config(struct initiator_config *); +struct initiator_config *initiator_get_config(void); +void initiator_shutdown(void); +int initiator_isdown(void); +struct session *initiator_new_session(u_int8_t); +struct session *initiator_find_session(char *); +struct session *initiator_t2s(u_int); +struct session_head *initiator_get_sessions(void); void initiator_login(struct connection *); void initiator_discovery(struct session *); void initiator_logout(struct session *, struct connection *, u_int8_t); @@ -331,8 +336,6 @@ void control_queue(void *, struct pdu *) int control_compose(void *, u_int16_t, void *, size_t); int control_build(void *, u_int16_t, int, struct ctrldata *); -struct session *session_find(struct initiator *, char *); -struct session *session_new(struct initiator *, u_int8_t); void session_cleanup(struct session *); int session_shutdown(struct session *); void session_config(struct session *, struct session_config *); Index: session.c =================================================================== RCS file: /cvs/src/usr.sbin/iscsid/session.c,v retrieving revision 1.8 diff -u -p -r1.8 session.c --- session.c 5 Dec 2015 06:37:24 -0000 1.8 +++ session.c 19 Jan 2021 12:51:33 -0000 @@ -47,46 +47,6 @@ int sess_do_reinstatement(struct session const char *sess_state(int); const char *sess_event(enum s_event); -struct session * -session_find(struct initiator *i, char *name) -{ - struct session *s; - - TAILQ_FOREACH(s, &i->sessions, entry) { - if (strcmp(s->config.SessionName, name) == 0) - return s; - } - return NULL; -} - -struct session * -session_new(struct initiator *i, u_int8_t st) -{ - struct session *s; - - if (!(s = calloc(1, sizeof(*s)))) - return NULL; - - /* use the same qualifier unless there is a conflict */ - s->isid_base = i->config.isid_base; - s->isid_qual = i->config.isid_qual; - s->cmdseqnum = arc4random(); - s->itt = arc4random(); - s->initiator = i; - s->state = SESS_INIT; - - if (st == SESSION_TYPE_DISCOVERY) - s->target = 0; - else - s->target = s->initiator->target++; - - TAILQ_INSERT_HEAD(&i->sessions, s, entry); - TAILQ_INIT(&s->connections); - TAILQ_INIT(&s->tasks); - - return s; -} - void session_cleanup(struct session *s) {