Print this page
NEX-7397 Hotspare didn't kick in automatically when one of the drive in pool went "Faulty" (is_ssd fix)
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-2846 Enable Automatic/Intelligent Hot Sparing capability
Reviewed by: Jeffry Molanus <jeffry.molanus@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
6414 vdev_config_sync could be simpler
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Approved by: Robert Mustacchi <rm@joyent.com>
6368 Remove superfluous statement
Reviewed-by: Ned Bass <bass6@llnl.gov>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Reviewed by: Will Andrews <will@freebsd.org>
Approved by: Robert Mustacchi <rm@joyent.com>
6386 Fix function call with uninitialized value in vdev_inuse
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Approved by: Robert Mustacchi <rm@joyent.com>
6328 Fix cstyle errors in zfs codebase (fix studio)
6328 Fix cstyle errors in zfs codebase
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Alex Reece <alex@delphix.com>
Reviewed by: Richard Elling <Richard.Elling@RichardElling.com>
Reviewed by: Jorgen Lundman <lundman@lundman.net>
Approved by: Robert Mustacchi <rm@joyent.com>
NEX-3984 On-demand TRIM
Reviewed by: Alek Pinchuk <alek@nexenta.com>
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
Conflicts:
        usr/src/common/zfs/zpool_prop.c
        usr/src/uts/common/sys/fs/zfs.h
NEX-3541 Implement persistent L2ARC
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Josef Sipek <josef.sipek@nexenta.com>
Conflicts:
        usr/src/uts/common/fs/zfs/sys/spa.h
4121 vdev_label_init should treat request as succeeded when pool is read only
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Saso Kiselkov <skiselkov.ml@gmail.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
Fixup merge results
re #12585 rb4049 ZFS++ work port - refactoring to improve separation of open/closed code, bug fixes, performance improvements - open code
Bug 11205: add missing libzfs_closed_stubs.c to fix opensource-only build.
ZFS plus work: special vdevs, cos, cos/vdev properties

@@ -19,11 +19,12 @@
  * CDDL HEADER END
  */
 
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2016 by Delphix. All rights reserved.
+ * Copyright (c) 2012, 2015 by Delphix. All rights reserved.
+ * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
  * Virtual Device Labels
  * ---------------------

@@ -141,11 +142,10 @@
 #include <sys/zap.h>
 #include <sys/vdev.h>
 #include <sys/vdev_impl.h>
 #include <sys/uberblock_impl.h>
 #include <sys/metaslab.h>
-#include <sys/metaslab_impl.h>
 #include <sys/zio.h>
 #include <sys/dsl_scan.h>
 #include <sys/abd.h>
 #include <sys/fs/zfs.h>
 

@@ -215,11 +215,10 @@
 nvlist_t *
 vdev_config_generate(spa_t *spa, vdev_t *vd, boolean_t getstats,
     vdev_config_flag_t flags)
 {
         nvlist_t *nv = NULL;
-        vdev_indirect_config_t *vic = &vd->vdev_indirect_config;
 
         nv = fnvlist_alloc();
 
         fnvlist_add_string(nv, ZPOOL_CONFIG_TYPE, vd->vdev_ops->vdev_op_type);
         if (!(flags & (VDEV_CONFIG_SPARE | VDEV_CONFIG_L2CACHE)))

@@ -263,11 +262,11 @@
 
         if (vd->vdev_wholedisk != -1ULL)
                 fnvlist_add_uint64(nv, ZPOOL_CONFIG_WHOLE_DISK,
                     vd->vdev_wholedisk);
 
-        if (vd->vdev_not_present && !(flags & VDEV_CONFIG_MISSING))
+        if (vd->vdev_not_present)
                 fnvlist_add_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT, 1);
 
         if (vd->vdev_isspare)
                 fnvlist_add_uint64(nv, ZPOOL_CONFIG_IS_SPARE, 1);
 

@@ -279,36 +278,29 @@
                     vd->vdev_ms_shift);
                 fnvlist_add_uint64(nv, ZPOOL_CONFIG_ASHIFT, vd->vdev_ashift);
                 fnvlist_add_uint64(nv, ZPOOL_CONFIG_ASIZE,
                     vd->vdev_asize);
                 fnvlist_add_uint64(nv, ZPOOL_CONFIG_IS_LOG, vd->vdev_islog);
