summaryrefslogtreecommitdiffstats
path: root/sys/geom/raid3/g_raid3.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/geom/raid3/g_raid3.c')
-rw-r--r--sys/geom/raid3/g_raid3.c20
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);
OpenPOWER on IntegriCloud