mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +03:00
OpenZFS 6736 - ZFS per-vdev ZAPs
6736 ZFS per-vdev ZAPs Reviewed by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: John Kennedy <john.kennedy@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Don Brady <don.brady@intel.com> Reviewed by: Dan McDonald <danmcd@omniti.com> References: https://www.illumos.org/issues/6736 https://github.com/openzfs/openzfs/commit/215198a Ported-by: Don Brady <don.brady@intel.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #4515
This commit is contained in:
committed by
Brian Behlendorf
parent
4cd77889b6
commit
e0ab3ab553
@@ -315,6 +315,7 @@ typedef struct dmu_buf {
|
||||
#define DMU_POOL_FREE_BPOBJ "free_bpobj"
|
||||
#define DMU_POOL_BPTREE_OBJ "bptree_obj"
|
||||
#define DMU_POOL_EMPTY_BPOBJ "empty_bpobj"
|
||||
#define DMU_POOL_VDEV_ZAP_MAP "com.delphix:vdev_zap_map"
|
||||
|
||||
/*
|
||||
* Allocate an object from this objset. The range of object numbers
|
||||
|
||||
@@ -566,6 +566,9 @@ typedef struct zpool_rewind_policy {
|
||||
#define ZPOOL_CONFIG_FEATURES_FOR_READ "features_for_read"
|
||||
#define ZPOOL_CONFIG_FEATURE_STATS "feature_stats" /* not stored on disk */
|
||||
#define ZPOOL_CONFIG_ERRATA "errata" /* not stored on disk */
|
||||
#define ZPOOL_CONFIG_VDEV_TOP_ZAP "com.delphix:vdev_zap_top"
|
||||
#define ZPOOL_CONFIG_VDEV_LEAF_ZAP "com.delphix:vdev_zap_leaf"
|
||||
#define ZPOOL_CONFIG_HAS_PER_VDEV_ZAPS "com.delphix:has_per_vdev_zaps"
|
||||
/*
|
||||
* The persistent vdev state is stored as separate values rather than a single
|
||||
* 'vdev_state' entry. This is because a device can be in multiple states, such
|
||||
|
||||
@@ -116,6 +116,12 @@ typedef struct spa_taskqs {
|
||||
taskq_t **stqs_taskq;
|
||||
} spa_taskqs_t;
|
||||
|
||||
typedef enum spa_all_vdev_zap_action {
|
||||
AVZ_ACTION_NONE = 0,
|
||||
AVZ_ACTION_DESTROY, /* Destroy all per-vdev ZAPs and the AVZ. */
|
||||
AVZ_ACTION_REBUILD /* Populate the new AVZ, see spa_avz_rebuild */
|
||||
} spa_avz_action_t;
|
||||
|
||||
struct spa {
|
||||
/*
|
||||
* Fields protected by spa_namespace_lock.
|
||||
@@ -251,6 +257,8 @@ struct spa {
|
||||
uint64_t spa_deadman_calls; /* number of deadman calls */
|
||||
hrtime_t spa_sync_starttime; /* starting time of spa_sync */
|
||||
uint64_t spa_deadman_synctime; /* deadman expiration timer */
|
||||
uint64_t spa_all_vdev_zaps; /* ZAP of per-vd ZAP obj #s */
|
||||
spa_avz_action_t spa_avz_action; /* destroy/rebuild AVZ? */
|
||||
uint64_t spa_errata; /* errata issues detected */
|
||||
spa_stats_t spa_stats; /* assorted spa statistics */
|
||||
hrtime_t spa_ccw_fail_time; /* Conf cache write fail time */
|
||||
|
||||
+6
-1
@@ -70,6 +70,10 @@ extern void vdev_dtl_reassess(vdev_t *vd, uint64_t txg, uint64_t scrub_txg,
|
||||
extern boolean_t vdev_dtl_required(vdev_t *vd);
|
||||
extern boolean_t vdev_resilver_needed(vdev_t *vd,
|
||||
uint64_t *minp, uint64_t *maxp);
|
||||
extern void vdev_destroy_unlink_zap(vdev_t *vd, uint64_t zapobj,
|
||||
dmu_tx_t *tx);
|
||||
extern uint64_t vdev_create_link_zap(vdev_t *vd, dmu_tx_t *tx);
|
||||
extern void vdev_construct_zaps(vdev_t *vd, dmu_tx_t *tx);
|
||||
|
||||
extern void vdev_hold(vdev_t *);
|
||||
extern void vdev_rele(vdev_t *);
|
||||
@@ -133,7 +137,8 @@ extern void vdev_state_clean(vdev_t *vd);
|
||||
typedef enum vdev_config_flag {
|
||||
VDEV_CONFIG_SPARE = 1 << 0,
|
||||
VDEV_CONFIG_L2CACHE = 1 << 1,
|
||||
VDEV_CONFIG_REMOVING = 1 << 2
|
||||
VDEV_CONFIG_REMOVING = 1 << 2,
|
||||
VDEV_CONFIG_MOS = 1 << 3
|
||||
} vdev_config_flag_t;
|
||||
|
||||
extern void vdev_top_config_generate(spa_t *spa, nvlist_t *config);
|
||||
|
||||
@@ -177,6 +177,7 @@ struct vdev {
|
||||
uint64_t vdev_islog; /* is an intent log device */
|
||||
uint64_t vdev_removing; /* device is being removed? */
|
||||
boolean_t vdev_ishole; /* is a hole in the namespace */
|
||||
uint64_t vdev_top_zap;
|
||||
|
||||
/*
|
||||
* Leaf vdev state.
|
||||
@@ -215,6 +216,7 @@ struct vdev {
|
||||
spa_aux_vdev_t *vdev_aux; /* for l2cache and spares vdevs */
|
||||
zio_t *vdev_probe_zio; /* root of current probe */
|
||||
vdev_aux_t vdev_label_aux; /* on-disk aux state */
|
||||
uint64_t vdev_leaf_zap;
|
||||
|
||||
/*
|
||||
* For DTrace to work in userland (libzpool) context, these fields must
|
||||
|
||||
Reference in New Issue
Block a user