summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2009-12-24 13:38:02 +0000
committermav <mav@FreeBSD.org>2009-12-24 13:38:02 +0000
commitcf5b790219adaa732214f1666931e6b8e5f4ea3f (patch)
tree9b140297cd5e236290a1c774c1031f3d726817b1
parentf961171ed1c1e7ef10ba90eecb16a1dd42958c19 (diff)
downloadFreeBSD-src-cf5b790219adaa732214f1666931e6b8e5f4ea3f.zip
FreeBSD-src-cf5b790219adaa732214f1666931e6b8e5f4ea3f.tar.gz
As soon as geom_raid3 reports it's own stripe as sector size, report largest
underlying provider's stripe, multiplied by number of data disks in array, due to transformation done, as array stripe.
-rw-r--r--sys/geom/raid3/g_raid3.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/sys/geom/raid3/g_raid3.c b/sys/geom/raid3/g_raid3.c
index 0feca0c..6425b2e 100644
--- a/sys/geom/raid3/g_raid3.c
+++ b/sys/geom/raid3/g_raid3.c
@@ -2317,6 +2317,8 @@ static void
g_raid3_launch_provider(struct g_raid3_softc *sc)
{
struct g_provider *pp;
+ struct g_raid3_disk *disk;
+ int n;
sx_assert(&sc->sc_lock, SX_LOCKED);
@@ -2324,6 +2326,18 @@ g_raid3_launch_provider(struct g_raid3_softc *sc)
pp = g_new_providerf(sc->sc_geom, "raid3/%s", sc->sc_name);
pp->mediasize = sc->sc_mediasize;
pp->sectorsize = sc->sc_sectorsize;
+ pp->stripesize = 0;
+ pp->stripeoffset = 0;
+ for (n = 0; n < sc->sc_ndisks; n++) {
+ disk = &sc->sc_disks[n];
+ if (disk->d_consumer && disk->d_consumer->provider &&
+ disk->d_consumer->provider->stripesize > pp->stripesize) {
+ pp->stripesize = disk->d_consumer->provider->stripesize;
+ pp->stripeoffset = disk->d_consumer->provider->stripeoffset;
+ }
+ }
+ pp->stripesize *= sc->sc_ndisks - 1;
+ pp->stripeoffset *= sc->sc_ndisks - 1;
sc->sc_provider = pp;
g_error_provider(pp, 0);
g_topology_unlock();
OpenPOWER on IntegriCloud