110922SJeff.Bonwick@Sun.COM /* 210922SJeff.Bonwick@Sun.COM * CDDL HEADER START 310922SJeff.Bonwick@Sun.COM * 410922SJeff.Bonwick@Sun.COM * The contents of this file are subject to the terms of the 510922SJeff.Bonwick@Sun.COM * Common Development and Distribution License (the "License"). 610922SJeff.Bonwick@Sun.COM * You may not use this file except in compliance with the License. 710922SJeff.Bonwick@Sun.COM * 810922SJeff.Bonwick@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 910922SJeff.Bonwick@Sun.COM * or http://www.opensolaris.org/os/licensing. 1010922SJeff.Bonwick@Sun.COM * See the License for the specific language governing permissions 1110922SJeff.Bonwick@Sun.COM * and limitations under the License. 1210922SJeff.Bonwick@Sun.COM * 1310922SJeff.Bonwick@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 1410922SJeff.Bonwick@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1510922SJeff.Bonwick@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 1610922SJeff.Bonwick@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 1710922SJeff.Bonwick@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 1810922SJeff.Bonwick@Sun.COM * 1910922SJeff.Bonwick@Sun.COM * CDDL HEADER END 2010922SJeff.Bonwick@Sun.COM */ 2110922SJeff.Bonwick@Sun.COM /* 2212296SLin.Ling@Sun.COM * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. 2310922SJeff.Bonwick@Sun.COM */ 2410922SJeff.Bonwick@Sun.COM 2510922SJeff.Bonwick@Sun.COM #ifndef _SYS_DDT_H 2610922SJeff.Bonwick@Sun.COM #define _SYS_DDT_H 2710922SJeff.Bonwick@Sun.COM 2810922SJeff.Bonwick@Sun.COM #include <sys/sysmacros.h> 2910922SJeff.Bonwick@Sun.COM #include <sys/types.h> 3010922SJeff.Bonwick@Sun.COM #include <sys/fs/zfs.h> 3110922SJeff.Bonwick@Sun.COM #include <sys/zio.h> 3210922SJeff.Bonwick@Sun.COM #include <sys/dmu.h> 3310922SJeff.Bonwick@Sun.COM 3410922SJeff.Bonwick@Sun.COM #ifdef __cplusplus 3510922SJeff.Bonwick@Sun.COM extern "C" { 3610922SJeff.Bonwick@Sun.COM #endif 3710922SJeff.Bonwick@Sun.COM 3810922SJeff.Bonwick@Sun.COM /* 3910922SJeff.Bonwick@Sun.COM * On-disk DDT formats, in the desired search order (newest version first). 4010922SJeff.Bonwick@Sun.COM */ 4110922SJeff.Bonwick@Sun.COM enum ddt_type { 4210922SJeff.Bonwick@Sun.COM DDT_TYPE_ZAP = 0, 4310922SJeff.Bonwick@Sun.COM DDT_TYPES 4410922SJeff.Bonwick@Sun.COM }; 4510922SJeff.Bonwick@Sun.COM 4610922SJeff.Bonwick@Sun.COM /* 4710922SJeff.Bonwick@Sun.COM * DDT classes, in the desired search order (highest replication level first). 4810922SJeff.Bonwick@Sun.COM */ 4910922SJeff.Bonwick@Sun.COM enum ddt_class { 5010922SJeff.Bonwick@Sun.COM DDT_CLASS_DITTO = 0, 5110922SJeff.Bonwick@Sun.COM DDT_CLASS_DUPLICATE, 5210922SJeff.Bonwick@Sun.COM DDT_CLASS_UNIQUE, 5310922SJeff.Bonwick@Sun.COM DDT_CLASSES 5410922SJeff.Bonwick@Sun.COM }; 5510922SJeff.Bonwick@Sun.COM 5610922SJeff.Bonwick@Sun.COM #define DDT_TYPE_CURRENT 0 5710922SJeff.Bonwick@Sun.COM 5810922SJeff.Bonwick@Sun.COM #define DDT_COMPRESS_BYTEORDER_MASK 0x80 5910922SJeff.Bonwick@Sun.COM #define DDT_COMPRESS_FUNCTION_MASK 0x7f 6010922SJeff.Bonwick@Sun.COM 6110922SJeff.Bonwick@Sun.COM /* 6210922SJeff.Bonwick@Sun.COM * On-disk ddt entry: key (name) and physical storage (value). 6310922SJeff.Bonwick@Sun.COM */ 6410922SJeff.Bonwick@Sun.COM typedef struct ddt_key { 6510922SJeff.Bonwick@Sun.COM zio_cksum_t ddk_cksum; /* 256-bit block checksum */ 6610922SJeff.Bonwick@Sun.COM uint64_t ddk_prop; /* LSIZE, PSIZE, compression */ 6710922SJeff.Bonwick@Sun.COM } ddt_key_t; 6810922SJeff.Bonwick@Sun.COM 6910922SJeff.Bonwick@Sun.COM /* 7010922SJeff.Bonwick@Sun.COM * ddk_prop layout: 7110922SJeff.Bonwick@Sun.COM * 7210922SJeff.Bonwick@Sun.COM * +-------+-------+-------+-------+-------+-------+-------+-------+ 7310922SJeff.Bonwick@Sun.COM * | 0 | 0 | 0 | comp | PSIZE | LSIZE | 7410922SJeff.Bonwick@Sun.COM * +-------+-------+-------+-------+-------+-------+-------+-------+ 7510922SJeff.Bonwick@Sun.COM */ 7610922SJeff.Bonwick@Sun.COM #define DDK_GET_LSIZE(ddk) \ 7710922SJeff.Bonwick@Sun.COM BF64_GET_SB((ddk)->ddk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1) 7810922SJeff.Bonwick@Sun.COM #define DDK_SET_LSIZE(ddk, x) \ 7910922SJeff.Bonwick@Sun.COM BF64_SET_SB((ddk)->ddk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1, x) 8010922SJeff.Bonwick@Sun.COM 8110922SJeff.Bonwick@Sun.COM #define DDK_GET_PSIZE(ddk) \ 8210922SJeff.Bonwick@Sun.COM BF64_GET_SB((ddk)->ddk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1) 8310922SJeff.Bonwick@Sun.COM #define DDK_SET_PSIZE(ddk, x) \ 8410922SJeff.Bonwick@Sun.COM BF64_SET_SB((ddk)->ddk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1, x) 8510922SJeff.Bonwick@Sun.COM 8610922SJeff.Bonwick@Sun.COM #define DDK_GET_COMPRESS(ddk) BF64_GET((ddk)->ddk_prop, 32, 8) 8710922SJeff.Bonwick@Sun.COM #define DDK_SET_COMPRESS(ddk, x) BF64_SET((ddk)->ddk_prop, 32, 8, x) 8810922SJeff.Bonwick@Sun.COM 8910922SJeff.Bonwick@Sun.COM #define DDT_KEY_WORDS (sizeof (ddt_key_t) / sizeof (uint64_t)) 9010922SJeff.Bonwick@Sun.COM 9110922SJeff.Bonwick@Sun.COM typedef struct ddt_phys { 9210922SJeff.Bonwick@Sun.COM dva_t ddp_dva[SPA_DVAS_PER_BP]; 9310922SJeff.Bonwick@Sun.COM uint64_t ddp_refcnt; 9410922SJeff.Bonwick@Sun.COM uint64_t ddp_phys_birth; 9510922SJeff.Bonwick@Sun.COM } ddt_phys_t; 9610922SJeff.Bonwick@Sun.COM 9710922SJeff.Bonwick@Sun.COM enum ddt_phys_type { 9810922SJeff.Bonwick@Sun.COM DDT_PHYS_DITTO = 0, 9910922SJeff.Bonwick@Sun.COM DDT_PHYS_SINGLE = 1, 10010922SJeff.Bonwick@Sun.COM DDT_PHYS_DOUBLE = 2, 10110922SJeff.Bonwick@Sun.COM DDT_PHYS_TRIPLE = 3, 10210922SJeff.Bonwick@Sun.COM DDT_PHYS_TYPES 10311938SGeorge.Wilson@Sun.COM }; 10410922SJeff.Bonwick@Sun.COM 10510922SJeff.Bonwick@Sun.COM /* 10610922SJeff.Bonwick@Sun.COM * In-core ddt entry 10710922SJeff.Bonwick@Sun.COM */ 10810922SJeff.Bonwick@Sun.COM struct ddt_entry { 10910922SJeff.Bonwick@Sun.COM ddt_key_t dde_key; 11010922SJeff.Bonwick@Sun.COM ddt_phys_t dde_phys[DDT_PHYS_TYPES]; 11110922SJeff.Bonwick@Sun.COM zio_t *dde_lead_zio[DDT_PHYS_TYPES]; 11210922SJeff.Bonwick@Sun.COM void *dde_repair_data; 11310922SJeff.Bonwick@Sun.COM enum ddt_type dde_type; 11410922SJeff.Bonwick@Sun.COM enum ddt_class dde_class; 11510922SJeff.Bonwick@Sun.COM uint8_t dde_loading; 11610922SJeff.Bonwick@Sun.COM uint8_t dde_loaded; 11710922SJeff.Bonwick@Sun.COM kcondvar_t dde_cv; 11810922SJeff.Bonwick@Sun.COM avl_node_t dde_node; 11910922SJeff.Bonwick@Sun.COM }; 12010922SJeff.Bonwick@Sun.COM 12110922SJeff.Bonwick@Sun.COM /* 12210922SJeff.Bonwick@Sun.COM * In-core ddt 12310922SJeff.Bonwick@Sun.COM */ 12410922SJeff.Bonwick@Sun.COM struct ddt { 12510922SJeff.Bonwick@Sun.COM kmutex_t ddt_lock; 12610922SJeff.Bonwick@Sun.COM avl_tree_t ddt_tree; 12710922SJeff.Bonwick@Sun.COM avl_tree_t ddt_repair_tree; 12810922SJeff.Bonwick@Sun.COM enum zio_checksum ddt_checksum; 12910922SJeff.Bonwick@Sun.COM spa_t *ddt_spa; 13010922SJeff.Bonwick@Sun.COM objset_t *ddt_os; 13110922SJeff.Bonwick@Sun.COM uint64_t ddt_stat_object; 13210922SJeff.Bonwick@Sun.COM uint64_t ddt_object[DDT_TYPES][DDT_CLASSES]; 13310922SJeff.Bonwick@Sun.COM ddt_histogram_t ddt_histogram[DDT_TYPES][DDT_CLASSES]; 13411938SGeorge.Wilson@Sun.COM ddt_histogram_t ddt_histogram_cache[DDT_TYPES][DDT_CLASSES]; 13511938SGeorge.Wilson@Sun.COM ddt_object_t ddt_object_stats[DDT_TYPES][DDT_CLASSES]; 13610922SJeff.Bonwick@Sun.COM avl_node_t ddt_node; 13710922SJeff.Bonwick@Sun.COM }; 13810922SJeff.Bonwick@Sun.COM 13911125SJeff.Bonwick@Sun.COM /* 14011125SJeff.Bonwick@Sun.COM * In-core and on-disk bookmark for DDT walks 14111125SJeff.Bonwick@Sun.COM */ 14211125SJeff.Bonwick@Sun.COM typedef struct ddt_bookmark { 14311125SJeff.Bonwick@Sun.COM uint64_t ddb_class; 14411125SJeff.Bonwick@Sun.COM uint64_t ddb_type; 14511125SJeff.Bonwick@Sun.COM uint64_t ddb_checksum; 14611125SJeff.Bonwick@Sun.COM uint64_t ddb_cursor; 14711125SJeff.Bonwick@Sun.COM } ddt_bookmark_t; 14811125SJeff.Bonwick@Sun.COM 14911125SJeff.Bonwick@Sun.COM /* 15011125SJeff.Bonwick@Sun.COM * Ops vector to access a specific DDT object type. 15111125SJeff.Bonwick@Sun.COM */ 15210922SJeff.Bonwick@Sun.COM typedef struct ddt_ops { 15310922SJeff.Bonwick@Sun.COM char ddt_op_name[32]; 15410922SJeff.Bonwick@Sun.COM int (*ddt_op_create)(objset_t *os, uint64_t *object, dmu_tx_t *tx, 15510922SJeff.Bonwick@Sun.COM boolean_t prehash); 15610922SJeff.Bonwick@Sun.COM int (*ddt_op_destroy)(objset_t *os, uint64_t object, dmu_tx_t *tx); 15710922SJeff.Bonwick@Sun.COM int (*ddt_op_lookup)(objset_t *os, uint64_t object, ddt_entry_t *dde); 158*12450SGeorge.Wilson@Sun.COM void (*ddt_op_prefetch)(objset_t *os, uint64_t object, 159*12450SGeorge.Wilson@Sun.COM ddt_entry_t *dde); 16010922SJeff.Bonwick@Sun.COM int (*ddt_op_update)(objset_t *os, uint64_t object, ddt_entry_t *dde, 16110922SJeff.Bonwick@Sun.COM dmu_tx_t *tx); 16210922SJeff.Bonwick@Sun.COM int (*ddt_op_remove)(objset_t *os, uint64_t object, ddt_entry_t *dde, 16310922SJeff.Bonwick@Sun.COM dmu_tx_t *tx); 16410922SJeff.Bonwick@Sun.COM int (*ddt_op_walk)(objset_t *os, uint64_t object, ddt_entry_t *dde, 16510922SJeff.Bonwick@Sun.COM uint64_t *walk); 16610922SJeff.Bonwick@Sun.COM uint64_t (*ddt_op_count)(objset_t *os, uint64_t object); 16710922SJeff.Bonwick@Sun.COM } ddt_ops_t; 16810922SJeff.Bonwick@Sun.COM 16910922SJeff.Bonwick@Sun.COM #define DDT_NAMELEN 80 17010922SJeff.Bonwick@Sun.COM 17110922SJeff.Bonwick@Sun.COM extern void ddt_object_name(ddt_t *ddt, enum ddt_type type, 17210922SJeff.Bonwick@Sun.COM enum ddt_class class, char *name); 17310922SJeff.Bonwick@Sun.COM extern int ddt_object_walk(ddt_t *ddt, enum ddt_type type, 17411125SJeff.Bonwick@Sun.COM enum ddt_class class, uint64_t *walk, ddt_entry_t *dde); 17510922SJeff.Bonwick@Sun.COM extern uint64_t ddt_object_count(ddt_t *ddt, enum ddt_type type, 17610922SJeff.Bonwick@Sun.COM enum ddt_class class); 17710922SJeff.Bonwick@Sun.COM extern int ddt_object_info(ddt_t *ddt, enum ddt_type type, 17810922SJeff.Bonwick@Sun.COM enum ddt_class class, dmu_object_info_t *); 17910922SJeff.Bonwick@Sun.COM extern boolean_t ddt_object_exists(ddt_t *ddt, enum ddt_type type, 18010922SJeff.Bonwick@Sun.COM enum ddt_class class); 18110922SJeff.Bonwick@Sun.COM 18210922SJeff.Bonwick@Sun.COM extern void ddt_bp_fill(const ddt_phys_t *ddp, blkptr_t *bp, 18310922SJeff.Bonwick@Sun.COM uint64_t txg); 18411125SJeff.Bonwick@Sun.COM extern void ddt_bp_create(enum zio_checksum checksum, const ddt_key_t *ddk, 18510922SJeff.Bonwick@Sun.COM const ddt_phys_t *ddp, blkptr_t *bp); 18610922SJeff.Bonwick@Sun.COM 18710922SJeff.Bonwick@Sun.COM extern void ddt_key_fill(ddt_key_t *ddk, const blkptr_t *bp); 18810922SJeff.Bonwick@Sun.COM 18910922SJeff.Bonwick@Sun.COM extern void ddt_phys_fill(ddt_phys_t *ddp, const blkptr_t *bp); 19010922SJeff.Bonwick@Sun.COM extern void ddt_phys_clear(ddt_phys_t *ddp); 19110922SJeff.Bonwick@Sun.COM extern void ddt_phys_addref(ddt_phys_t *ddp); 19210922SJeff.Bonwick@Sun.COM extern void ddt_phys_decref(ddt_phys_t *ddp); 19310922SJeff.Bonwick@Sun.COM extern void ddt_phys_free(ddt_t *ddt, ddt_key_t *ddk, ddt_phys_t *ddp, 19410922SJeff.Bonwick@Sun.COM uint64_t txg); 19510922SJeff.Bonwick@Sun.COM extern ddt_phys_t *ddt_phys_select(const ddt_entry_t *dde, const blkptr_t *bp); 19610922SJeff.Bonwick@Sun.COM extern uint64_t ddt_phys_total_refcnt(const ddt_entry_t *dde); 19710922SJeff.Bonwick@Sun.COM 19810922SJeff.Bonwick@Sun.COM extern void ddt_stat_add(ddt_stat_t *dst, const ddt_stat_t *src, uint64_t neg); 19910922SJeff.Bonwick@Sun.COM 20010922SJeff.Bonwick@Sun.COM extern void ddt_histogram_add(ddt_histogram_t *dst, const ddt_histogram_t *src); 20110922SJeff.Bonwick@Sun.COM extern void ddt_histogram_stat(ddt_stat_t *dds, const ddt_histogram_t *ddh); 20210922SJeff.Bonwick@Sun.COM extern boolean_t ddt_histogram_empty(const ddt_histogram_t *ddh); 20311149SGeorge.Wilson@Sun.COM extern void ddt_get_dedup_object_stats(spa_t *spa, ddt_object_t *ddo); 20411149SGeorge.Wilson@Sun.COM extern void ddt_get_dedup_histogram(spa_t *spa, ddt_histogram_t *ddh); 20511149SGeorge.Wilson@Sun.COM extern void ddt_get_dedup_stats(spa_t *spa, ddt_stat_t *dds_total); 20610922SJeff.Bonwick@Sun.COM 20710956SGeorge.Wilson@Sun.COM extern uint64_t ddt_get_dedup_dspace(spa_t *spa); 20810922SJeff.Bonwick@Sun.COM extern uint64_t ddt_get_pool_dedup_ratio(spa_t *spa); 20910922SJeff.Bonwick@Sun.COM 21010922SJeff.Bonwick@Sun.COM extern int ddt_ditto_copies_needed(ddt_t *ddt, ddt_entry_t *dde, 21110922SJeff.Bonwick@Sun.COM ddt_phys_t *ddp_willref); 21210922SJeff.Bonwick@Sun.COM extern int ddt_ditto_copies_present(ddt_entry_t *dde); 21310922SJeff.Bonwick@Sun.COM 21410922SJeff.Bonwick@Sun.COM extern size_t ddt_compress(void *src, uchar_t *dst, size_t s_len, size_t d_len); 21510922SJeff.Bonwick@Sun.COM extern void ddt_decompress(uchar_t *src, void *dst, size_t s_len, size_t d_len); 21610922SJeff.Bonwick@Sun.COM 21710922SJeff.Bonwick@Sun.COM extern ddt_t *ddt_select(spa_t *spa, const blkptr_t *bp); 21810922SJeff.Bonwick@Sun.COM extern void ddt_enter(ddt_t *ddt); 21910922SJeff.Bonwick@Sun.COM extern void ddt_exit(ddt_t *ddt); 22010922SJeff.Bonwick@Sun.COM extern ddt_entry_t *ddt_lookup(ddt_t *ddt, const blkptr_t *bp, boolean_t add); 221*12450SGeorge.Wilson@Sun.COM extern void ddt_prefetch(spa_t *spa, const blkptr_t *bp); 22210922SJeff.Bonwick@Sun.COM extern void ddt_remove(ddt_t *ddt, ddt_entry_t *dde); 22310922SJeff.Bonwick@Sun.COM 22411125SJeff.Bonwick@Sun.COM extern boolean_t ddt_class_contains(spa_t *spa, enum ddt_class max_class, 22511125SJeff.Bonwick@Sun.COM const blkptr_t *bp); 22611125SJeff.Bonwick@Sun.COM 22710922SJeff.Bonwick@Sun.COM extern ddt_entry_t *ddt_repair_start(ddt_t *ddt, const blkptr_t *bp); 22810922SJeff.Bonwick@Sun.COM extern void ddt_repair_done(ddt_t *ddt, ddt_entry_t *dde); 22910922SJeff.Bonwick@Sun.COM 23010922SJeff.Bonwick@Sun.COM extern int ddt_entry_compare(const void *x1, const void *x2); 23110922SJeff.Bonwick@Sun.COM 23210922SJeff.Bonwick@Sun.COM extern void ddt_create(spa_t *spa); 23310922SJeff.Bonwick@Sun.COM extern int ddt_load(spa_t *spa); 23410922SJeff.Bonwick@Sun.COM extern void ddt_unload(spa_t *spa); 23510922SJeff.Bonwick@Sun.COM extern void ddt_sync(spa_t *spa, uint64_t txg); 23611125SJeff.Bonwick@Sun.COM extern int ddt_walk(spa_t *spa, ddt_bookmark_t *ddb, ddt_entry_t *dde); 23712296SLin.Ling@Sun.COM extern int ddt_object_update(ddt_t *ddt, enum ddt_type type, 23812296SLin.Ling@Sun.COM enum ddt_class class, ddt_entry_t *dde, dmu_tx_t *tx); 23910922SJeff.Bonwick@Sun.COM 24010922SJeff.Bonwick@Sun.COM extern const ddt_ops_t ddt_zap_ops; 24110922SJeff.Bonwick@Sun.COM 24210922SJeff.Bonwick@Sun.COM #ifdef __cplusplus 24310922SJeff.Bonwick@Sun.COM } 24410922SJeff.Bonwick@Sun.COM #endif 24510922SJeff.Bonwick@Sun.COM 24610922SJeff.Bonwick@Sun.COM #endif /* _SYS_DDT_H */ 247