svn commit: r217462 - projects/graid/head/sys/geom/raid

Alexander Motin mav at FreeBSD.org
Sat Jan 15 21:24:39 UTC 2011


Author: mav
Date: Sat Jan 15 21:24:39 2011
New Revision: 217462
URL: http://svn.freebsd.org/changeset/base/217462

Log:
  Change list of subdisk states to: NONE, NEW, STALE, REBUILD, RESYNC, ACTIVE.
  Implement reading of these subdisk states from Intel metadata.
  Let RAID0 to shift any present disk state to ACTIVE, as there is no rebuild.
  Make RAID1 to not overwrite state on NEW event to let it be used later.

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/md_intel.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	Sat Jan 15 21:09:00 2011	(r217461)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Sat Jan 15 21:24:39 2011	(r217462)
@@ -156,12 +156,14 @@ g_raid_subdisk_state2str(int state)
 		return ("NONE");
 	case G_RAID_SUBDISK_S_NEW:
 		return ("NEW");
-	case G_RAID_SUBDISK_S_ACTIVE:
-		return ("ACTIVE");
 	case G_RAID_SUBDISK_S_STALE:
 		return ("STALE");
-	case G_RAID_SUBDISK_S_SYNCHRONIZING:
-		return ("SYNCHRONIZING");
+	case G_RAID_SUBDISK_S_REBUILD:
+		return ("REBUILD");
+	case G_RAID_SUBDISK_S_RESYNC:
+		return ("RESYNC");
+	case G_RAID_SUBDISK_S_ACTIVE:
+		return ("ACTIVE");
 	default:
 		return ("INVALID");
 	}

Modified: projects/graid/head/sys/geom/raid/g_raid.h
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.h	Sat Jan 15 21:09:00 2011	(r217461)
+++ projects/graid/head/sys/geom/raid/g_raid.h	Sat Jan 15 21:24:39 2011	(r217462)
@@ -119,11 +119,12 @@ struct g_raid_disk {
 	TAILQ_ENTRY(g_raid_disk)	 d_next;	/* Next disk in the node. */
 };
 
-#define G_RAID_SUBDISK_S_NONE		0x00
-#define G_RAID_SUBDISK_S_NEW		0x01
-#define G_RAID_SUBDISK_S_ACTIVE		0x02
-#define G_RAID_SUBDISK_S_STALE		0x03
-#define G_RAID_SUBDISK_S_SYNCHRONIZING	0x04
+#define G_RAID_SUBDISK_S_NONE		0x00	/* Absent. */
+#define G_RAID_SUBDISK_S_NEW		0x01	/* Blank. */
+#define G_RAID_SUBDISK_S_STALE		0x02	/* Dirty. */
+#define G_RAID_SUBDISK_S_REBUILD	0x03	/* Blank + rebuild. */
+#define G_RAID_SUBDISK_S_RESYNC		0x04	/* Dirty + check/repair. */
+#define G_RAID_SUBDISK_S_ACTIVE		0x05	/* Usable. */
 
 #define G_RAID_SUBDISK_E_NEW		0x01
 #define G_RAID_SUBDISK_E_DISCONNECTED	0x02
@@ -136,6 +137,7 @@ struct g_raid_subdisk {
 	off_t			 sd_size;	/* Size on the disk. */
 	u_int			 sd_pos;	/* Position in volume. */
 	u_int			 sd_state;	/* Subdisk state. */
+	u_int			 sd_rebuild_pos; /* Rebuild position. */
 	int			 sd_read_errs;  /* Count of the read errors */
 	TAILQ_ENTRY(g_raid_subdisk)	 sd_next; /* Next subdisk on disk. */
 };

Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c	Sat Jan 15 21:09:00 2011	(r217461)
+++ projects/graid/head/sys/geom/raid/md_intel.c	Sat Jan 15 21:24:39 2011	(r217462)
@@ -482,6 +482,8 @@ g_raid_md_intel_start_disk(struct g_raid
 	struct g_raid_md_intel_object *mdi;
 	struct g_raid_md_intel_perdisk *pd, *oldpd;
 	struct intel_raid_conf *meta;
+	struct intel_raid_vol *mvol;
+	struct intel_raid_map *mmap0, *mmap1;
 	int disk_pos;
 
 	sc = disk->d_softc;
@@ -520,6 +522,47 @@ g_raid_md_intel_start_disk(struct g_raid
 	/* Welcome the "new" disk. */
 	g_raid_change_disk_state(disk, G_RAID_DISK_S_ACTIVE);
 	TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) {
+		mvol = intel_get_volume(meta,
+		    (uintptr_t)(sd->sd_volume->v_md_data));
+		mmap0 = intel_get_map(mvol, 0);
+		if (mvol->migr_state)
+			mmap1 = intel_get_map(mvol, 1);
+		else
+			mmap1 = mmap0;
+
+		if (mvol->migr_state == 0) {
+			if (mmap0->disk_idx[sd->sd_pos] & INTEL_DI_RBLD) {
+				g_raid_change_subdisk_state(sd,
+				    G_RAID_SUBDISK_S_NEW);
+			} else {
+				g_raid_change_subdisk_state(sd,
+				    G_RAID_SUBDISK_S_ACTIVE);
+			}
+		} else if (mvol->migr_type == INTEL_MT_INIT ||
+			   mvol->migr_type == INTEL_MT_REBUILD) {
+			if (!(mmap1->disk_idx[sd->sd_pos] & INTEL_DI_RBLD)) {
+				g_raid_change_subdisk_state(sd,
+				    G_RAID_SUBDISK_S_ACTIVE);
+			} else if (mmap0->disk_idx[sd->sd_pos] & INTEL_DI_RBLD) {
+				g_raid_change_subdisk_state(sd,
+				    G_RAID_SUBDISK_S_NEW);
+			} else {
+				g_raid_change_subdisk_state(sd,
+				    G_RAID_SUBDISK_S_REBUILD);
+			}
+		} else if (mvol->migr_type == INTEL_MT_VERIFY ||
+			   mvol->migr_type == INTEL_MT_REPAIR) {
+			if (!(mmap1->disk_idx[sd->sd_pos] & INTEL_DI_RBLD)) {
+				g_raid_change_subdisk_state(sd,
+				    G_RAID_SUBDISK_S_ACTIVE);
+			} else if (mmap0->disk_idx[sd->sd_pos] & INTEL_DI_RBLD) {
+				g_raid_change_subdisk_state(sd,
+				    G_RAID_SUBDISK_S_STALE);
+			} else {
+				g_raid_change_subdisk_state(sd,
+				    G_RAID_SUBDISK_S_RESYNC);
+			}
+		}
 		g_raid_event_send(sd, G_RAID_SUBDISK_E_NEW,
 		    G_RAID_EVENT_SUBDISK);
 	}
@@ -1062,6 +1105,7 @@ g_raid_md_ctl_intel(struct g_raid_md_obj
 			sd->sd_size = size;
 			TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next);
 			g_raid_change_disk_state(disk, G_RAID_DISK_S_ACTIVE);
+			g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_ACTIVE);
 			g_raid_event_send(sd, G_RAID_SUBDISK_E_NEW,
 			    G_RAID_EVENT_SUBDISK);
 		}
