]> git.proxmox.com Git - mirror_zfs-debian.git/blobdiff - include/sys/spa.h
New upstream version 0.7.2
[mirror_zfs-debian.git] / include / sys / spa.h
index bfd2e7902ea3cc52178d8e122c1c013533cfa702..de942ad2b5a40a9bcfda32ab6bbca5a3ce07e642 100644 (file)
  * Copyright (c) 2011, 2014 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.
  */
 
 #ifndef _SYS_SPA_H
@@ -35,6 +39,8 @@
 #include <sys/sysmacros.h>
 #include <sys/types.h>
 #include <sys/fs/zfs.h>
+#include <sys/spa_checksum.h>
+#include <sys/dmu.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -118,6 +124,17 @@ _NOTE(CONSTCOND) } while (0)
 #define        SPA_OLD_MAXBLOCKSIZE    (1ULL << SPA_OLD_MAXBLOCKSHIFT)
 #define        SPA_MAXBLOCKSIZE        (1ULL << SPA_MAXBLOCKSHIFT)
 
+/*
+ * Alignment Shift (ashift) is an immutable, internal top-level vdev property
+ * which can only be set at vdev creation time. Physical writes are always done
+ * according to it, which makes 2^ashift the smallest possible IO on a vdev.
+ *
+ * We currently allow values ranging from 512 bytes (2^9 = 512) to 64 KiB
+ * (2^16 = 65,536).
+ */
+#define        ASHIFT_MIN              9
+#define        ASHIFT_MAX              16
+
 /*
  * Size of block to hold the configuration data (a packed nvlist)
  */
@@ -134,6 +151,8 @@ _NOTE(CONSTCOND) } while (0)
 #define        SPA_PSIZEBITS           16      /* PSIZE up to 32M (2^16 * 512) */
 #define        SPA_ASIZEBITS           24      /* ASIZE up to 64 times larger  */
 
+#define        SPA_COMPRESSBITS        7
+
 /*
  * All SPA data is represented by 128-bit data virtual addresses (DVAs).
  * The members of the dva_t should be considered opaque outside the SPA.
@@ -142,12 +161,14 @@ typedef struct dva {
        uint64_t        dva_word[2];
 } dva_t;
 
+
 /*
- * Each block has a 256-bit checksum -- strong enough for cryptographic hashes.
+ * Some checksums/hashes need a 256-bit initialization salt. This salt is kept
+ * secret and is suitable for use in MAC algorithms as the key.
  */
