diff options
Diffstat (limited to 'sys/geom/raid3/g_raid3.c')
-rw-r--r-- | sys/geom/raid3/g_raid3.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/sys/geom/raid3/g_raid3.c b/sys/geom/raid3/g_raid3.c index 3befd8c..3309d47 100644 --- a/sys/geom/raid3/g_raid3.c +++ b/sys/geom/raid3/g_raid3.c @@ -673,6 +673,7 @@ void g_raid3_fill_metadata(struct g_raid3_disk *disk, struct g_raid3_metadata *md) { struct g_raid3_softc *sc; + struct g_provider *pp; sc = disk->d_softc; strlcpy(md->md_magic, G_RAID3_MAGIC, sizeof(md->md_magic)); @@ -691,13 +692,18 @@ g_raid3_fill_metadata(struct g_raid3_disk *disk, struct g_raid3_metadata *md) md->md_sync_offset = disk->d_sync.ds_offset_done; else md->md_sync_offset = 0; - if ((disk->d_flags & G_RAID3_DISK_FLAG_HARDCODED) != 0 && - disk->d_consumer != NULL && disk->d_consumer->provider != NULL) { - strlcpy(md->md_provider, disk->d_consumer->provider->name, - sizeof(md->md_provider)); - } else { + if (disk->d_consumer != NULL && disk->d_consumer->provider != NULL) + pp = disk->d_consumer->provider; + else + pp = NULL; + if ((disk->d_flags & G_RAID3_DISK_FLAG_HARDCODED) != 0 && pp != NULL) + strlcpy(md->md_provider, pp->name, sizeof(md->md_provider)); + else bzero(md->md_provider, sizeof(md->md_provider)); - } + if (pp != NULL) + md->md_provsize = pp->mediasize; + else + md->md_provsize = 0; } void @@ -2886,6 +2892,8 @@ g_raid3_taste(struct g_class *mp, struct g_provider *pp, int flags __unused) if (md.md_provider[0] != '\0' && strcmp(md.md_provider, pp->name) != 0) return (NULL); + if (md.md_provsize != 0 && md.md_provsize != pp->mediasize) + return (NULL); if (g_raid3_debug >= 2) raid3_metadata_dump(&md); |