@@ -1237,6 +1281,8 @@ g_raid_md_ctl_intel(struct g_raid_md_obj
 			/* Welcome the "new" disk. */
 			g_raid_change_disk_state(disk, G_RAID_DISK_S_ACTIVE);
 			TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) {
+				g_raid_change_subdisk_state(sd,
+				    G_RAID_SUBDISK_S_NEW);
 				g_raid_event_send(sd, G_RAID_SUBDISK_E_NEW,
 				    G_RAID_EVENT_SUBDISK);
 			}
@@ -1363,7 +1409,12 @@ g_raid_md_write_intel(struct g_raid_md_o
 		mmap->offset = sd->sd_offset / sectorsize;
 		mmap->disk_sectors = sd->sd_size / sectorsize;
 		mmap->strip_sectors = vol->v_strip_size / sectorsize;
-		mmap->status = INTEL_S_READY;
+		if (vol->v_state == G_RAID_VOLUME_S_BROKEN)
+			mmap->status = INTEL_S_FAILURE;
+		else if (vol->v_state == G_RAID_VOLUME_S_DEGRADED)
+			mmap->status = INTEL_S_DEGRADED;
+		else
+			mmap->status = INTEL_S_READY;
 		if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID0)
 			mmap->type = INTEL_T_RAID0;
 		else if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1 ||
@@ -1387,11 +1438,11 @@ g_raid_md_write_intel(struct g_raid_md_o
 			pd = (struct g_raid_md_intel_perdisk *)
 			    sd->sd_disk->d_md_data;
 			mmap->disk_idx[sdi] = pd->pd_disk_pos;
-//			if (sd->sd_state == G_RAID_SUBDISK_S_NONE) {
-//				mmap->disk_idx[sdi] |= INTEL_DI_RBLD;
-//				if (mmap->failed_disk_num == 0xff)
-//					mmap->failed_disk_num = sdi;
-//			}
+			if (sd->sd_state != G_RAID_SUBDISK_S_ACTIVE) {
+				mmap->disk_idx[sdi] |= INTEL_DI_RBLD;
+				if (mmap->failed_disk_num == 0xff)
+					mmap->failed_disk_num = sdi;
+			}
 		}
 		vi++;
 	}

Modified: projects/graid/head/sys/geom/raid/tr_raid1.c
==============================================================================
--- projects/graid/head/sys/geom/raid/tr_raid1.c	Sat Jan 15 21:09:00 2011	(r217461)
+++ projects/graid/head/sys/geom/raid/tr_raid1.c	Sat Jan 15 21:24:39 2011	(r217462)
@@ -131,9 +131,9 @@ g_raid_tr_event_raid1(struct g_raid_tr_o
 
 	trs = (struct g_raid_tr_raid1_object *)tr;
 	vol = tr->tro_volume;
-	if (event == G_RAID_SUBDISK_E_NEW)
-		g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_ACTIVE);
-	else
+	if (event == G_RAID_SUBDISK_E_NEW) {
+//		g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_ACTIVE);
+	} else
 		g_raid_change_subdisk_state(sd, G_RAID_SUBDISK_S_NONE);
 	g_raid_tr_update_state_raid1(vol);
 	return (0);


More information about the svn-src-projects mailing list