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

Alexander Motin mav at FreeBSD.org
Thu Feb 10 10:04:39 UTC 2011


Author: mav
Date: Thu Feb 10 10:04:38 2011
New Revision: 218516
URL: http://svn.freebsd.org/changeset/base/218516

Log:
  Report volume stripesize and stripeoffset.

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

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Thu Feb 10 08:40:12 2011	(r218515)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Thu Feb 10 10:04:38 2011	(r218516)
@@ -1321,10 +1321,11 @@ out:
 static void
 g_raid_launch_provider(struct g_raid_volume *vol)
 {
-//	struct g_raid_disk *disk;
+	struct g_raid_disk *disk;
 	struct g_raid_softc *sc;
 	struct g_provider *pp;
 	char name[G_RAID_MAX_VOLUMENAME];
+	off_t off;
 
 	sc = vol->v_softc;
 	sx_assert(&sc->sc_lock, SX_LOCKED);
@@ -1343,14 +1344,25 @@ g_raid_launch_provider(struct g_raid_vol
 	pp->sectorsize = vol->v_sectorsize;
 	pp->stripesize = 0;
 	pp->stripeoffset = 0;
-#if 0
-	TAILQ_FOREACH(disk, &sc->sc_disks, d_next) {
-		if (disk->d_consumer && disk->d_consumer->provider &&
-		    disk->d_consumer->provider->stripesize > pp->stripesize) {
+	if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID1 ||
+	    vol->v_raid_level == G_RAID_VOLUME_RL_RAID3 ||
+	    vol->v_raid_level == G_RAID_VOLUME_RL_SINGLE ||
+	    vol->v_raid_level == G_RAID_VOLUME_RL_CONCAT) {
+		if ((disk = vol->v_subdisks[0].sd_disk) != NULL &&
+		    disk->d_consumer != NULL &&
+		    disk->d_consumer->provider != NULL) {
 			pp->stripesize = disk->d_consumer->provider->stripesize;
+			off = disk->d_consumer->provider->stripeoffset;
+			pp->stripeoffset = off + vol->v_subdisks[0].sd_offset;
+			if (off > 0)
+				pp->stripeoffset %= off;
 		}
-	}
-#endif
+		if (vol->v_raid_level == G_RAID_VOLUME_RL_RAID3) {
+			pp->stripesize *= (vol->v_disks_count - 1);
+			pp->stripeoffset *= (vol->v_disks_count - 1);
+		}
+	} else
+		pp->stripesize = vol->v_strip_size;
 	vol->v_provider = pp;
 	g_error_provider(pp, 0);
 	g_topology_unlock();


More information about the svn-src-projects mailing list