Illumos #1748: desire support for reguid in zfs
[zfs.git] / module / zfs / spa_misc.c
index 1b54afb..c82dca6 100644 (file)
@@ -20,6 +20,8 @@
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011 by Delphix. All rights reserved.
+ * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  */
 
 #include <sys/zfs_context.h>
@@ -40,6 +42,7 @@
 #include <sys/dsl_pool.h>
 #include <sys/dsl_dir.h>
 #include <sys/dsl_prop.h>
+#include <sys/fm/util.h>
 #include <sys/dsl_scan.h>
 #include <sys/fs/zfs.h>
 #include <sys/metaslab_impl.h>
@@ -232,21 +235,6 @@ static avl_tree_t spa_l2cache_avl;
 kmem_cache_t *spa_buffer_pool;
 int spa_mode_global;
 
-#ifdef ZFS_DEBUG
-/* Everything except dprintf is on by default in debug builds */
-int zfs_flags = ~ZFS_DEBUG_DPRINTF;
-#else
-int zfs_flags = 0;
-#endif
-
-/*
- * zfs_recover can be set to nonzero to attempt to recover from
- * otherwise-fatal errors, typically caused by on-disk corruption.  When
- * set, calls to zfs_panic_recover() will turn into warning messages.
- */
-int zfs_recover = 0;
-
-
 /*
  * ==========================================================================
  * SPA config locking
@@ -255,7 +243,9 @@ int zfs_recover = 0;
 static void
 spa_config_lock_init(spa_t *spa)
 {
-       for (int i = 0; i < SCL_LOCKS; i++) {
+       int i;
+
+       for (i = 0; i < SCL_LOCKS; i++) {
                spa_config_lock_t *scl = &spa->spa_config_lock[i];
                mutex_init(&scl->scl_lock, NULL, MUTEX_DEFAULT, NULL);
                cv_init(&scl->scl_cv, NULL, CV_DEFAULT, NULL);
@@ -268,7 +258,9 @@ spa_config_lock_init(spa_t *spa)
 static void
 spa_config_lock_destroy(spa_t *spa)
 {
-       for (int i = 0; i < SCL_LOCKS; i++) {
+       int i;
+
+       for (i = 0; i < SCL_LOCKS; i++) {
                spa_config_lock_t *scl = &spa->spa_config_lock[i];
                mutex_destroy(&scl->scl_lock);
                cv_destroy(&scl->scl_cv);
@@ -281,7 +273,9 @@ spa_config_lock_destroy(spa_t *spa)
 int
 spa_config_tryenter(spa_t *spa, int locks, void *tag, krw_t rw)
 {
-       for (int i = 0; i < SCL_LOCKS; i++) {
+       int i;
+
+       for (i = 0; i < SCL_LOCKS; i++) {
                spa_config_lock_t *scl = &spa->spa_config_lock[i];
                if (!(locks & (1 << i)))
                        continue;
@@ -311,8 +305,9 @@ void
 spa_config_enter(spa_t *spa, int locks, void *tag, krw_t rw)
 {
        int wlocks_held = 0;
+       int i;
 
-       for (int i = 0; i < SCL_LOCKS; i++) {
+       for (i = 0; i < SCL_LOCKS; i++) {
                spa_config_lock_t *scl = &spa->spa_config_lock[i];
                if (scl->scl_writer == curthread)
                        wlocks_held |= (1 << i);
@@ -341,7 +336,9 @@ spa_config_enter(spa_t *spa, int locks, void *tag, krw_t rw)
 void
 spa_config_exit(spa_t *spa, int locks, void *tag)
 {
-       for (int i = SCL_LOCKS - 1; i >= 0; i--) {
+       int i;
+
+       for (i = SCL_LOCKS - 1; i >= 0; i--) {
                spa_config_lock_t *scl = &spa->spa_config_lock[i];
                if (!(locks & (1 << i)))
                        continue;
@@ -360,9 +357,9 @@ spa_config_exit(spa_t *spa, int locks, void *tag)
 int
 spa_config_held(spa_t *spa, int locks, krw_t rw)
 {
-       int locks_held = 0;
+       int i, locks_held = 0;
 
-       for (int i = 0; i < SCL_LOCKS; i++) {
+       for (i = 0; i < SCL_LOCKS; i++) {
                spa_config_lock_t *scl = &spa->spa_config_lock[i];
                if (!(locks & (1 << i)))
                        continue;
@@ -390,7 +387,7 @@ spa_lookup(const char *name)
        static spa_t search;    /* spa_t is large; don't allocate on stack */
        spa_t *spa;
        avl_index_t where;
-       char c;
+       char c = 0;
        char *cp;
 
        ASSERT(MUTEX_HELD(&spa_namespace_lock));
