On Tue, Jan 19, 2021 at 02:22:14PM +0100, Claudio Jeker wrote:
> 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.
Updated version for -current.
--
: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.21
diff -u -p -r1.21 iscsid.c
--- iscsid.c 27 Jan 2021 07:21:54 -0000 1.21
+++ iscsid.c 27 Jan 2021 15:35:36 -0000
@@ -38,7 +38,6 @@ void main_sig_handler(int, short, void
__dead void usage(void);
void shutdown_cb(int, short, void *);
-extern 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)
{