Skip to content

Commit e0ab3ab

Browse files
Joe Steinbehlendorf
authored andcommitted
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 openzfs/openzfs@215198a Ported-by: Don Brady <don.brady@intel.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #4515
1 parent 4cd7788 commit e0ab3ab

24 files changed

+980
-75
lines changed

configure.ac

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ AC_CONFIG_FILES([
266266
tests/zfs-tests/tests/functional/threadsappend/Makefile
267267
tests/zfs-tests/tests/functional/truncate/Makefile
268268
tests/zfs-tests/tests/functional/userquota/Makefile
269+
tests/zfs-tests/tests/functional/vdev_zaps/Makefile
269270
tests/zfs-tests/tests/functional/write_dirs/Makefile
270271
tests/zfs-tests/tests/functional/xattr/Makefile
271272
tests/zfs-tests/tests/functional/zvol/Makefile

include/sys/dmu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ typedef struct dmu_buf {
315315
#define DMU_POOL_FREE_BPOBJ "free_bpobj"
316316
#define DMU_POOL_BPTREE_OBJ "bptree_obj"
317317
#define DMU_POOL_EMPTY_BPOBJ "empty_bpobj"
318+
#define DMU_POOL_VDEV_ZAP_MAP "com.delphix:vdev_zap_map"
318319

319320
/*
320321
* Allocate an object from this objset. The range of object numbers

include/sys/fs/zfs.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,9 @@ typedef struct zpool_rewind_policy {
566566
#define ZPOOL_CONFIG_FEATURES_FOR_READ "features_for_read"
567567
#define ZPOOL_CONFIG_FEATURE_STATS "feature_stats" /* not stored on disk */
568568
#define ZPOOL_CONFIG_ERRATA "errata" /* not stored on disk */
569+
#define ZPOOL_CONFIG_VDEV_TOP_ZAP "com.delphix:vdev_zap_top"
570+
#define ZPOOL_CONFIG_VDEV_LEAF_ZAP "com.delphix:vdev_zap_leaf"
571+
#define ZPOOL_CONFIG_HAS_PER_VDEV_ZAPS "com.delphix:has_per_vdev_zaps"
569572
/*
570573
* The persistent vdev state is stored as separate values rather than a single
571574
* 'vdev_state' entry. This is because a device can be in multiple states, such

include/sys/spa_impl.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,12 @@ typedef struct spa_taskqs {
116116
taskq_t **stqs_taskq;
117117
} spa_taskqs_t;
118118

119+
typedef enum spa_all_vdev_zap_action {
120+
AVZ_ACTION_NONE = 0,
121+
AVZ_ACTION_DESTROY, /* Destroy all per-vdev ZAPs and the AVZ. */
122+
AVZ_ACTION_REBUILD /* Populate the new AVZ, see spa_avz_rebuild */
123+
} spa_avz_action_t;
124+
119125
struct spa {
120126
/*
121127
* Fields protected by spa_namespace_lock.
@@ -251,6 +257,8 @@ struct spa {
251257
uint64_t spa_deadman_calls; /* number of deadman calls */
252258
hrtime_t spa_sync_starttime; /* starting time of spa_sync */
253259
uint64_t spa_deadman_synctime; /* deadman expiration timer */
260+
uint64_t spa_all_vdev_zaps; /* ZAP of per-vd ZAP obj #s */
261+
spa_avz_action_t spa_avz_action; /* destroy/rebuild AVZ? */
254262
uint64_t spa_errata; /* errata issues detected */
255263
spa_stats_t spa_stats; /* assorted spa statistics */
256264
hrtime_t spa_ccw_fail_time; /* Conf cache write fail time */

include/sys/vdev.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ extern void vdev_dtl_reassess(vdev_t *vd, uint64_t txg, uint64_t scrub_txg,
7070
extern boolean_t vdev_dtl_required(vdev_t *vd);
7171
extern boolean_t vdev_resilver_needed(vdev_t *vd,
7272
uint64_t *minp, uint64_t *maxp);
73+
extern void vdev_destroy_unlink_zap(vdev_t *vd, uint64_t zapobj,
74+
dmu_tx_t *tx);
75+
extern uint64_t vdev_create_link_zap(vdev_t *vd, dmu_tx_t *tx);
76+
extern void vdev_construct_zaps(vdev_t *vd, dmu_tx_t *tx);
7377

7478
extern void vdev_hold(vdev_t *);
7579
extern void vdev_rele(vdev_t *);
@@ -133,7 +137,8 @@ extern void vdev_state_clean(vdev_t *vd);
133137
typedef enum vdev_config_flag {
134138
VDEV_CONFIG_SPARE = 1 << 0,
135139
VDEV_CONFIG_L2CACHE = 1 << 1,
136-
VDEV_CONFIG_REMOVING = 1 << 2
140+
VDEV_CONFIG_REMOVING = 1 << 2,
141+
VDEV_CONFIG_MOS = 1 << 3
137142
} vdev_config_flag_t;
138143

139144
extern void vdev_top_config_generate(spa_t *spa, nvlist_t *config);

include/sys/vdev_impl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ struct vdev {
177177
uint64_t vdev_islog; /* is an intent log device */
178178
uint64_t vdev_removing; /* device is being removed? */
179179
boolean_t vdev_ishole; /* is a hole in the namespace */
180+
uint64_t vdev_top_zap;
180181

181182
/*
182183
* Leaf vdev state.
@@ -215,6 +216,7 @@ struct vdev {
215216
spa_aux_vdev_t *vdev_aux; /* for l2cache and spares vdevs */
216217
zio_t *vdev_probe_zio; /* root of current probe */
217218
vdev_aux_t vdev_label_aux; /* on-disk aux state */
219+
uint64_t vdev_leaf_zap;
218220

219221
/*
220222
* For DTrace to work in userland (libzpool) context, these fields must

0 commit comments

Comments
 (0)