-typedef struct zio_cksum {
-       uint64_t        zc_word[4];
-} zio_cksum_t;
+typedef struct zio_cksum_salt {
+       uint8_t         zcs_bytes[32];
+} zio_cksum_salt_t;
 
 /*
  * Each block is described by its DVAs, time of birth, checksum, etc.
@@ -368,8 +389,10 @@ _NOTE(CONSTCOND) } while (0)
            16, SPA_PSIZEBITS, SPA_MINBLOCKSHIFT, 1, x); \
 _NOTE(CONSTCOND) } while (0)
 
-#define        BP_GET_COMPRESS(bp)             BF64_GET((bp)->blk_prop, 32, 7)
-#define        BP_SET_COMPRESS(bp, x)          BF64_SET((bp)->blk_prop, 32, 7, x)
+#define        BP_GET_COMPRESS(bp)             \
+       BF64_GET((bp)->blk_prop, 32, SPA_COMPRESSBITS)
+#define        BP_SET_COMPRESS(bp, x)          \
+       BF64_SET((bp)->blk_prop, 32, SPA_COMPRESSBITS, x)
 
 #define        BP_IS_EMBEDDED(bp)              BF64_GET((bp)->blk_prop, 39, 1)
 #define        BP_SET_EMBEDDED(bp, x)          BF64_SET((bp)->blk_prop, 39, 1, x)
@@ -407,15 +430,17 @@ _NOTE(CONSTCOND) } while (0)
 
 #define        BP_GET_FILL(bp) (BP_IS_EMBEDDED(bp) ? 1 : (bp)->blk_fill)
 
+#define        BP_IS_METADATA(bp)      \
+       (BP_GET_LEVEL(bp) > 0 || DMU_OT_IS_METADATA(BP_GET_TYPE(bp)))
+
 #define        BP_GET_ASIZE(bp)        \
        (BP_IS_EMBEDDED(bp) ? 0 : \
        DVA_GET_ASIZE(&(bp)->blk_dva[0]) + \
        DVA_GET_ASIZE(&(bp)->blk_dva[1]) + \
        DVA_GET_ASIZE(&(bp)->blk_dva[2]))
 
-#define        BP_GET_UCSIZE(bp) \
-       ((BP_GET_LEVEL(bp) > 0 || DMU_OT_IS_METADATA(BP_GET_TYPE(bp))) ? \
-       BP_GET_PSIZE(bp) : BP_GET_LSIZE(bp))
+#define        BP_GET_UCSIZE(bp)       \
+       (BP_IS_METADATA(bp) ? BP_GET_PSIZE(bp) : BP_GET_LSIZE(bp))
 
 #define        BP_GET_NDVAS(bp)        \
        (BP_IS_EMBEDDED(bp) ? 0 : \
@@ -440,26 +465,9 @@ _NOTE(CONSTCOND) } while (0)
        DVA_EQUAL(&(bp1)->blk_dva[1], &(bp2)->blk_dva[1]) &&    \
        DVA_EQUAL(&(bp1)->blk_dva[2], &(bp2)->blk_dva[2]))
 
-#define        ZIO_CHECKSUM_EQUAL(zc1, zc2) \
-       (0 == (((zc1).zc_word[0] - (zc2).zc_word[0]) | \
-       ((zc1).zc_word[1] - (zc2).zc_word[1]) | \
-       ((zc1).zc_word[2] - (zc2).zc_word[2]) | \
-       ((zc1).zc_word[3] - (zc2).zc_word[3])))
-
-#define        ZIO_CHECKSUM_IS_ZERO(zc) \
-       (0 == ((zc)->zc_word[0] | (zc)->zc_word[1] | \
-       (zc)->zc_word[2] | (zc)->zc_word[3]))
 
 #define        DVA_IS_VALID(dva)       (DVA_GET_ASIZE(dva) != 0)
 
-#define        ZIO_SET_CHECKSUM(zcp, w0, w1, w2, w3)   \
-{                                              \
-       (zcp)->zc_word[0] = w0;                 \
-       (zcp)->zc_word[1] = w1;                 \
-       (zcp)->zc_word[2] = w2;                 \
-       (zcp)->zc_word[3] = w3;                 \
-}
-
 #define        BP_IDENTITY(bp)         (ASSERT(!BP_IS_EMBEDDED(bp)), &(bp)->blk_dva[0])
 #define        BP_IS_GANG(bp)          \
        (BP_IS_EMBEDDED(bp) ? B_FALSE : DVA_GET_GANG(BP_IDENTITY(bp)))
@@ -576,11 +584,8 @@ _NOTE(CONSTCOND) } while (0)
        ASSERT(len < size);                                             \
 }
 
-#include <sys/dmu.h>
-
 #define        BP_GET_BUFC_TYPE(bp)                                            \
-       (((BP_GET_LEVEL(bp) > 0) || (DMU_OT_IS_METADATA(BP_GET_TYPE(bp)))) ? \
-       ARC_BUFC_METADATA : ARC_BUFC_DATA)
+       (BP_IS_METADATA(bp) ? ARC_BUFC_METADATA : ARC_BUFC_DATA)
 
 typedef enum spa_import_type {
        SPA_IMPORT_EXISTING,
@@ -595,7 +600,6 @@ extern int spa_get_stats(const char *pool, nvlist_t **config, char *altroot,
     size_t buflen);
 extern int spa_create(const char *pool, nvlist_t *config, nvlist_t *props,
     nvlist_t *zplprops);
-extern int spa_import_rootpool(char *devpath, char *devid);
 extern int spa_import(char *pool, nvlist_t *config, nvlist_t *props,
     uint64_t flags);
 extern nvlist_t *spa_tryimport(nvlist_t *tryconfig);
@@ -656,6 +660,7 @@ extern void spa_l2cache_drop(spa_t *spa);
 /* scanning */
 extern int spa_scan(spa_t *spa, pool_scan_func_t func);
 extern int spa_scan_stop(spa_t *spa);
+extern int spa_scrub_pause_resume(spa_t *spa, pool_scrub_cmd_t flag);
 
 /* spa syncing */
 extern void spa_sync(spa_t *spa, uint64_t txg); /* only for DMU use */
