Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 13 Sep 2012 13:27:09 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r240465 - in head: sbin/geom/class/raid sys/geom/raid
Message-ID:  <201209131327.q8DDR9xQ006428@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Thu Sep 13 13:27:09 2012
New Revision: 240465
URL: http://svn.freebsd.org/changeset/base/240465

Log:
  Add global and per-module sysctls/tunables to enable/disable metadata taste.
  That should help to handle some cases when disk has some RAID metadata that
  should be ignored, especially during boot.
  
  MFC after:	3 days

Modified:
  head/sbin/geom/class/raid/graid.8
  head/sys/geom/raid/g_raid.c
  head/sys/geom/raid/g_raid.h
  head/sys/geom/raid/md_ddf.c
  head/sys/geom/raid/md_intel.c
  head/sys/geom/raid/md_jmicron.c
  head/sys/geom/raid/md_nvidia.c
  head/sys/geom/raid/md_promise.c
  head/sys/geom/raid/md_sii.c
  head/sys/geom/raid/tr_concat.c
  head/sys/geom/raid/tr_raid0.c
  head/sys/geom/raid/tr_raid1.c
  head/sys/geom/raid/tr_raid1e.c
  head/sys/geom/raid/tr_raid5.c

Modified: head/sbin/geom/class/raid/graid.8
==============================================================================
--- head/sbin/geom/class/raid/graid.8	Thu Sep 13 13:05:45 2012	(r240464)
+++ head/sbin/geom/class/raid/graid.8	Thu Sep 13 13:27:09 2012	(r240465)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd May 6, 2012
+.Dd September 13, 2012
 .Dt GRAID 8
 .Os
 .Sh NAME
@@ -293,6 +293,8 @@ Mark volume as clean when idle for the s
 Debug level of the
 .Nm RAID
 GEOM class.
+.It Va kern.geom.raid.enable : No 1
+Enable on-disk metadata taste.
 .It Va kern.geom.raid.idle_threshold : No 1000000
 Time in microseconds to consider a volume idle for rebuild purposes.
 .It Va kern.geom.raid.name_format : No 0
@@ -302,6 +304,8 @@ Number of read errors equated to disk fa
 Write errors are always considered as disk failures.
 .It Va kern.geom.raid.start_timeout : No 30
 Time to wait for missing array components on startup.
+.It Va kern.geom.raid. Ns Ar X Ns Va .enable : No 1
+Enable taste for specific metadata or transformation module.
 .El
 .Sh EXIT STATUS
 Exit status is 0 on success, and non-zero if the command fails.

