Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Jan 2011 08:47:06 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r217926 - projects/graid/head/sys/geom/raid
Message-ID:  <201101270847.p0R8l6ld007178@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Thu Jan 27 08:47:06 2011
New Revision: 217926
URL: http://svn.freebsd.org/changeset/base/217926

Log:
  Fix submodules loading order. This makes taste sequence start only after
  all parts are in place and removes some dirty hacks initially used for that.

Modified:
  projects/graid/head/sys/geom/raid/g_raid.c
  projects/graid/head/sys/geom/raid/g_raid.h
  projects/graid/head/sys/geom/raid/tr_raid0.c
  projects/graid/head/sys/geom/raid/tr_raid1.c

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Thu Jan 27 08:42:50 2011	(r217925)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Thu Jan 27 08:47:06 2011	(r217926)
@@ -93,6 +93,7 @@ LIST_HEAD(, g_raid_volume) g_raid_volume
     LIST_HEAD_INITIALIZER(g_raid_volumes);
 
 //static eventhandler_tag g_raid_pre_sync = NULL;
+static int g_raid_started = 0;
 
 static int g_raid_destroy_geom(struct gctl_req *req, struct g_class *mp,
     struct g_geom *gp);
@@ -1991,9 +1992,6 @@ g_raid_shutdown_pre_sync(void *arg, int 
 }
 #endif
 
-extern struct g_raid_tr_class g_raid_tr_raid0_class;
-extern struct g_raid_tr_class g_raid_tr_raid1_class;
-
 static void
 g_raid_init(struct g_class *mp)
 {
@@ -2002,18 +2000,16 @@ g_raid_init(struct g_class *mp)
 //	    g_raid_shutdown_pre_sync, mp, SHUTDOWN_PRI_FIRST);
 //	if (g_raid_pre_sync == NULL)
 //		G_RAID_DEBUG(0, "Warning! Cannot register shutdown event.");
-	LIST_INSERT_HEAD(&g_raid_tr_classes, &g_raid_tr_raid1_class, trc_list);
-	LIST_INSERT_HEAD(&g_raid_tr_classes, &g_raid_tr_raid0_class, trc_list);
+	g_raid_started = 1;
 }
 
 static void
 g_raid_fini(struct g_class *mp)
 {
 
-	LIST_REMOVE(&g_raid_tr_raid0_class, trc_list);
-	LIST_REMOVE(&g_raid_tr_raid1_class, trc_list);
 //	if (g_raid_pre_sync != NULL)
 //		EVENTHANDLER_DEREGISTER(shutdown_pre_sync, g_raid_pre_sync);
+	g_raid_started = 0;
 }
 
 int
@@ -2035,7 +2031,8 @@ g_raid_md_modevent(module_t mod, int typ
 				c = nc;
 			LIST_INSERT_AFTER(c, class, mdc_list);
 		}
-		g_retaste(&g_raid_class);
+		if (g_raid_started)
+			g_retaste(&g_raid_class);
 		break;
 	case MOD_UNLOAD:
 		LIST_REMOVE(class, mdc_list);
@@ -2079,4 +2076,14 @@ g_raid_tr_modevent(module_t mod, int typ
 	return (error);
 }
 
-DECLARE_GEOM_CLASS(g_raid_class, g_raid);
+/*
+ * Use local implementation of DECLARE_GEOM_CLASS(g_raid_class, g_raid)
+ * to reduce module priority, allowing submodules to register them first.
+ */
+static moduledata_t g_raid_mod = {
+	"g_raid",
+	g_modevent,
+	&g_raid_class
+};
+DECLARE_MODULE(g_raid, g_raid_mod, SI_SUB_DRIVERS, SI_ORDER_THIRD);
+MODULE_VERSION(geom_raid, 0);

Modified: projects/graid/head/sys/geom/raid/g_raid.h
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.h	Thu Jan 27 08:42:50 2011	(r217925)
+++ projects/graid/head/sys/geom/raid/g_raid.h	Thu Jan 27 08:47:06 2011	(r217926)
@@ -285,7 +285,8 @@ int g_raid_md_modevent(module_t, int, vo
 	g_raid_md_modevent,					\
 	&name##_class						\
     };								\
-    DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_ANY)
+    DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_SECOND);	\
+    MODULE_DEPEND(name, geom_raid, 0, 0, 0)
 
 /*
  * KOBJ parent class of data transformation modules.
@@ -313,7 +314,8 @@ int g_raid_tr_modevent(module_t, int, vo
 	g_raid_tr_modevent,					\
 	&name##_class						\
     };								\
-    DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_ANY)
+    DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);	\
+    MODULE_DEPEND(name, geom_raid, 0, 0, 0)
 
 const char * g_raid_volume_level2str(int level, int qual);
 int g_raid_volume_str2level(const char *str, int *level, int *qual);

Modified: projects/graid/head/sys/geom/raid/tr_raid0.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid0.c	Thu Jan 27 08:42:50 2011	(r217925)
+++ projects/graid/head/sys/geom/raid/tr_raid0.c	Thu Jan 27 08:47:06 2011	(r217926)
@@ -69,7 +69,7 @@ static kobj_method_t g_raid_tr_raid0_met
 	{ 0, 0 }
 };
 
-struct g_raid_tr_class g_raid_tr_raid0_class = {
+static struct g_raid_tr_class g_raid_tr_raid0_class = {
 	"RAID0",
 	g_raid_tr_raid0_methods,
 	sizeof(struct g_raid_tr_raid0_object),
@@ -348,4 +348,4 @@ g_raid_tr_free_raid0(struct g_raid_tr_ob
 	return (0);
 }
 
-//G_RAID_TR_DECLARE(g_raid_tr_raid0);
+G_RAID_TR_DECLARE(g_raid_tr_raid0);

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Thu Jan 27 08:42:50 2011	(r217925)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Thu Jan 27 08:47:06 2011	(r217926)
@@ -97,7 +97,7 @@ static kobj_method_t g_raid_tr_raid1_met
 	{ 0, 0 }
 };
 
-struct g_raid_tr_class g_raid_tr_raid1_class = {
+static struct g_raid_tr_class g_raid_tr_raid1_class = {
 	"RAID1",
 	g_raid_tr_raid1_methods,
 	sizeof(struct g_raid_tr_raid1_object),
@@ -772,4 +772,4 @@ g_raid_tr_free_raid1(struct g_raid_tr_ob
 	return (0);
 }
 
-//G_RAID_TR_DECLARE(g_raid_tr_raid1);
+G_RAID_TR_DECLARE(g_raid_tr_raid1);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201101270847.p0R8l6ld007178>