@@ -724,6 +729,7 @@ typedef struct spa_stats {
        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_stats_t;
 
 typedef enum txg_state {
@@ -735,6 +741,13 @@ typedef enum txg_state {
        TXG_STATE_COMMITTED     = 5,
 } txg_state_t;
 
+typedef struct txg_stat {
+       vdev_stat_t             vs1;
+       vdev_stat_t             vs2;
+       uint64_t                txg;
+       uint64_t                ndirty;
+} txg_stat_t;
+
 extern void spa_stats_init(spa_t *spa);
 extern void spa_stats_destroy(spa_t *spa);
 extern void spa_read_history_add(spa_t *spa, const zbookmark_phys_t *zb,
@@ -742,9 +755,12 @@ extern void spa_read_history_add(spa_t *spa, const zbookmark_phys_t *zb,
 extern void spa_txg_history_add(spa_t *spa, uint64_t txg, hrtime_t birth_time);
 extern int spa_txg_history_set(spa_t *spa,  uint64_t txg,
     txg_state_t completed_state, hrtime_t completed_time);
-extern int spa_txg_history_set_io(spa_t *spa,  uint64_t txg, uint64_t nread,
-    uint64_t nwritten, uint64_t reads, uint64_t writes, uint64_t ndirty);
+extern txg_stat_t *spa_txg_history_init_io(spa_t *, uint64_t,
+    struct dsl_pool *);
+extern void spa_txg_history_fini_io(spa_t *, txg_stat_t *);
 extern void spa_tx_assign_add_nsecs(spa_t *spa, uint64_t nsecs);
+extern void spa_mmp_history_add(uint64_t txg, uint64_t timestamp,
+    uint64_t mmp_delay, vdev_t *vd, int label);
 
 /* Pool configuration locks */
 extern int spa_config_tryenter(spa_t *spa, int locks, void *tag, krw_t rw);
@@ -793,11 +809,12 @@ extern uint64_t spa_load_guid(spa_t *spa);
 extern uint64_t spa_last_synced_txg(spa_t *spa);
 extern uint64_t spa_first_txg(spa_t *spa);
 extern uint64_t spa_syncing_txg(spa_t *spa);
+extern uint64_t spa_final_dirty_txg(spa_t *spa);
 extern uint64_t spa_version(spa_t *spa);
 extern pool_state_t spa_state(spa_t *spa);
 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_asize(spa_t *spa, uint64_t lsize);
+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_slop_space(spa_t *spa);
 extern void spa_update_dspace(spa_t *spa);
@@ -844,10 +861,13 @@ extern boolean_t spa_is_root(spa_t *spa);
 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 void zfs_blkptr_verify(spa_t *spa, const blkptr_t *bp);
+extern boolean_t spa_multihost(spa_t *spa);
+extern unsigned long spa_get_hostid(void);
 
 extern int spa_mode(spa_t *spa);
-extern uint64_t strtonum(const char *str, char **nptr);
+extern uint64_t zfs_strtonum(const char *str, char **nptr);
 
 extern char *spa_his_ievent_table[];
 
@@ -869,8 +889,10 @@ struct zbookmark_phys;
 extern void spa_log_error(spa_t *spa, zio_t *zio);
 extern void zfs_ereport_post(const char *class, spa_t *spa, vdev_t *vd,
     zio_t *zio, uint64_t stateoroffset, uint64_t length);
+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);
-extern void zfs_post_state_change(spa_t *spa, vdev_t *vd);
+extern void zfs_post_state_change(spa_t *spa, vdev_t *vd, uint64_t laststate);
 extern void zfs_post_autoreplace(spa_t *spa, vdev_t *vd);
 extern uint64_t spa_get_errlog_size(spa_t *spa);
 extern int spa_get_errlog(spa_t *spa, void *uaddr, size_t *count);
@@ -895,7 +917,8 @@ extern void spa_prop_clear_bootfs(spa_t *spa, uint64_t obj, dmu_tx_t *tx);
 extern void spa_configfile_set(spa_t *, nvlist_t *, boolean_t);
 
 /* asynchronous event notification */
-extern void spa_event_notify(spa_t *spa, vdev_t *vdev, const char *name);
+extern void spa_event_notify(spa_t *spa, vdev_t *vdev, nvlist_t *hist_nvl,
+    const char *name);
 
 #ifdef ZFS_DEBUG
 #define        dprintf_bp(bp, fmt, ...) do {                           \