]> git.proxmox.com Git - mirror_zfs.git/blobdiff - include/sys/spa.h
ztest: scrub ddt repair
[mirror_zfs.git] / include / sys / spa.h
index f93354c7881a49e0f3e5af3862ee4c2c1c609158..febf0e8f241b8f929491392c6e9c44da101d7814 100644 (file)
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2011, 2014 by Delphix. All rights reserved.
+ * Copyright (c) 2011, 2018 by Delphix. All rights reserved.
  * Copyright 2011 Nexenta Systems, Inc.  All rights reserved.
  * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved.
  * Copyright 2013 Saso Kiselkov. All rights reserved.
  * Copyright (c) 2014 Integros [integros.com]
  * Copyright 2017 Joyent, Inc.
  * Copyright (c) 2017 Datto Inc.
+ * Copyright (c) 2017, Intel Corporation.
  */
 
 #ifndef _SYS_SPA_H
@@ -153,6 +154,7 @@ _NOTE(CONSTCOND) } while (0)
 #define        SPA_ASIZEBITS           24      /* ASIZE up to 64 times larger  */
 
 #define        SPA_COMPRESSBITS        7
+#define        SPA_VDEVBITS            24
 
 /*
  * All SPA data is represented by 128-bit data virtual addresses (DVAs).
@@ -177,15 +179,15 @@ typedef struct zio_cksum_salt {
  *
  *     64      56      48      40      32      24      16      8       0
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
- * 0   |               vdev1           | GRID  |         ASIZE         |
+ * 0   |  pad  |         vdev1         | GRID  |         ASIZE         |
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
  * 1   |G|                      offset1                                |
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
- * 2   |               vdev2           | GRID  |         ASIZE         |
+ * 2   |  pad  |         vdev2         | GRID  |         ASIZE         |
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
  * 3   |G|                      offset2                                |
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
- * 4   |               vdev3           | GRID  |         ASIZE         |
+ * 4   |  pad  |         vdev3         | GRID  |         ASIZE         |
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
  * 5   |G|                      offset3                                |
  *     +-------+-------+-------+-------+-------+-------+-------+-------+
@@ -227,7 +229,10 @@ typedef struct zio_cksum_salt {
  * E           blkptr_t contains embedded data (see below)
  * lvl         level of indirection
  * type                DMU object type
- * phys birth  txg of block allocation; zero if same as logical birth txg
+ * phys birth  txg when dva[0] was written; zero if same as logical birth txg
+ *              note that typically all the dva's would be written in this
+ *              txg, but they could be different if they were moved by
+ *              device removal.
  * log. birth  transaction group in which the block was logically born
  * fill count  number of non-zero blocks under this bp
  * checksum[4] 256-bit checksum of the data this bp describes
@@ -407,6 +412,7 @@ typedef enum bp_embedded_type {
 
 #define        SPA_BLKPTRSHIFT 7               /* blkptr_t is 128 bytes        */
 #define        SPA_DVAS_PER_BP 3               /* Number of DVAs in a bp       */
