summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2009-12-05 20:16:28 +0000
committerpjd <pjd@FreeBSD.org>2009-12-05 20:16:28 +0000
commitd0a68d920c409d295113cb969bbd438b42c7017d (patch)
treeb3ff1976a5600c953e9f5742672a881c294ce39b
parentdd6da936a1fd0326da76832a4fd3e5688ca1190e (diff)
downloadFreeBSD-src-d0a68d920c409d295113cb969bbd438b42c7017d.zip
FreeBSD-src-d0a68d920c409d295113cb969bbd438b42c7017d.tar.gz
We have to eventually look for provider without checking guid as this is need
for attaching when there is no metadata yet. Before r200125 the order of looking for providers was wrong. It was: 1. Find provider by name. 2. Find provider by guid. 3. Find provider by name and guid. Where it should have been: 1. Find provider by name and guid. 2. Find provider by guid. 3. Find provider by name. MFC after: 1 week
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
index 5cc5f37..4c41f90 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
@@ -453,7 +453,7 @@ vdev_geom_open_by_guid(vdev_t *vd)
}
static struct g_consumer *
-vdev_geom_open_by_path(vdev_t *vd)
+vdev_geom_open_by_path(vdev_t *vd, int check_guid)
{
struct g_provider *pp;
struct g_consumer *cp;
@@ -465,7 +465,7 @@ vdev_geom_open_by_path(vdev_t *vd)
if (pp != NULL) {
ZFS_LOG(1, "Found provider by name %s.", vd->vdev_path);
cp = vdev_geom_attach(pp, !!(spa_mode & FWRITE));
- if (cp != NULL) {
+ if (cp != NULL && check_guid) {
g_topology_unlock();
guid = vdev_geom_read_guid(cp);
g_topology_lock();
@@ -506,7 +506,7 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift)
if ((owned = mtx_owned(&Giant)))
mtx_unlock(&Giant);
- cp = vdev_geom_open_by_path(vd);
+ cp = vdev_geom_open_by_path(vd, 1);
if (cp == NULL) {
/*
* The device at vd->vdev_path doesn't have the expected guid.
@@ -515,6 +515,8 @@ vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift)
*/
cp = vdev_geom_open_by_guid(vd);
}
+ if (cp == NULL)
+ cp = vdev_geom_open_by_path(vd, 0);
if (cp == NULL) {
ZFS_LOG(1, "Provider %s not found.", vd->vdev_path);
vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
OpenPOWER on IntegriCloud