Author: gibbs
Date: Mon Jul 18 03:00:59 2011
New Revision: 224170
URL: http://svn.freebsd.org/changeset/base/224170

Log:
  Correct reporting of missing leaf vdevs so that the GUID required to
  perform pool actions is always displayed.
  
  cddl/contrib/opensolaris/cmd/zpool/zpool_main.c:
        The "zpool status" command reports the "last seen at"
        device node path when the vdev name is being reported
        by GUID.  Augment this code to assume a GUID is reported
        when a device goes missing after initial boot in addition
        to the previous behavior of doing this for devices that
        aren't seen at boot.
  
  cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c:
        In zpool_vdev_name(), report recently missing devices
        by GUID.  There is no guarantee they will return at
        their previous location.

Modified:
  head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
  head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c

Modified: head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
==============================================================================
--- head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c        Mon Jul 18 
02:13:21 2011        (r224169)
+++ head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c        Mon Jul 18 
03:00:59 2011        (r224170)
@@ -1084,10 +1084,11 @@ print_status_config(zpool_handle_t *zhp,
        }
 
        if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
-           &notpresent) == 0) {
+           &notpresent) == 0 ||
+           vs->vs_state <= VDEV_STATE_CANT_OPEN) {
                char *path;
-               verify(nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0);
-               (void) printf("  was %s", path);
+               if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0)
+                       (void) printf("  was %s", path);
        } else if (vs->vs_aux != 0) {
                (void) printf("  ");
 

Modified: head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c       Mon Jul 
18 02:13:21 2011        (r224169)
+++ head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_pool.c       Mon Jul 
18 03:00:59 2011        (r224170)
@@ -3110,15 +3110,25 @@ zpool_vdev_name(libzfs_handle_t *hdl, zp
        char buf[64];
        vdev_stat_t *vs;
        uint_t vsc;
+       int have_stats;
+       int have_path;
 
-       if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
-           &value) == 0) {
+       have_stats = nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS,
+           (uint64_t **)&vs, &vsc) == 0;
+       have_path = nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0;
+
+       /*
+        * If the device is not currently present, assume it will not
+        * come back at the same device path.  Display the device by GUID.
+        */
+       if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT, &value) == 0 ||
+           have_path && have_stats && vs->vs_state <= VDEV_STATE_CANT_OPEN) {
                verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID,
                    &value) == 0);
                (void) snprintf(buf, sizeof (buf), "%llu",
                    (u_longlong_t)value);
                path = buf;
-       } else if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0) {
+       } else if (have_path) {
 
                /*
                 * If the device is dead (faulted, offline, etc) then don't
@@ -3126,8 +3136,7 @@ zpool_vdev_name(libzfs_handle_t *hdl, zp
                 * open a misbehaving device, which can have undesirable
                 * effects.
                 */
-               if ((nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS,
-                   (uint64_t **)&vs, &vsc) != 0 ||
+               if ((have_stats == 0 ||
                    vs->vs_state >= VDEV_STATE_DEGRADED) &&
                    zhp != NULL &&
                    nvlist_lookup_string(nv, ZPOOL_CONFIG_DEVID, &devid) == 0) {
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to