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

Reply via email to