svn commit: r217926 - projects/graid/head/sys/geom/raid
Alexander Motin
mav at FreeBSD.org
Thu Jan 27 08:47:06 UTC 2011
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);
More information about the svn-src-projects
mailing list