diff options
author | Jeff Bonwick <Jeff.Bonwick@Sun.COM> | 2009-11-19 22:24:55 -0800 |
---|---|---|
committer | Jeff Bonwick <Jeff.Bonwick@Sun.COM> | 2009-11-19 22:24:55 -0800 |
commit | bbfd46c40e81c7d954cec28db66453ec5ab44613 (patch) | |
tree | 86844cfe509130c1a9b2502fac9b063cf6242a9b /usr/src/uts/common/fs/zfs/sys | |
parent | 68e92846614d4b32eb1a814a5e8e77331cfaaa59 (diff) | |
download | illumos-joyent-bbfd46c40e81c7d954cec28db66453ec5ab44613.tar.gz |
6899923 vdev_offline/vdev_add deadlock
6900497 zdb -S could be much faster
6900898 deduped blocks should be scrubbed/resilvered exactly once
Diffstat (limited to 'usr/src/uts/common/fs/zfs/sys')
-rw-r--r-- | usr/src/uts/common/fs/zfs/sys/ddt.h | 23 | ||||
-rw-r--r-- | usr/src/uts/common/fs/zfs/sys/dmu.h | 4 | ||||
-rw-r--r-- | usr/src/uts/common/fs/zfs/sys/dmu_traverse.h | 7 | ||||
-rw-r--r-- | usr/src/uts/common/fs/zfs/sys/dsl_pool.h | 10 |
4 files changed, 34 insertions, 10 deletions
diff --git a/usr/src/uts/common/fs/zfs/sys/ddt.h b/usr/src/uts/common/fs/zfs/sys/ddt.h index aed141eb81..7dbb62a597 100644 --- a/usr/src/uts/common/fs/zfs/sys/ddt.h +++ b/usr/src/uts/common/fs/zfs/sys/ddt.h @@ -153,6 +153,19 @@ struct ddt { avl_node_t ddt_node; }; +/* + * In-core and on-disk bookmark for DDT walks + */ +typedef struct ddt_bookmark { + uint64_t ddb_class; + uint64_t ddb_type; + uint64_t ddb_checksum; + uint64_t ddb_cursor; +} ddt_bookmark_t; + +/* + * Ops vector to access a specific DDT object type. + */ typedef struct ddt_ops { char ddt_op_name[32]; int (*ddt_op_create)(objset_t *os, uint64_t *object, dmu_tx_t *tx, @@ -173,7 +186,7 @@ typedef struct ddt_ops { extern void ddt_object_name(ddt_t *ddt, enum ddt_type type, enum ddt_class class, char *name); extern int ddt_object_walk(ddt_t *ddt, enum ddt_type type, - enum ddt_class class, ddt_entry_t *dde, uint64_t *walk); + enum ddt_class class, uint64_t *walk, ddt_entry_t *dde); extern uint64_t ddt_object_count(ddt_t *ddt, enum ddt_type type, enum ddt_class class); extern int ddt_object_info(ddt_t *ddt, enum ddt_type type, @@ -183,7 +196,7 @@ extern boolean_t ddt_object_exists(ddt_t *ddt, enum ddt_type type, extern void ddt_bp_fill(const ddt_phys_t *ddp, blkptr_t *bp, uint64_t txg); -extern void ddt_bp_create(const ddt_t *ddt, const ddt_key_t *ddk, +extern void ddt_bp_create(enum zio_checksum checksum, const ddt_key_t *ddk, const ddt_phys_t *ddp, blkptr_t *bp); extern void ddt_key_fill(ddt_key_t *ddk, const blkptr_t *bp); @@ -214,13 +227,14 @@ extern size_t ddt_compress(void *src, uchar_t *dst, size_t s_len, size_t d_len); extern void ddt_decompress(uchar_t *src, void *dst, size_t s_len, size_t d_len); extern ddt_t *ddt_select(spa_t *spa, const blkptr_t *bp); -extern ddt_t *ddt_select_by_checksum(spa_t *spa, enum zio_checksum c); - extern void ddt_enter(ddt_t *ddt); extern void ddt_exit(ddt_t *ddt); extern ddt_entry_t *ddt_lookup(ddt_t *ddt, const blkptr_t *bp, boolean_t add); extern void ddt_remove(ddt_t *ddt, ddt_entry_t *dde); +extern boolean_t ddt_class_contains(spa_t *spa, enum ddt_class max_class, + const blkptr_t *bp); + extern ddt_entry_t *ddt_repair_start(ddt_t *ddt, const blkptr_t *bp); extern void ddt_repair_done(ddt_t *ddt, ddt_entry_t *dde); @@ -230,6 +244,7 @@ extern void ddt_create(spa_t *spa); extern int ddt_load(spa_t *spa); extern void ddt_unload(spa_t *spa); extern void ddt_sync(spa_t *spa, uint64_t txg); +extern int ddt_walk(spa_t *spa, ddt_bookmark_t *ddb, ddt_entry_t *dde); extern const ddt_ops_t ddt_zap_ops; diff --git a/usr/src/uts/common/fs/zfs/sys/dmu.h b/usr/src/uts/common/fs/zfs/sys/dmu.h index 61366986a9..f7a3b2cd44 100644 --- a/usr/src/uts/common/fs/zfs/sys/dmu.h +++ b/usr/src/uts/common/fs/zfs/sys/dmu.h @@ -211,6 +211,10 @@ typedef void dmu_buf_evict_func_t(struct dmu_buf *db, void *user_ptr); /* 4x8 zbookmark_t */ #define DMU_POOL_SCRUB_BOOKMARK "scrub_bookmark" +/* 4x8 ddt_bookmark_t */ +#define DMU_POOL_SCRUB_DDT_BOOKMARK "scrub_ddt_bookmark" +/* 1x8 max_class */ +#define DMU_POOL_SCRUB_DDT_CLASS_MAX "scrub_ddt_class_max" /* 1x8 zap obj DMU_OT_SCRUB_QUEUE */ #define DMU_POOL_SCRUB_QUEUE "scrub_queue" /* 1x8 txg */ diff --git a/usr/src/uts/common/fs/zfs/sys/dmu_traverse.h b/usr/src/uts/common/fs/zfs/sys/dmu_traverse.h index 04b793dc40..e51d9bb5a7 100644 --- a/usr/src/uts/common/fs/zfs/sys/dmu_traverse.h +++ b/usr/src/uts/common/fs/zfs/sys/dmu_traverse.h @@ -47,9 +47,10 @@ typedef int (blkptr_cb_t)(spa_t *spa, zilog_t *zilog, const blkptr_t *bp, #define TRAVERSE_PREFETCH_DATA (1<<3) #define TRAVERSE_PREFETCH (TRAVERSE_PREFETCH_METADATA | TRAVERSE_PREFETCH_DATA) -int traverse_dataset(struct dsl_dataset *ds, uint64_t txg_start, - int flags, blkptr_cb_t func, void *arg); -int traverse_pool(spa_t *spa, blkptr_cb_t func, void *arg, uint64_t txg_start); +int traverse_dataset(struct dsl_dataset *ds, + uint64_t txg_start, int flags, blkptr_cb_t func, void *arg); +int traverse_pool(spa_t *spa, + uint64_t txg_start, int flags, blkptr_cb_t func, void *arg); #ifdef __cplusplus } diff --git a/usr/src/uts/common/fs/zfs/sys/dsl_pool.h b/usr/src/uts/common/fs/zfs/sys/dsl_pool.h index 78d97526db..1afbc3813b 100644 --- a/usr/src/uts/common/fs/zfs/sys/dsl_pool.h +++ b/usr/src/uts/common/fs/zfs/sys/dsl_pool.h @@ -32,6 +32,7 @@ #include <sys/zfs_context.h> #include <sys/zio.h> #include <sys/dnode.h> +#include <sys/ddt.h> #ifdef __cplusplus extern "C" { @@ -96,13 +97,14 @@ typedef struct dsl_pool { uint64_t dp_scrub_queue_obj; uint64_t dp_scrub_min_txg; uint64_t dp_scrub_max_txg; + uint64_t dp_scrub_start_time; + uint64_t dp_scrub_ddt_class_max; zbookmark_t dp_scrub_bookmark; + ddt_bookmark_t dp_scrub_ddt_bookmark; boolean_t dp_scrub_pausing; boolean_t dp_scrub_isresilver; - uint64_t dp_scrub_start_time; - kmutex_t dp_scrub_cancel_lock; /* protects dp_scrub_restart */ boolean_t dp_scrub_restart; - boolean_t dp_scrub_ditto; + kmutex_t dp_scrub_cancel_lock; /* protects dp_scrub_restart */ /* Has its own locking */ tx_state_t dp_tx; @@ -145,6 +147,8 @@ int dsl_pool_scrub_cancel(dsl_pool_t *dp); int dsl_pool_scrub_clean(dsl_pool_t *dp); void dsl_pool_scrub_sync(dsl_pool_t *dp, dmu_tx_t *tx); void dsl_pool_scrub_restart(dsl_pool_t *dp); +void dsl_pool_scrub_ddt_entry(dsl_pool_t *dp, enum zio_checksum checksum, + const ddt_entry_t *dde); taskq_t *dsl_pool_vnrele_taskq(dsl_pool_t *dp); |