Print this page
3752 want more verifiable dbuf user eviction
Submitted by:   Justin Gibbs <justing@spectralogic.com>
Submitted by:   Will Andrews <willa@spectralogic.com>

*** 43,52 **** --- 43,55 ---- struct dsl_dataset; struct dsl_dir; struct dsl_pool; + #define DS_HAS_PHYS(ds) \ + ((ds)->ds_dbuf != NULL && (ds)->ds_dbuf->db_data != NULL) + #define DS_FLAG_INCONSISTENT (1ULL<<0) #define DS_IS_INCONSISTENT(ds) \ ((ds)->ds_phys->ds_flags & DS_FLAG_INCONSISTENT) /* * Note: nopromote can not yet be set, but we want support for it in this
*** 109,123 **** uint64_t ds_props_obj; /* DMU_OT_DSL_PROPS for snaps */ uint64_t ds_userrefs_obj; /* DMU_OT_USERREFS */ uint64_t ds_pad[5]; /* pad out to 320 bytes for good measure */ } dsl_dataset_phys_t; typedef struct dsl_dataset { /* Immutable: */ struct dsl_dir *ds_dir; ! dsl_dataset_phys_t *ds_phys; ! dmu_buf_t *ds_dbuf; uint64_t ds_object; uint64_t ds_fsid_guid; /* only used in syncing context, only valid for non-snapshots: */ struct dsl_dataset *ds_prev; --- 112,135 ---- uint64_t ds_props_obj; /* DMU_OT_DSL_PROPS for snaps */ uint64_t ds_userrefs_obj; /* DMU_OT_USERREFS */ uint64_t ds_pad[5]; /* pad out to 320 bytes for good measure */ } dsl_dataset_phys_t; + typedef struct dsl_dataset_dbuf { + uint8_t dsdb_pad[offsetof(dmu_buf_t, db_data)]; + dsl_dataset_phys_t *dsdb_data; + } dsl_dataset_dbuf_t; + typedef struct dsl_dataset { + dmu_buf_user_t db_evict; + /* Immutable: */ struct dsl_dir *ds_dir; ! union { ! dmu_buf_t *ds_dmu_db; ! dsl_dataset_dbuf_t *ds_db; ! } ds_db_u; uint64_t ds_object; uint64_t ds_fsid_guid; /* only used in syncing context, only valid for non-snapshots: */ struct dsl_dataset *ds_prev;
*** 161,170 **** --- 173,195 ---- /* Protected by ds_lock; keep at end of struct for better locality */ char ds_snapname[MAXNAMELEN]; } dsl_dataset_t; + /* See sys/dmu.h:dmu_buf_user_t for why we have these. */ + #define ds_dbuf ds_db_u.ds_dmu_db + #define ds_phys ds_db_u.ds_db->dsdb_data + + struct dsl_ds_destroyarg { + dsl_dataset_t *ds; /* ds to destroy */ + dsl_dataset_t *rm_origin; /* also remove our origin? */ + boolean_t is_origin_rm; /* set if removing origin snap */ + boolean_t defer; /* destroy -d requested? */ + boolean_t releasing; /* destroying due to release? */ + boolean_t need_prep; /* do we need to retry due to EBUSY? */ + }; + /* * The max length of a temporary tag prefix is the number of hex digits * required to express UINT64_MAX plus one for the hyphen. */ #define MAX_TAG_PREFIX_LEN 17