diff options
author | pjd <pjd@FreeBSD.org> | 2009-12-05 20:16:28 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2009-12-05 20:16:28 +0000 |
commit | d0a68d920c409d295113cb969bbd438b42c7017d (patch) | |
tree | b3ff1976a5600c953e9f5742672a881c294ce39b | |
parent | dd6da936a1fd0326da76832a4fd3e5688ca1190e (diff) | |
download | FreeBSD-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.c | 8 |
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; |