Modified: head/sys/geom/raid/g_raid.c
==============================================================================
--- head/sys/geom/raid/g_raid.c	Thu Sep 13 13:05:45 2012	(r240464)
+++ head/sys/geom/raid/g_raid.c	Thu Sep 13 13:27:09 2012	(r240465)
@@ -52,6 +52,10 @@ static MALLOC_DEFINE(M_RAID, "raid_data"
 
 SYSCTL_DECL(_kern_geom);
 SYSCTL_NODE(_kern_geom, OID_AUTO, raid, CTLFLAG_RW, 0, "GEOM_RAID stuff");
+int g_raid_enable = 1;
+TUNABLE_INT("kern.geom.raid.enable", &g_raid_enable);
+SYSCTL_INT(_kern_geom_raid, OID_AUTO, enable, CTLFLAG_RW,
+    &g_raid_enable, 0, "Enable on-disk metadata taste");
 u_int g_raid_aggressive_spare = 0;
 TUNABLE_INT("kern.geom.raid.aggressive_spare", &g_raid_aggressive_spare);
 SYSCTL_UINT(_kern_geom_raid, OID_AUTO, aggressive_spare, CTLFLAG_RW,
@@ -1922,6 +1926,8 @@ int g_raid_start_volume(struct g_raid_vo
 
 	G_RAID_DEBUG1(2, vol->v_softc, "Starting volume %s.", vol->v_name);
 	LIST_FOREACH(class, &g_raid_tr_classes, trc_list) {
+		if (!class->trc_enable)
+			continue;
 		G_RAID_DEBUG1(2, vol->v_softc,
 		    "Tasting volume %s for %s transformation.",
 		    vol->v_name, class->name);
@@ -2144,6 +2150,8 @@ g_raid_taste(struct g_class *mp, struct 
 
 	g_topology_assert();
 	g_trace(G_T_TOPOLOGY, "%s(%s, %s)", __func__, mp->name, pp->name);
+	if (!g_raid_enable)
+		return (NULL);
 	G_RAID_DEBUG(2, "Tasting provider %s.", pp->name);
 
 	gp = g_new_geomf(mp, "raid:taste");
@@ -2156,6 +2164,8 @@ g_raid_taste(struct g_class *mp, struct 
 
 	geom = NULL;
 	LIST_FOREACH(class, &g_raid_md_classes, mdc_list) {
+		if (!class->mdc_enable)
+			continue;
 		G_RAID_DEBUG(2, "Tasting provider %s for %s metadata.",
 		    pp->name, class->name);
 		obj = (void *)kobj_create((kobj_class_t)class, M_RAID,

Modified: head/sys/geom/raid/g_raid.h
==============================================================================
--- head/sys/geom/raid/g_raid.h	Thu Sep 13 13:05:45 2012	(r240464)
+++ head/sys/geom/raid/g_raid.h	Thu Sep 13 13:27:09 2012	(r240465)
@@ -33,6 +33,9 @@
 #include <sys/kobj.h>
 #include <sys/bio.h>
 #include <sys/time.h>
+#ifdef _KERNEL
+#include <sys/sysctl.h>
+#endif
 
 #define	G_RAID_CLASS_NAME	"RAID"
 
@@ -51,6 +54,7 @@ struct g_raid_tr_object;
 #ifdef _KERNEL
 extern u_int g_raid_aggressive_spare;
 extern u_int g_raid_debug;
+extern int g_raid_enable;
 extern int g_raid_read_err_thresh;
 extern u_int g_raid_start_timeout;
 extern struct g_class g_raid_class;
@@ -322,11 +326,14 @@ struct g_raid_softc {
 };
 #define	sc_name	sc_geom->name
 
+SYSCTL_DECL(_kern_geom_raid);
+
 /*
  * KOBJ parent class of metadata processing modules.
  */
 struct g_raid_md_class {
 	KOBJ_CLASS_FIELDS;
+	int		 mdc_enable;
 	int		 mdc_priority;
 	LIST_ENTRY(g_raid_md_class) mdc_list;
 };
@@ -342,20 +349,29 @@ struct g_raid_md_object {
 
 int g_raid_md_modevent(module_t, int, void *);
 
-#define	G_RAID_MD_DECLARE(name)					\
-    static moduledata_t name##_mod = {				\
-	#name,							\
+#define	G_RAID_MD_DECLARE(name, label)				\
+    static moduledata_t g_raid_md_##name##_mod = {		\
+	"g_raid_md_" __XSTRING(name),				\
 	g_raid_md_modevent,					\
-	&name##_class						\
+	&g_raid_md_##name##_class				\
     };								\
-    DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_SECOND);	\
-    MODULE_DEPEND(name, geom_raid, 0, 0, 0)
+    DECLARE_MODULE(g_raid_md_##name, g_raid_md_##name##_mod,	\
+	SI_SUB_DRIVERS, SI_ORDER_SECOND);			\
+    MODULE_DEPEND(g_raid_md_##name, geom_raid, 0, 0, 0);	\
+    SYSCTL_NODE(_kern_geom_raid, OID_AUTO, name, CTLFLAG_RD,	\
+	NULL, label " metadata module");			\
+    SYSCTL_INT(_kern_geom_raid_##name, OID_AUTO, enable,	\
+	CTLFLAG_RW, &g_raid_md_##name##_class.mdc_enable, 0,	\
+	"Enable " label " metadata format taste");		\
+    TUNABLE_INT("kern.geom.raid." __XSTRING(name) ".enable",	\
+	&g_raid_md_##name##_class.mdc_enable)
 
 /*
  * KOBJ parent class of data transformation modules.
  */
 struct g_raid_tr_class {
 	KOBJ_CLASS_FIELDS;
+	int		 trc_enable;
 	int		 trc_priority;
 	LIST_ENTRY(g_raid_tr_class) trc_list;
 };
@@ -371,14 +387,22 @@ struct g_raid_tr_object {
 
 int g_raid_tr_modevent(module_t, int, void *);
 
-#define	G_RAID_TR_DECLARE(name)					\
-    static moduledata_t name##_mod = {				\
-	#name,							\
+#define	G_RAID_TR_DECLARE(name, label)				\
+    static moduledata_t g_raid_tr_##name##_mod = {		\
+	"g_raid_tr_" __XSTRING(name),				\
 	g_raid_tr_modevent,					\
-	&name##_class						\
+	&g_raid_tr_##name##_class				\
     };								\
-    DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);	\
-    MODULE_DEPEND(name, geom_raid, 0, 0, 0)
+    DECLARE_MODULE(g_raid_tr_##name, g_raid_tr_##name##_mod,	\
+	SI_SUB_DRIVERS, SI_ORDER_FIRST);			\
+    MODULE_DEPEND(g_raid_tr_##name, geom_raid, 0, 0, 0);	\
+    SYSCTL_NODE(_kern_geom_raid, OID_AUTO, name, CTLFLAG_RD,	\
+	NULL, label " transformation module");			\
+    SYSCTL_INT(_kern_geom_raid_##name, OID_AUTO, enable,	\
+	CTLFLAG_RW, &g_raid_tr_##name##_class.trc_enable, 0,	\
+	"Enable " label " transformation module taste");	\
+    TUNABLE_INT("kern.geom.raid." __XSTRING(name) ".enable",	\
+	&g_raid_tr_##name##_class.trc_enable)
 
 const char * g_raid_volume_level2str(int level, int qual);
 int g_raid_volume_str2level(const char *str, int *level, int *qual);

Modified: head/sys/geom/raid/md_ddf.c
==============================================================================
--- head/sys/geom/raid/md_ddf.c	Thu Sep 13 13:05:45 2012	(r240464)
+++ head/sys/geom/raid/md_ddf.c	Thu Sep 13 13:27:09 2012	(r240465)
@@ -125,6 +125,7 @@ static struct g_raid_md_class g_raid_md_
 	"DDF",
 	g_raid_md_ddf_methods,
 	sizeof(struct g_raid_md_ddf_object),
+	.mdc_enable = 1,
 	.mdc_priority = 100
 };
 
@@ -3065,4 +3066,4 @@ g_raid_md_free_ddf(struct g_raid_md_obje
 	return (0);
 }
 
-G_RAID_MD_DECLARE(g_raid_md_ddf);
+G_RAID_MD_DECLARE(ddf, "DDF");

Modified: head/sys/geom/raid/md_intel.c
==============================================================================
--- head/sys/geom/raid/md_intel.c	Thu Sep 13 13:05:45 2012	(r240464)
+++ head/sys/geom/raid/md_intel.c	Thu Sep 13 13:27:09 2012	(r240465)
@@ -224,6 +224,7 @@ static struct g_raid_md_class g_raid_md_
 	"Intel",
 	g_raid_md_intel_methods,
 	sizeof(struct g_raid_md_intel_object),
+	.mdc_enable = 1,
 	.mdc_priority = 100
 };
 
@@ -2432,4 +2433,4 @@ g_raid_md_free_intel(struct g_raid_md_ob
 	return (0);
 }
 
-G_RAID_MD_DECLARE(g_raid_md_intel);
+G_RAID_MD_DECLARE(intel, "Intel");

Modified: head/sys/geom/raid/md_jmicron.c
==============================================================================
--- head/sys/geom/raid/md_jmicron.c	Thu Sep 13 13:05:45 2012	(r240464)
+++ head/sys/geom/raid/md_jmicron.c	Thu Sep 13 13:27:09 2012	(r240465)
@@ -132,6 +132,7 @@ static struct g_raid_md_class g_raid_md_
 	"JMicron",
 	g_raid_md_jmicron_methods,
 	sizeof(struct g_raid_md_jmicron_object),
+	.mdc_enable = 1,
 	.mdc_priority = 100
 };
 
@@ -1581,4 +1582,4 @@ g_raid_md_free_jmicron(struct g_raid_md_
 	return (0);
 }
 
-G_RAID_MD_DECLARE(g_raid_md_jmicron);
+G_RAID_MD_DECLARE(jmicron, "JMicron");

Modified: head/sys/geom/raid/md_nvidia.c
==============================================================================
--- head/sys/geom/raid/md_nvidia.c	Thu Sep 13 13:05:45 2012	(r240464)
+++ head/sys/geom/raid/md_nvidia.c	Thu Sep 13 13:27:09 2012	(r240465)
@@ -143,6 +143,7 @@ static struct g_raid_md_class g_raid_md_
 	"NVIDIA",
 	g_raid_md_nvidia_methods,
 	sizeof(struct g_raid_md_nvidia_object),
+	.mdc_enable = 1,
 	.mdc_priority = 100
 };
 
@@ -1600,4 +1601,4 @@ g_raid_md_free_nvidia(struct g_raid_md_o
 	return (0);
 }
 
-G_RAID_MD_DECLARE(g_raid_md_nvidia);
+G_RAID_MD_DECLARE(nvidia, "NVIDIA");

Modified: head/sys/geom/raid/md_promise.c
==============================================================================
--- head/sys/geom/raid/md_promise.c	Thu Sep 13 13:05:45 2012	(r240464)
+++ head/sys/geom/raid/md_promise.c	Thu Sep 13 13:27:09 2012	(r240465)
@@ -171,6 +171,7 @@ static struct g_raid_md_class g_raid_md_
 	"Promise",
 	g_raid_md_promise_methods,
 	sizeof(struct g_raid_md_object),
+	.mdc_enable = 1,
 	.mdc_priority = 100
 };
 
@@ -1967,4 +1968,4 @@ g_raid_md_free_promise(struct g_raid_md_
 	return (0);
 }
 
-G_RAID_MD_DECLARE(g_raid_md_promise);
+G_RAID_MD_DECLARE(promise, "Promise");

Modified: head/sys/geom/raid/md_sii.c
==============================================================================
--- head/sys/geom/raid/md_sii.c	Thu Sep 13 13:05:45 2012	(r240464)
+++ head/sys/geom/raid/md_sii.c	Thu Sep 13 13:27:09 2012	(r240465)
@@ -140,6 +140,7 @@ static struct g_raid_md_class g_raid_md_
 	"SiI",
 	g_raid_md_sii_methods,
 	sizeof(struct g_raid_md_sii_object),
+	.mdc_enable = 1,
 	.mdc_priority = 100
 };
 
@@ -1688,4 +1689,4 @@ g_raid_md_free_sii(struct g_raid_md_obje
 	return (0);
 }
 
-G_RAID_MD_DECLARE(g_raid_md_sii);
+G_RAID_MD_DECLARE(sii, "SiI");

Modified: head/sys/geom/raid/tr_concat.c
==============================================================================
--- head/sys/geom/raid/tr_concat.c	Thu Sep 13 13:05:45 2012	(r240464)
+++ head/sys/geom/raid/tr_concat.c	Thu Sep 13 13:27:09 2012	(r240465)
@@ -73,6 +73,7 @@ static struct g_raid_tr_class g_raid_tr_
 	"CONCAT",
 	g_raid_tr_concat_methods,
 	sizeof(struct g_raid_tr_concat_object),
+	.trc_enable = 1,
 	.trc_priority = 50
 };
 
@@ -340,4 +341,4 @@ g_raid_tr_free_concat(struct g_raid_tr_o
 	return (0);
 }
 
-G_RAID_TR_DECLARE(g_raid_tr_concat);
+G_RAID_TR_DECLARE(concat, "CONCAT");

Modified: head/sys/geom/raid/tr_raid0.c
==============================================================================
--- head/sys/geom/raid/tr_raid0.c	Thu Sep 13 13:05:45 2012	(r240464)
+++ head/sys/geom/raid/tr_raid0.c	Thu Sep 13 13:27:09 2012	(r240465)
@@ -73,6 +73,7 @@ static struct g_raid_tr_class g_raid_tr_
 	"RAID0",
 	g_raid_tr_raid0_methods,
 	sizeof(struct g_raid_tr_raid0_object),
+	.trc_enable = 1,
 	.trc_priority = 100
 };
 
@@ -323,4 +324,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(raid0, "RAID0");

Modified: head/sys/geom/raid/tr_raid1.c
==============================================================================
--- head/sys/geom/raid/tr_raid1.c	Thu Sep 13 13:05:45 2012	(r240464)
+++ head/sys/geom/raid/tr_raid1.c	Thu Sep 13 13:27:09 2012	(r240465)
@@ -42,9 +42,7 @@ __FBSDID("$FreeBSD$");
 #include "geom/raid/g_raid.h"
 #include "g_raid_tr_if.h"
 
-SYSCTL_DECL(_kern_geom_raid);
-static SYSCTL_NODE(_kern_geom_raid, OID_AUTO, raid1, CTLFLAG_RW, 0,
-    "RAID1 parameters");
+SYSCTL_DECL(_kern_geom_raid_raid1);
 
 #define RAID1_REBUILD_SLAB	(1 << 20) /* One transation in a rebuild */
 static int g_raid1_rebuild_slab = RAID1_REBUILD_SLAB;
@@ -131,6 +129,7 @@ static struct g_raid_tr_class g_raid_tr_
 	"RAID1",
 	g_raid_tr_raid1_methods,
 	sizeof(struct g_raid_tr_raid1_object),
+	.trc_enable = 1,
 	.trc_priority = 100
 };
 
@@ -996,4 +995,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(raid1, "RAID1");

Modified: head/sys/geom/raid/tr_raid1e.c
==============================================================================
--- head/sys/geom/raid/tr_raid1e.c	Thu Sep 13 13:05:45 2012	(r240464)
+++ head/sys/geom/raid/tr_raid1e.c	Thu Sep 13 13:27:09 2012	(r240465)
@@ -44,9 +44,7 @@ __FBSDID("$FreeBSD$");
 
 #define N	2
 
-SYSCTL_DECL(_kern_geom_raid);
-static SYSCTL_NODE(_kern_geom_raid, OID_AUTO, raid1e, CTLFLAG_RW, 0,
-    "RAID1E parameters");
+SYSCTL_DECL(_kern_geom_raid_raid1e);
 
 #define RAID1E_REBUILD_SLAB	(1 << 20) /* One transation in a rebuild */
 static int g_raid1e_rebuild_slab = RAID1E_REBUILD_SLAB;
@@ -135,6 +133,7 @@ static struct g_raid_tr_class g_raid_tr_
 	"RAID1E",
 	g_raid_tr_raid1e_methods,
 	sizeof(struct g_raid_tr_raid1e_object),
+	.trc_enable = 1,
 	.trc_priority = 200
 };
 