@@ -424,10 +421,11 @@ spa_add(const char *name, nvlist_t *config, const char *altroot)
 {
        spa_t *spa;
        spa_config_dirent_t *dp;
+       int t;
 
        ASSERT(MUTEX_HELD(&spa_namespace_lock));
 
-       spa = kmem_zalloc(sizeof (spa_t), KM_SLEEP);
+       spa = kmem_zalloc(sizeof (spa_t), KM_SLEEP | KM_NODEBUG);
 
        mutex_init(&spa->spa_async_lock, NULL, MUTEX_DEFAULT, NULL);
        mutex_init(&spa->spa_errlist_lock, NULL, MUTEX_DEFAULT, NULL);
@@ -444,7 +442,7 @@ spa_add(const char *name, nvlist_t *config, const char *altroot)
        cv_init(&spa->spa_scrub_io_cv, NULL, CV_DEFAULT, NULL);
        cv_init(&spa->spa_suspend_cv, NULL, CV_DEFAULT, NULL);
 
-       for (int t = 0; t < TXG_SIZE; t++)
+       for (t = 0; t < TXG_SIZE; t++)
                bplist_create(&spa->spa_free_bplist[t]);
 
        (void) strlcpy(spa->spa_name, name, sizeof (spa->spa_name));
@@ -496,6 +494,7 @@ void
 spa_remove(spa_t *spa)
 {
        spa_config_dirent_t *dp;
+       int t;
 
        ASSERT(MUTEX_HELD(&spa_namespace_lock));
        ASSERT(spa->spa_state == POOL_STATE_UNINITIALIZED);
@@ -526,7 +525,7 @@ spa_remove(spa_t *spa)
 
        spa_config_lock_destroy(spa);
 
-       for (int t = 0; t < TXG_SIZE; t++)
+       for (t = 0; t < TXG_SIZE; t++)
                bplist_destroy(&spa->spa_free_bplist[t]);
 
        cv_destroy(&spa->spa_async_cv);
@@ -877,10 +876,9 @@ spa_vdev_config_enter(spa_t *spa)
 void
 spa_vdev_config_exit(spa_t *spa, vdev_t *vd, uint64_t txg, int error, char *tag)
 {
-       ASSERT(MUTEX_HELD(&spa_namespace_lock));
-
        int config_changed = B_FALSE;
 
+       ASSERT(MUTEX_HELD(&spa_namespace_lock));
        ASSERT(txg > spa_last_synced_txg(spa));
 
        spa->spa_pending_vdev = NULL;
@@ -1205,16 +1203,6 @@ spa_freeze(spa_t *spa)
                txg_wait_synced(spa_get_dsl(spa), freeze_txg);
 }
 
-void
-zfs_panic_recover(const char *fmt, ...)
-{
-       va_list adx;
-
-       va_start(adx, fmt);
-       vcmn_err(zfs_recover ? CE_WARN : CE_PANIC, fmt, adx);
-       va_end(adx);
-}
-
 /*
  * This is a stripped-down version of strtoull, suitable only for converting
  * lowercase hexidecimal numbers that don't overflow.
@@ -1303,13 +1291,24 @@ spa_guid(spa_t *spa)
        /*
         * If we fail to parse the config during spa_load(), we can go through
         * the error path (which posts an ereport) and end up here with no root
-        * vdev.  We stash the original pool guid in 'spa_load_guid' to handle
+        * vdev.  We stash the original pool guid in 'spa_config_guid' to handle
         * this case.
         */
        if (spa->spa_root_vdev != NULL)
                return (spa->spa_root_vdev->vdev_guid);
        else
-               return (spa->spa_load_guid);
+               return (spa->spa_config_guid);
+}
+
+uint64_t
+spa_load_guid(spa_t *spa)
+{
+       /*
+        * This is a GUID that exists solely as a reference for the
+        * purposes of the arc.  It is generated at load time, and
+        * is never written to persistent storage.
+        */
+       return (spa->spa_load_guid);
 }
 
 uint64_t
@@ -1454,8 +1453,9 @@ uint64_t
 bp_get_dsize_sync(spa_t *spa, const blkptr_t *bp)
 {
        uint64_t dsize = 0;
+       int d;
 
-       for (int d = 0; d < SPA_DVAS_PER_BP; d++)
+       for (d = 0; d < SPA_DVAS_PER_BP; d++)
                dsize += dva_get_dsize_sync(spa, &bp->blk_dva[d]);
 
        return (dsize);
@@ -1465,10 +1465,11 @@ uint64_t
 bp_get_dsize(spa_t *spa, const blkptr_t *bp)
 {
        uint64_t dsize = 0;
+       int d;
 
        spa_config_enter(spa, SCL_VDEV, FTAG, RW_READER);
 
-       for (int d = 0; d < SPA_DVAS_PER_BP; d++)
+       for (d = 0; d < SPA_DVAS_PER_BP; d++)
                dsize += dva_get_dsize_sync(spa, &bp->blk_dva[d]);
 
        spa_config_exit(spa, SCL_VDEV, FTAG);
@@ -1497,14 +1498,8 @@ spa_name_compare(const void *a1, const void *a2)
        return (0);
 }
 
-int
-spa_busy(void)
-{
-       return (spa_active_count);
-}
-
 void
-spa_boot_init()
+spa_boot_init(void)
 {
        spa_config_load();
 }
@@ -1528,6 +1523,7 @@ spa_init(int mode)
 
        spa_mode_global = mode;
 
+       fm_init();
        refcount_init();
        unique_init();
        zio_init();
@@ -1553,6 +1549,7 @@ spa_fini(void)
        zio_fini();
        unique_fini();
        refcount_fini();
+       fm_fini();
 
        avl_destroy(&spa_namespace_avl);
        avl_destroy(&spa_spare_avl);
@@ -1670,3 +1667,89 @@ spa_scan_get_stats(spa_t *spa, pool_scan_stat_t *ps)
 
        return (0);
 }
+
+boolean_t
+spa_debug_enabled(spa_t *spa)
+{
+       return (spa->spa_debug);
+}
+
+#if defined(_KERNEL) && defined(HAVE_SPL)
+/* Namespace manipulation */
+EXPORT_SYMBOL(spa_lookup);
+EXPORT_SYMBOL(spa_add);
+EXPORT_SYMBOL(spa_remove);
+EXPORT_SYMBOL(spa_next);
+
+/* Refcount functions */
+EXPORT_SYMBOL(spa_open_ref);
+EXPORT_SYMBOL(spa_close);
+EXPORT_SYMBOL(spa_refcount_zero);
+
+/* Pool configuration lock */
+EXPORT_SYMBOL(spa_config_tryenter);
+EXPORT_SYMBOL(spa_config_enter);
+EXPORT_SYMBOL(spa_config_exit);
+EXPORT_SYMBOL(spa_config_held);
+
+/* Pool vdev add/remove lock */
+EXPORT_SYMBOL(spa_vdev_enter);
+EXPORT_SYMBOL(spa_vdev_exit);
+
+/* Pool vdev state change lock */
+EXPORT_SYMBOL(spa_vdev_state_enter);
+EXPORT_SYMBOL(spa_vdev_state_exit);
+
+/* Accessor functions */
+EXPORT_SYMBOL(spa_shutting_down);
+EXPORT_SYMBOL(spa_get_dsl);
+EXPORT_SYMBOL(spa_get_rootblkptr);
+EXPORT_SYMBOL(spa_set_rootblkptr);
+EXPORT_SYMBOL(spa_altroot);
+EXPORT_SYMBOL(spa_sync_pass);
+EXPORT_SYMBOL(spa_name);
+EXPORT_SYMBOL(spa_guid);
+EXPORT_SYMBOL(spa_last_synced_txg);
+EXPORT_SYMBOL(spa_first_txg);
+EXPORT_SYMBOL(spa_syncing_txg);
+EXPORT_SYMBOL(spa_version);
+EXPORT_SYMBOL(spa_state);
+EXPORT_SYMBOL(spa_load_state);
+EXPORT_SYMBOL(spa_freeze_txg);
+EXPORT_SYMBOL(spa_get_asize);
+EXPORT_SYMBOL(spa_get_dspace);
+EXPORT_SYMBOL(spa_update_dspace);
+EXPORT_SYMBOL(spa_deflate);
+EXPORT_SYMBOL(spa_normal_class);
+EXPORT_SYMBOL(spa_log_class);
+EXPORT_SYMBOL(spa_max_replication);
+EXPORT_SYMBOL(spa_prev_software_version);
+EXPORT_SYMBOL(spa_get_failmode);
+EXPORT_SYMBOL(spa_suspended);
+EXPORT_SYMBOL(spa_bootfs);
+EXPORT_SYMBOL(spa_delegation);
+EXPORT_SYMBOL(spa_meta_objset);
+
+/* Miscellaneous support routines */
+EXPORT_SYMBOL(spa_rename);
+EXPORT_SYMBOL(spa_guid_exists);
+EXPORT_SYMBOL(spa_strdup);
+EXPORT_SYMBOL(spa_strfree);
+EXPORT_SYMBOL(spa_get_random);
+EXPORT_SYMBOL(spa_generate_guid);
+EXPORT_SYMBOL(sprintf_blkptr);
+EXPORT_SYMBOL(spa_freeze);
+EXPORT_SYMBOL(spa_upgrade);
+EXPORT_SYMBOL(spa_evict_all);
+EXPORT_SYMBOL(spa_lookup_by_guid);
+EXPORT_SYMBOL(spa_has_spare);
+EXPORT_SYMBOL(dva_get_dsize_sync);
+EXPORT_SYMBOL(bp_get_dsize_sync);
+EXPORT_SYMBOL(bp_get_dsize);
+EXPORT_SYMBOL(spa_has_slogs);
+EXPORT_SYMBOL(spa_is_root);
+EXPORT_SYMBOL(spa_writeable);
+EXPORT_SYMBOL(spa_mode);
+
+EXPORT_SYMBOL(spa_namespace_lock);
+#endif