Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 11 Jun 2019 13:36:15 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r348902 - stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Message-ID:  <201906111336.x5BDaFim088207@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Tue Jun 11 13:36:15 2019
New Revision: 348902
URL: https://svnweb.freebsd.org/changeset/base/348902

Log:
  MFC r344316 (by pjd):
  The way ZFS searches for its vdevs is the following: first it looks for
  a vdev that has the same name as the one stored in metadata and that has
  all VDEV labels in place. If it cannot find a GEOM provider with the given
  name and all VDEV labels it will scan all GEOM providers for the best match
  (the most VDEV labels available), but here the name is ignored.
  
  In case the ZFS pool is created, eg. using GPT partition label:
  
          # zpool create tank /dev/gpt/tank
  
  everything works, and on every import ZFS will pick /dev/gpt/tank and
  not /dev/da0p4.
  
  The problem occurs when da0p4 is extended and ZFS is unable to find all
  VDEV labels in /dev/gpt/tank anymore (the VDEV labels stored at the end
  of the partition are now somewhere else). In this case it will scan all
  GEOM providers and will pick the first one with the best match, ie. da0p4.
  
  Fix this problem by checking the VDEV/provider name even if we get the same
  match. If the name is the same as the one we have in pool's metadata, prefer
  this GEOM provider.

Modified:
  stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
==============================================================================
--- stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c	Tue Jun 11 13:28:41 2019	(r348901)
+++ stable/12/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c	Tue Jun 11 13:36:15 2019	(r348902)
@@ -692,10 +692,12 @@ vdev_geom_attach_by_guids(vdev_t *vd)
 	struct g_geom *gp;
 	struct g_provider *pp, *best_pp;
 	struct g_consumer *cp;
+	const char *vdpath;
 	enum match match, best_match;
 
 	g_topology_assert();
 
+	vdpath = vd->vdev_path + sizeof("/dev/") - 1;
 	cp = NULL;
 	best_pp = NULL;
 	best_match = NO_MATCH;
@@ -710,6 +712,10 @@ vdev_geom_attach_by_guids(vdev_t *vd)
 				if (match > best_match) {
 					best_match = match;
 					best_pp = pp;
+				} else if (match == best_match) {
+					if (strcmp(pp->name, vdpath) == 0) {
+						best_pp = pp;
+					}
 				}
 				if (match == FULL_MATCH)
 					goto out;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201906111336.x5BDaFim088207>