Index: vdev_geom.c =================================================================== --- vdev_geom.c (revision 259107) +++ vdev_geom.c (working copy) @@ -573,6 +573,7 @@ vdev_geom_open_by_guid(vdev_t *vd) static struct g_consumer * vdev_geom_open_by_path(vdev_t *vd, int check_guid) { + struct nameidata nd; struct g_provider *pp; struct g_consumer *cp; uint64_t guid; @@ -580,7 +581,16 @@ vdev_geom_open_by_path(vdev_t *vd, int check_guid) g_topology_assert(); cp = NULL; - pp = g_provider_by_name(vd->vdev_path + sizeof("/dev/") - 1); + pp = NULL; + NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, vd->vdev_path, curthread); + if (namei(&nd) == 0) { + NDFREE(&nd, NDF_ONLY_PNBUF); + if (vn_isdisk(nd.ni_vp, NULL)) + pp = g_dev_getprovider(nd.ni_vp->v_rdev); + vrele(nd.ni_vp); + } + if (pp == NULL) + pp = g_provider_by_name(vd->vdev_path + sizeof("/dev/") - 1); if (pp != NULL) { ZFS_LOG(1, "Found provider by name %s.", vd->vdev_path); cp = vdev_geom_attach(pp);