Author: mav
Date: Mon Jan 22 04:37:04 2018
New Revision: 328250
URL: https://svnweb.freebsd.org/changeset/base/328250

Log:
  MFV r328249:
  8641 "zpool clear" and "zinject" don't work on "spare" or "replacing" vdevs
  
  illumos/illumos-gate@2ba5f978a4f9b02da9db1b8cdd9ea5498eb00ad9
  
  https://www.illumos.org/issues/8641:
  "zpool clear" and "zinject -d" can both operate on specific vdevs, either
  leaf or interior. However, due to an oversight, neither works on a "spare"
  or "replacing" vdev. For example:
  
  sudo zpool create foo raidz1 c1t5000CCA000081D61d0 c1t5000CCA000186235d0 
spare c
  1t5000CCA000094115d0
  sudo zpool replace foo c1t5000CCA000186235d0 c1t5000CCA000094115d0
  $ zpool status foo pool: foo
  state: ONLINE
  scan: resilvered 81.5K in 0h0m with 0 errors on Fri Sep 8 10:53:03 2017
  config:
  
  NAME                         STATE     READ WRITE CKSUM
          foo                          ONLINE       0     0     0
            raidz1-0                   ONLINE       0     0     0
              c1t5000CCA000081D61d0    ONLINE       0     0     0
              spare-1                  ONLINE       0     0     0
                c1t5000CCA000186235d0  ONLINE       0     0     0
                c1t5000CCA000094115d0  ONLINE       0     0     0
          spares
            c1t5000CCA000094115d0      INUSE     currently in use
  $ sudo zinject -d spare-1 -A degrade foo
  cannot find device 'spare-1' in pool 'foo'
  $ sudo zpool clear foo spare-1
  cannot clear errors for spare-1: no such device in pool
  
  Even though there was nothing to clear, those commands shouldn't have
  reported an error. by contrast, trying to clear "raidz1-0" works just fine:
  $ sudo zpool clear foo raidz1-0
  
  Reviewed by: Matthew Ahrens <mahr...@delphix.com>
  Approved by: Gordon Ross <g...@nexenta.com>
  Author: Alan Somers <asom...@gmail.com>

Modified:
  head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c
Directory Properties:
  head/cddl/contrib/opensolaris/   (props changed)
  head/cddl/contrib/opensolaris/lib/libzfs/   (props changed)

Modified: head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c       Mon Jan 
22 04:35:17 2018        (r328249)
+++ head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c       Mon Jan 
22 04:37:04 2018        (r328250)
@@ -50,6 +50,7 @@
 #include "zfeature_common.h"
 
 static int read_efi_label(nvlist_t *config, diskaddr_t *sb);
+static boolean_t zpool_vdev_is_interior(const char *name);
 
 #define        BACKUP_SLICE    "s2"
 
@@ -2065,10 +2066,7 @@ vdev_to_nvlist_iter(nvlist_t *nv, nvlist_t *search, bo
                                break;
                        }
 
-                       verify(strncmp(type, VDEV_TYPE_RAIDZ,
-                           strlen(VDEV_TYPE_RAIDZ)) == 0 ||
-                           strncmp(type, VDEV_TYPE_MIRROR,
-                           strlen(VDEV_TYPE_MIRROR)) == 0);
+                       verify(zpool_vdev_is_interior(type));
                        verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_ID,
                            &id) == 0);
 
@@ -2175,10 +2173,13 @@ zpool_find_vdev_by_physpath(zpool_handle_t *zhp, const
 /*
  * Determine if we have an "interior" top-level vdev (i.e mirror/raidz).
  */
-boolean_t
+static boolean_t
 zpool_vdev_is_interior(const char *name)
 {
        if (strncmp(name, VDEV_TYPE_RAIDZ, strlen(VDEV_TYPE_RAIDZ)) == 0 ||
+           strncmp(name, VDEV_TYPE_SPARE, strlen(VDEV_TYPE_SPARE)) == 0 ||
+           strncmp(name,
+           VDEV_TYPE_REPLACING, strlen(VDEV_TYPE_REPLACING)) == 0 ||
            strncmp(name, VDEV_TYPE_MIRROR, strlen(VDEV_TYPE_MIRROR)) == 0)
                return (B_TRUE);
        return (B_FALSE);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to