Print this page
3752 want more verifiable dbuf user eviction
Submitted by: Justin Gibbs <justing@spectralogic.com>
Submitted by: Will Andrews <willa@spectralogic.com>
*** 60,78 ****
uint64_t mz_pad[5];
mzap_ent_phys_t mz_chunk[1];
/* actually variable size depending on block size */
} mzap_phys_t;
typedef struct mzap_ent {
avl_node_t mze_node;
int mze_chunkid;
uint64_t mze_hash;
uint32_t mze_cd; /* copy from mze_phys->mze_cd */
} mzap_ent_t;
#define MZE_PHYS(zap, mze) \
! (&(zap)->zap_m.zap_phys->mz_chunk[(mze)->mze_chunkid])
/*
* The (fat) zap is stored in one object. It is an array of
* 1<<FZAP_BLOCK_SHIFT byte blocks. The layout looks like one of:
*
--- 60,83 ----
uint64_t mz_pad[5];
mzap_ent_phys_t mz_chunk[1];
/* actually variable size depending on block size */
} mzap_phys_t;
+ typedef struct mzap_dbuf {
+ uint8_t mzdb_pad[offsetof(dmu_buf_t, db_data)];
+ mzap_phys_t *mzdb_data;
+ } mzap_dbuf_t;
+
typedef struct mzap_ent {
avl_node_t mze_node;
int mze_chunkid;
uint64_t mze_hash;
uint32_t mze_cd; /* copy from mze_phys->mze_cd */
} mzap_ent_t;
#define MZE_PHYS(zap, mze) \
! (&(zap)->zap_m_phys->mz_chunk[(mze)->mze_chunkid])
/*
* The (fat) zap is stored in one object. It is an array of
* 1<<FZAP_BLOCK_SHIFT byte blocks. The layout looks like one of:
*
*** 102,112 ****
* The embedded pointer table starts half-way through the block. Since
* the pointer table itself is half the block, it starts at (64-bit)
* word number (1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap)).
*/
#define ZAP_EMBEDDED_PTRTBL_ENT(zap, idx) \
! ((uint64_t *)(zap)->zap_f.zap_phys) \
[(idx) + (1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap))]
/*
* TAKE NOTE:
* If zap_phys_t is modified, zap_byteswap() must be modified.
--- 107,117 ----
* The embedded pointer table starts half-way through the block. Since
* the pointer table itself is half the block, it starts at (64-bit)
* word number (1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap)).
*/
#define ZAP_EMBEDDED_PTRTBL_ENT(zap, idx) \
! ((uint64_t *)(zap)->zap_f_phys) \
[(idx) + (1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap))]
/*
* TAKE NOTE:
* If zap_phys_t is modified, zap_byteswap() must be modified.
*** 137,175 ****
*/
} zap_phys_t;
typedef struct zap_table_phys zap_table_phys_t;
typedef struct zap {
objset_t *zap_objset;
uint64_t zap_object;
! struct dmu_buf *zap_dbuf;
krwlock_t zap_rwlock;
boolean_t zap_ismicro;
int zap_normflags;
uint64_t zap_salt;
union {
struct {
! zap_phys_t *zap_phys;
!
! /*
! * zap_num_entries_mtx protects
! * zap_num_entries
! */
kmutex_t zap_num_entries_mtx;
int zap_block_shift;
} zap_fat;
struct {
- mzap_phys_t *zap_phys;
int16_t zap_num_entries;
int16_t zap_num_chunks;
int16_t zap_alloc_next;
avl_tree_t zap_avl;
} zap_micro;
} zap_u;
} zap_t;
typedef struct zap_name {
zap_t *zn_zap;
int zn_key_intlen;
const void *zn_key_orig;
int zn_key_orig_numints;
--- 142,191 ----
*/
} zap_phys_t;
typedef struct zap_table_phys zap_table_phys_t;
+ typedef struct fzap_dbuf {
+ uint8_t fzdb_pad[offsetof(dmu_buf_t, db_data)];
+ zap_phys_t *fzdb_data;
+ } fzap_dbuf_t;
+
typedef struct zap {
+ dmu_buf_user_t db_evict;
objset_t *zap_objset;
uint64_t zap_object;
! union {
! dmu_buf_t *zap_dmu_db;
! mzap_dbuf_t *mzap_db;
! fzap_dbuf_t *fzap_db;
! } zap_db_u;
krwlock_t zap_rwlock;
boolean_t zap_ismicro;
int zap_normflags;
uint64_t zap_salt;
union {
struct {
! /* protects zap_num_entries */
kmutex_t zap_num_entries_mtx;
int zap_block_shift;
} zap_fat;
struct {
int16_t zap_num_entries;
int16_t zap_num_chunks;
int16_t zap_alloc_next;
avl_tree_t zap_avl;
} zap_micro;
} zap_u;
} zap_t;
+ /* See sys/dmu.h:dmu_buf_user_t for why we have these. */
+ #define zap_dbuf zap_db_u.zap_dmu_db
+ #define zap_f zap_u.zap_fat
+ #define zap_m zap_u.zap_micro
+ #define zap_f_phys zap_db_u.fzap_db->fzdb_data
+ #define zap_m_phys zap_db_u.mzap_db->mzdb_data
+
typedef struct zap_name {
zap_t *zn_zap;
int zn_key_intlen;
const void *zn_key_orig;
int zn_key_orig_numints;
*** 178,195 ****
uint64_t zn_hash;
matchtype_t zn_matchtype;
char zn_normbuf[ZAP_MAXNAMELEN];
} zap_name_t;
- #define zap_f zap_u.zap_fat
- #define zap_m zap_u.zap_micro
-
boolean_t zap_match(zap_name_t *zn, const char *matchname);
int zap_lockdir(objset_t *os, uint64_t obj, dmu_tx_t *tx,
krw_t lti, boolean_t fatreader, boolean_t adding, zap_t **zapp);
void zap_unlockdir(zap_t *zap);
! void zap_evict(dmu_buf_t *db, void *vmzap);
zap_name_t *zap_name_alloc(zap_t *zap, const char *key, matchtype_t mt);
void zap_name_free(zap_name_t *zn);
int zap_hashbits(zap_t *zap);
uint32_t zap_maxcd(zap_t *zap);
uint64_t zap_getflags(zap_t *zap);
--- 194,208 ----
uint64_t zn_hash;
matchtype_t zn_matchtype;
char zn_normbuf[ZAP_MAXNAMELEN];
} zap_name_t;
boolean_t zap_match(zap_name_t *zn, const char *matchname);
int zap_lockdir(objset_t *os, uint64_t obj, dmu_tx_t *tx,
krw_t lti, boolean_t fatreader, boolean_t adding, zap_t **zapp);
void zap_unlockdir(zap_t *zap);
! void zap_evict(dmu_buf_user_t *dbu);
zap_name_t *zap_name_alloc(zap_t *zap, const char *key, matchtype_t mt);
void zap_name_free(zap_name_t *zn);
int zap_hashbits(zap_t *zap);
uint32_t zap_maxcd(zap_t *zap);
uint64_t zap_getflags(zap_t *zap);