-                if (vd->vdev_removing) {
+                fnvlist_add_uint64(nv, ZPOOL_CONFIG_IS_SPECIAL,
+                    vd->vdev_isspecial);
+                if (vd->vdev_removing)
                         fnvlist_add_uint64(nv, ZPOOL_CONFIG_REMOVING,
                             vd->vdev_removing);
                 }
-        }
 
+        if (flags & VDEV_CONFIG_L2CACHE)
+                /* indicate that we support L2ARC persistency */
+                VERIFY(nvlist_add_boolean_value(nv,
+                    ZPOOL_CONFIG_L2CACHE_PERSISTENT, B_TRUE) == 0);
+
+        fnvlist_add_boolean_value(nv, ZPOOL_CONFIG_IS_SSD, vd->vdev_is_ssd);
+
         if (vd->vdev_dtl_sm != NULL) {
                 fnvlist_add_uint64(nv, ZPOOL_CONFIG_DTL,
                     space_map_object(vd->vdev_dtl_sm));
         }
 
-        if (vic->vic_mapping_object != 0) {
-                fnvlist_add_uint64(nv, ZPOOL_CONFIG_INDIRECT_OBJECT,
-                    vic->vic_mapping_object);
-        }
-
-        if (vic->vic_births_object != 0) {
-                fnvlist_add_uint64(nv, ZPOOL_CONFIG_INDIRECT_BIRTHS,
-                    vic->vic_births_object);
-        }
-
-        if (vic->vic_prev_indirect_vdev != UINT64_MAX) {
-                fnvlist_add_uint64(nv, ZPOOL_CONFIG_PREV_INDIRECT_VDEV,
-                    vic->vic_prev_indirect_vdev);
-        }
-
         if (vd->vdev_crtxg)
                 fnvlist_add_uint64(nv, ZPOOL_CONFIG_CREATE_TXG, vd->vdev_crtxg);
 
         if (flags & VDEV_CONFIG_MOS) {
                 if (vd->vdev_leaf_zap != 0) {

@@ -324,79 +316,24 @@
                 }
         }
 
         if (getstats) {
                 vdev_stat_t vs;
+                pool_scan_stat_t ps;
 
                 vdev_get_stats(vd, &vs);
                 fnvlist_add_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS,
                     (uint64_t *)&vs, sizeof (vs) / sizeof (uint64_t));
 
                 /* provide either current or previous scan information */
-                pool_scan_stat_t ps;
                 if (spa_scan_get_stats(spa, &ps) == 0) {
                         fnvlist_add_uint64_array(nv,
                             ZPOOL_CONFIG_SCAN_STATS, (uint64_t *)&ps,
                             sizeof (pool_scan_stat_t) / sizeof (uint64_t));
                 }
-
-                pool_removal_stat_t prs;
-                if (spa_removal_get_stats(spa, &prs) == 0) {
-                        fnvlist_add_uint64_array(nv,
-                            ZPOOL_CONFIG_REMOVAL_STATS, (uint64_t *)&prs,
-                            sizeof (prs) / sizeof (uint64_t));
                 }
 