+#define        SPA_SYNC_MIN_VDEVS 3            /* min vdevs to update during sync */
 
 /*
  * A block is a hole when it has either 1) never been written to, or
@@ -439,8 +445,9 @@ typedef struct blkptr {
 #define        DVA_GET_GRID(dva)       BF64_GET((dva)->dva_word[0], 24, 8)
 #define        DVA_SET_GRID(dva, x)    BF64_SET((dva)->dva_word[0], 24, 8, x)
 
-#define        DVA_GET_VDEV(dva)       BF64_GET((dva)->dva_word[0], 32, 32)
-#define        DVA_SET_VDEV(dva, x)    BF64_SET((dva)->dva_word[0], 32, 32, x)
+#define        DVA_GET_VDEV(dva)       BF64_GET((dva)->dva_word[0], 32, SPA_VDEVBITS)
+#define        DVA_SET_VDEV(dva, x)    \
+       BF64_SET((dva)->dva_word[0], 32, SPA_VDEVBITS, x)
 
 #define        DVA_GET_OFFSET(dva)     \
        BF64_GET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0)
@@ -743,6 +750,8 @@ extern int spa_import(char *pool, nvlist_t *config, nvlist_t *props,
     uint64_t flags);
 extern nvlist_t *spa_tryimport(nvlist_t *tryconfig);
 extern int spa_destroy(char *pool);
+extern int spa_checkpoint(const char *pool);
+extern int spa_checkpoint_discard(const char *pool);
 extern int spa_export(char *pool, nvlist_t **oldconfig, boolean_t force,
     boolean_t hardforce);
 extern int spa_reset(char *pool);
@@ -763,6 +772,7 @@ extern int spa_scan_get_stats(spa_t *spa, pool_scan_stat_t *ps);
 #define        SPA_ASYNC_AUTOEXPAND    0x20
 #define        SPA_ASYNC_REMOVE_DONE   0x40
 #define        SPA_ASYNC_REMOVE_STOP   0x80
+#define        SPA_ASYNC_INITIALIZE_RESTART    0x100
 
 /*
  * Controls the behavior of spa_vdev_remove().
@@ -778,6 +788,8 @@ extern int spa_vdev_detach(spa_t *spa, uint64_t guid, uint64_t pguid,
     int replace_done);
 extern int spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare);
 extern boolean_t spa_vdev_remove_active(spa_t *spa);
+extern int spa_vdev_initialize(spa_t *spa, nvlist_t *nv, uint64_t cmd_type,
+    nvlist_t *vdev_errlist);
 extern int spa_vdev_setpath(spa_t *spa, uint64_t guid, const char *newpath);
 extern int spa_vdev_setfru(spa_t *spa, uint64_t guid, const char *newfru);
 extern int spa_vdev_split_mirror(spa_t *spa, char *newname, nvlist_t *config,
@@ -817,7 +829,7 @@ extern kmutex_t spa_namespace_lock;
 #define        SPA_CONFIG_UPDATE_POOL  0
 #define        SPA_CONFIG_UPDATE_VDEVS 1
 
-extern void spa_config_sync(spa_t *, boolean_t, boolean_t);
+extern void spa_write_cachefile(spa_t *, boolean_t, boolean_t);
 extern void spa_config_load(void);
 extern nvlist_t *spa_all_configs(uint64_t *);
 extern void spa_config_set(spa_t *spa, nvlist_t *config);
@@ -854,21 +866,27 @@ extern boolean_t spa_refcount_zero(spa_t *spa);
 #define        SCL_STATE_ALL   (SCL_STATE | SCL_L2ARC | SCL_ZIO)
 
 /* Historical pool statistics */
