Date: Sat, 15 Jan 2011 21:24:39 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r217462 - projects/graid/head/sys/geom/raid Message-ID: <201101152124.p0FLOdYo037886@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201101152124.p0FLOdYo037886>