-                /*
-                 * Note: this can be called from open context
-                 * (spa_get_stats()), so we need the rwlock to prevent
-                 * the mapping from being changed by condensing.
-                 */
-                rw_enter(&vd->vdev_indirect_rwlock, RW_READER);
-                if (vd->vdev_indirect_mapping != NULL) {
-                        ASSERT(vd->vdev_indirect_births != NULL);
-                        vdev_indirect_mapping_t *vim =
-                            vd->vdev_indirect_mapping;
-                        fnvlist_add_uint64(nv, ZPOOL_CONFIG_INDIRECT_SIZE,
-                            vdev_indirect_mapping_size(vim));
-                }
-                rw_exit(&vd->vdev_indirect_rwlock);
-                if (vd->vdev_mg != NULL &&
-                    vd->vdev_mg->mg_fragmentation != ZFS_FRAG_INVALID) {
-                        /*
-                         * Compute approximately how much memory would be used
-                         * for the indirect mapping if this device were to
-                         * be removed.
-                         *
-                         * Note: If the frag metric is invalid, then not
-                         * enough metaslabs have been converted to have
-                         * histograms.
-                         */
-                        uint64_t seg_count = 0;
-
-                        /*
-                         * There are the same number of allocated segments
-                         * as free segments, so we will have at least one
-                         * entry per free segment.
-                         */
-                        for (int i = 0; i < RANGE_TREE_HISTOGRAM_SIZE; i++) {
-                                seg_count += vd->vdev_mg->mg_histogram[i];
-                        }
-
-                        /*
-                         * The maximum length of a mapping is SPA_MAXBLOCKSIZE,
-                         * so we need at least one entry per SPA_MAXBLOCKSIZE
-                         * of allocated data.
-                         */
-                        seg_count += vd->vdev_stat.vs_alloc / SPA_MAXBLOCKSIZE;
-
-                        fnvlist_add_uint64(nv, ZPOOL_CONFIG_INDIRECT_SIZE,
-                            seg_count *
-                            sizeof (vdev_indirect_mapping_entry_phys_t));
-                }
-        }
-
         if (!vd->vdev_ops->vdev_op_leaf) {
                 nvlist_t **child;
                 int c, idx;
 
                 ASSERT(!vd->vdev_ishole);

@@ -464,11 +401,17 @@
 
                 if (vd->vdev_splitting && vd->vdev_orig_guid != 0LL) {
                         fnvlist_add_uint64(nv, ZPOOL_CONFIG_ORIG_GUID,
                             vd->vdev_orig_guid);
                 }
+
+                /* grab per-leaf-vdev trim stats */
+                if (getstats) {
+                        fnvlist_add_uint64(nv, ZPOOL_CONFIG_TRIM_PROG,
+                            vd->vdev_trim_prog);
         }
+        }
 
         return (nv);
 }
 
 /*

@@ -487,14 +430,13 @@
         array = kmem_alloc(rvd->vdev_children * sizeof (uint64_t), KM_SLEEP);
 
         for (c = 0, idx = 0; c < rvd->vdev_children; c++) {
                 vdev_t *tvd = rvd->vdev_child[c];
 
-                if (tvd->vdev_ishole) {
+                if (tvd->vdev_ishole)
                         array[idx++] = c;
                 }
-        }
 
         if (idx) {
                 VERIFY(nvlist_add_uint64_array(config, ZPOOL_CONFIG_HOLE_ARRAY,
                     array, idx) == 0);
         }

@@ -1055,24 +997,12 @@
          * It's possible that the best uberblock was discovered on a label
          * that has a configuration which was written in a future txg.
          * Search all labels on this vdev to find the configuration that
          * matches the txg for our uberblock.
          */
-        if (cb.ubl_vd != NULL) {
-                vdev_dbgmsg(cb.ubl_vd, "best uberblock found for spa %s. "
-                    "txg %llu", spa->spa_name, (u_longlong_t)ub->ub_txg);
-
+        if (cb.ubl_vd != NULL)
                 *config = vdev_label_read_config(cb.ubl_vd, ub->ub_txg);
-                if (*config == NULL && spa->spa_extreme_rewind) {
-                        vdev_dbgmsg(cb.ubl_vd, "failed to read label config. "
-                            "Trying again without txg restrictions.");
-                        *config = vdev_label_read_config(cb.ubl_vd, UINT64_MAX);
-                }
-                if (*config == NULL) {
-                        vdev_dbgmsg(cb.ubl_vd, "failed to read label config");
-                }
-        }
         spa_config_exit(spa, SCL_ALL, FTAG);
 }
 
 /*
  * On success, increment root zio's count of good writes.

@@ -1091,11 +1021,11 @@
  * Write the uberblock to all labels of all leaves of the specified vdev.
  */
 static void
 vdev_uberblock_sync(zio_t *zio, uberblock_t *ub, vdev_t *vd, int flags)
 {
-        for (uint64_t c = 0; c < vd->vdev_children; c++)
+        for (int c = 0; c < vd->vdev_children; c++)
                 vdev_uberblock_sync(zio, ub, vd->vdev_child[c], flags);
 
         if (!vd->vdev_ops->vdev_op_leaf)
                 return;
 

@@ -1138,15 +1068,12 @@
          * are no longer needed (because the new uberblocks and the even
          * labels are safely on disk), so it is safe to overwrite them.
          */
         zio = zio_root(spa, NULL, NULL, flags);
 
-        for (int v = 0; v < svdcount; v++) {
-                if (vdev_writeable(svd[v])) {
+        for (int v = 0; v < svdcount; v++)
                         zio_flush(zio, svd[v]);
-                }
-        }
 
         (void) zio_wait(zio);
 
         return (good_writes >= 1 ? 0 : EIO);
 }