]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/spdk/lib/sock/net_framework.c
import 15.2.0 Octopus source
[ceph.git] / ceph / src / spdk / lib / sock / net_framework.c
index 5d5a568fbb7dca1e13275dadbddc867b57852c13..0a205c511b66e826fc7cdc00a5b84af508bab569 100644 (file)
 static STAILQ_HEAD(, spdk_net_framework) g_net_frameworks =
        STAILQ_HEAD_INITIALIZER(g_net_frameworks);
 
-int spdk_net_framework_start(void)
+static spdk_net_init_cb g_init_cb_fn = NULL;
+static void *g_init_cb_arg = NULL;
+
+static spdk_net_fini_cb g_fini_cb_fn = NULL;
+static void *g_fini_cb_arg = NULL;
+
+struct spdk_net_framework *g_next_net_framework = NULL;
+
+void
+spdk_net_framework_init_next(int rc)
 {
-       struct spdk_net_framework *net_framework = NULL;
-       int rc;
-
-       STAILQ_FOREACH_FROM(net_framework, &g_net_frameworks, link) {
-               rc = net_framework->init();
-               if (rc != 0) {
-                       SPDK_ERRLOG("Net framework %s failed to initalize\n", net_framework->name);
-                       return rc;
-               }
+       if (rc) {
+               SPDK_ERRLOG("Net framework %s failed to initalize with error %d\n", g_next_net_framework->name, rc);
+               g_init_cb_fn(g_init_cb_arg, rc);
+               return;
+       }
+
+       if (g_next_net_framework == NULL) {
+               g_next_net_framework = STAILQ_FIRST(&g_net_frameworks);
+       } else {
+               g_next_net_framework = STAILQ_NEXT(g_next_net_framework, link);
        }
 
-       return 0;
+       if (g_next_net_framework == NULL) {
+               g_init_cb_fn(g_init_cb_arg, 0);
+               return;
+       }
+
+       g_next_net_framework->init();
 }
 
-void spdk_net_framework_fini(void)
+void
+spdk_net_framework_start(spdk_net_init_cb cb_fn, void *cb_arg)
 {
-       struct spdk_net_framework *net_framework = NULL;
+       g_init_cb_fn = cb_fn;
+       g_init_cb_arg = cb_arg;
+
+       spdk_net_framework_init_next(0);
+}
 
-       STAILQ_FOREACH_FROM(net_framework, &g_net_frameworks, link) {
-               net_framework->fini();
+void
+spdk_net_framework_fini_next(void)
+{
+       if (g_next_net_framework == NULL) {
+               g_next_net_framework = STAILQ_FIRST(&g_net_frameworks);
+       } else {
+               g_next_net_framework = STAILQ_NEXT(g_next_net_framework, link);
        }
+
+       if (g_next_net_framework == NULL) {
+               g_fini_cb_fn(g_fini_cb_arg);
+               return;
+       }
+
+       g_next_net_framework->fini();
+}
+
+void
+spdk_net_framework_fini(spdk_net_fini_cb cb_fn, void *cb_arg)
+{
+       g_fini_cb_fn = cb_fn;
+       g_fini_cb_arg = cb_arg;
+
+       spdk_net_framework_fini_next();
 }
 
 void