-typedef struct spa_stats_history {
+typedef struct spa_history_kstat {
        kmutex_t                lock;
        uint64_t                count;
        uint64_t                size;
        kstat_t                 *kstat;
        void                    *private;
        list_t                  list;
-} spa_stats_history_t;
+} spa_history_kstat_t;
+
+typedef struct spa_history_list {
+       uint64_t                size;
+       procfs_list_t           procfs_list;
+} spa_history_list_t;
 
 typedef struct spa_stats {
-       spa_stats_history_t     read_history;
-       spa_stats_history_t     txg_history;
-       spa_stats_history_t     tx_assign_histogram;
-       spa_stats_history_t     io_history;
-       spa_stats_history_t     mmp_history;
+       spa_history_list_t      read_history;
+       spa_history_list_t      txg_history;
+       spa_history_kstat_t     tx_assign_histogram;
+       spa_history_kstat_t     io_history;
+       spa_history_list_t      mmp_history;
+       spa_history_kstat_t     state;          /* pool state */
 } spa_stats_t;
 
 typedef enum txg_state {
@@ -901,7 +919,7 @@ extern void spa_tx_assign_add_nsecs(spa_t *spa, uint64_t nsecs);
 extern int spa_mmp_history_set_skip(spa_t *spa, uint64_t mmp_kstat_id);
 extern int spa_mmp_history_set(spa_t *spa, uint64_t mmp_kstat_id, int io_error,
     hrtime_t duration);
-extern void *spa_mmp_history_add(spa_t *spa, uint64_t txg, uint64_t timestamp,
+extern void spa_mmp_history_add(spa_t *spa, uint64_t txg, uint64_t timestamp,
     uint64_t mmp_delay, vdev_t *vd, int label, uint64_t mmp_kstat_id,
     int error);
 
@@ -932,7 +950,7 @@ typedef enum spa_log_state {
 
 extern spa_log_state_t spa_get_log_state(spa_t *spa);
 extern void spa_set_log_state(spa_t *spa, spa_log_state_t state);
-extern int spa_offline_log(spa_t *spa);
+extern int spa_reset_logs(spa_t *spa);
 
 /* Log claim callback */
 extern void spa_claim_notify(zio_t *zio);
@@ -942,6 +960,7 @@ extern void spa_deadman(void *);
 extern boolean_t spa_shutting_down(spa_t *spa);
 extern struct dsl_pool *spa_get_dsl(spa_t *spa);
 extern boolean_t spa_is_initializing(spa_t *spa);
+extern boolean_t spa_indirect_vdevs_loaded(spa_t *spa);
 extern blkptr_t *spa_get_rootblkptr(spa_t *spa);
 extern void spa_set_rootblkptr(spa_t *spa, const blkptr_t *bp);
 extern void spa_altroot(spa_t *, char *, size_t);
@@ -959,12 +978,18 @@ extern spa_load_state_t spa_load_state(spa_t *spa);
 extern uint64_t spa_freeze_txg(spa_t *spa);
 extern uint64_t spa_get_worst_case_asize(spa_t *spa, uint64_t lsize);
 extern uint64_t spa_get_dspace(spa_t *spa);
+extern uint64_t spa_get_checkpoint_space(spa_t *spa);
 extern uint64_t spa_get_slop_space(spa_t *spa);
 extern void spa_update_dspace(spa_t *spa);
 extern uint64_t spa_version(spa_t *spa);
 extern boolean_t spa_deflate(spa_t *spa);
 extern metaslab_class_t *spa_normal_class(spa_t *spa);
 extern metaslab_class_t *spa_log_class(spa_t *spa);
+extern metaslab_class_t *spa_special_class(spa_t *spa);
+extern metaslab_class_t *spa_dedup_class(spa_t *spa);
+extern metaslab_class_t *spa_preferred_class(spa_t *spa, uint64_t size,
+    dmu_object_type_t objtype, uint_t level, uint_t special_smallblk);
+
 extern void spa_evicting_os_register(spa_t *, objset_t *os);
 extern void spa_evicting_os_deregister(spa_t *, objset_t *os);
 extern void spa_evicting_os_wait(spa_t *spa);
@@ -979,12 +1004,14 @@ extern uint64_t spa_delegation(spa_t *spa);
 extern objset_t *spa_meta_objset(spa_t *spa);
 extern uint64_t spa_deadman_synctime(spa_t *spa);
 extern uint64_t spa_deadman_ziotime(spa_t *spa);
+extern uint64_t spa_dirty_data(spa_t *spa);
 
 /* Miscellaneous support routines */
+extern void spa_load_failed(spa_t *spa, const char *fmt, ...);
+extern void spa_load_note(spa_t *spa, const char *fmt, ...);
 extern void spa_activate_mos_feature(spa_t *spa, const char *feature,
     dmu_tx_t *tx);
 extern void spa_deactivate_mos_feature(spa_t *spa, const char *feature);
-extern int spa_rename(const char *oldname, const char *newname);
 extern spa_t *spa_by_guid(uint64_t pool_guid, uint64_t device_guid);
 extern boolean_t spa_guid_exists(uint64_t pool_guid, uint64_t device_guid);
 extern char *spa_strdup(const char *);
@@ -1008,9 +1035,25 @@ extern boolean_t spa_writeable(spa_t *spa);
 extern boolean_t spa_has_pending_synctask(spa_t *spa);
 extern int spa_maxblocksize(spa_t *spa);
 extern int spa_maxdnodesize(spa_t *spa);
+extern boolean_t spa_has_checkpoint(spa_t *spa);
+extern boolean_t spa_importing_readonly_checkpoint(spa_t *spa);
+extern boolean_t spa_suspend_async_destroy(spa_t *spa);
+extern uint64_t spa_min_claim_txg(spa_t *spa);
 extern void zfs_blkptr_verify(spa_t *spa, const blkptr_t *bp);
+extern boolean_t zfs_dva_valid(spa_t *spa, const dva_t *dva,
+    const blkptr_t *bp);
+typedef void (*spa_remap_cb_t)(uint64_t vdev, uint64_t offset, uint64_t size,
+    void *arg);
+extern boolean_t spa_remap_blkptr(spa_t *spa, blkptr_t *bp,
+    spa_remap_cb_t callback, void *arg);
+extern uint64_t spa_get_last_removal_txg(spa_t *spa);
+extern boolean_t spa_trust_config(spa_t *spa);
+extern uint64_t spa_missing_tvds_allowed(spa_t *spa);
+extern void spa_set_missing_tvds(spa_t *spa, uint64_t missing);
+extern boolean_t spa_top_vdevs_spacemap_addressable(spa_t *spa);
 extern boolean_t spa_multihost(spa_t *spa);
 extern unsigned long spa_get_hostid(void);
+extern void spa_activate_allocation_classes(spa_t *, dmu_tx_t *);
 
 extern int spa_mode(spa_t *spa);
 extern uint64_t zfs_strtonum(const char *str, char **nptr);
@@ -1031,12 +1074,16 @@ extern void spa_history_log_internal_ds(struct dsl_dataset *ds, const char *op,
 extern void spa_history_log_internal_dd(dsl_dir_t *dd, const char *operation,
     dmu_tx_t *tx, const char *fmt, ...);
 
+extern const char *spa_state_to_name(spa_t *spa);
+
 /* error handling */
 struct zbookmark_phys;
 extern void spa_log_error(spa_t *spa, const zbookmark_phys_t *zb);
-extern void zfs_ereport_post(const char *class, spa_t *spa, vdev_t *vd,
+extern int zfs_ereport_post(const char *class, spa_t *spa, vdev_t *vd,
     const zbookmark_phys_t *zb, zio_t *zio, uint64_t stateoroffset,
     uint64_t length);
+extern boolean_t zfs_ereport_is_valid(const char *class, spa_t *spa, vdev_t *vd,
+    zio_t *zio);
 extern nvlist_t *zfs_event_create(spa_t *spa, vdev_t *vd, const char *type,
     const char *name, nvlist_t *aux);
 extern void zfs_post_remove(spa_t *spa, vdev_t *vd);
@@ -1085,13 +1132,6 @@ _NOTE(CONSTCOND) } while (0)
 #define        dprintf_bp(bp, fmt, ...)
 #endif
 
-extern boolean_t spa_debug_enabled(spa_t *spa);
-#define        spa_dbgmsg(spa, ...)                    \
-{                                              \
-       if (spa_debug_enabled(spa))             \
-               zfs_dbgmsg(__VA_ARGS__);        \
-}
-
 extern int spa_mode_global;                    /* mode, e.g. FREAD | FWRITE */
 extern int zfs_deadman_enabled;
 extern unsigned long zfs_deadman_synctime_ms;