Print this page
3752 want more verifiable dbuf user eviction
Submitted by: Justin Gibbs <justing@spectralogic.com>
Submitted by: Will Andrews <willa@spectralogic.com>
*** 72,86 ****
uint64_t dd_used_breakdown[DD_USED_NUM];
uint64_t dd_clones; /* dsl_dir objects */
uint64_t dd_pad[13]; /* pad out to 256 bytes for good measure */
} dsl_dir_phys_t;
struct dsl_dir {
/* These are immutable; no lock needed: */
uint64_t dd_object;
! dsl_dir_phys_t *dd_phys;
! dmu_buf_t *dd_dbuf;
dsl_pool_t *dd_pool;
/* protected by lock on pool's dp_dirty_dirs list */
txg_node_t dd_dirty_link;
--- 72,95 ----
uint64_t dd_used_breakdown[DD_USED_NUM];
uint64_t dd_clones; /* dsl_dir objects */
uint64_t dd_pad[13]; /* pad out to 256 bytes for good measure */
} dsl_dir_phys_t;
+ typedef struct dsl_dir_dbuf {
+ uint8_t dddb_pad[offsetof(dmu_buf_t, db_data)];
+ dsl_dir_phys_t *dddb_data;
+ } dsl_dir_dbuf_t;
+
struct dsl_dir {
+ dmu_buf_user_t db_evict;
+
/* These are immutable; no lock needed: */
uint64_t dd_object;
! union {
! dmu_buf_t *dd_dmu_db;
! dsl_dir_dbuf_t *dd_db;
! } dd_db_u;
dsl_pool_t *dd_pool;
/* protected by lock on pool's dp_dirty_dirs list */
txg_node_t dd_dirty_link;
*** 100,109 ****
--- 109,122 ----
/* protected by dd_lock; keep at end of struct for better locality */
char dd_myname[MAXNAMELEN];
};
+ /* See sys/dmu.h:dmu_buf_user_t for why we have these. */
+ #define dd_dbuf dd_db_u.dd_dmu_db
+ #define dd_phys dd_db_u.dd_db->dddb_data
+
void dsl_dir_rele(dsl_dir_t *dd, void *tag);
int dsl_dir_hold(dsl_pool_t *dp, const char *name, void *tag,
dsl_dir_t **, const char **tail);
int dsl_dir_hold_obj(dsl_pool_t *dp, uint64_t ddobj,
const char *tail, void *tag, dsl_dir_t **);