@@ -1236,4 +1235,4 @@ g_raid_tr_free_raid1e(struct g_raid_tr_o
 	return (0);
 }
 
-G_RAID_TR_DECLARE(g_raid_tr_raid1e);
+G_RAID_TR_DECLARE(raid1e, "RAID1E");

Modified: head/sys/geom/raid/tr_raid5.c
==============================================================================
--- head/sys/geom/raid/tr_raid5.c	Thu Sep 13 13:05:45 2012	(r240464)
+++ head/sys/geom/raid/tr_raid5.c	Thu Sep 13 13:27:09 2012	(r240465)
@@ -42,8 +42,6 @@ __FBSDID("$FreeBSD$");
 #include "geom/raid/g_raid.h"
 #include "g_raid_tr_if.h"
 
-SYSCTL_DECL(_kern_geom_raid);
-
 static MALLOC_DEFINE(M_TR_RAID5, "tr_raid5_data", "GEOM_RAID RAID5 data");
 
 #define TR_RAID5_NONE 0
@@ -95,6 +93,7 @@ static struct g_raid_tr_class g_raid_tr_
 	"RAID5",
 	g_raid_tr_raid5_methods,
 	sizeof(struct g_raid_tr_raid5_object),
+	.trc_enable = 1,
 	.trc_priority = 100
 };
 
@@ -419,4 +418,4 @@ g_raid_tr_free_raid5(struct g_raid_tr_ob
 	return (0);
 }
 
-G_RAID_TR_DECLARE(g_raid_tr_raid5);
+G_RAID_TR_DECLARE(raid5, "RAID5");



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