di_cache
di_mem2cache(struct di_state *st, struct di_cache *cache)
di_cache_write(struct di_cache *cache)
di_cache_read(struct di_cache *cache)
buf = di_cache.cache_data = kmem_alloc(map_size, KM_SLEEP);
all = (struct di_all *)di_cache.cache_data;
CRC32(crc, di_cache.cache_data, map_size, -1U, crc32_table);
di_cache.cache_size = map_size;
kmem_free(di_cache.cache_data, map_size);
di_cache.cache_data = NULL;
di_cache.cache_size = 0;
DI_CACHE_LOCK(di_cache);
cache_valid = di_cache.cache_valid;
if (cache_valid && di_cache.cache_data == NULL) {
di_cache_read(&di_cache);
if (di_cache.cache_data == NULL)
ASSERT(di_cache.cache_data != NULL);
ASSERT(di_cache.cache_size > 0);
if (di_cache2mem(&di_cache, st) > 0) {
ASSERT(rval <= di_cache.cache_size);
DI_CACHE_UNLOCK(di_cache);
ASSERT(DI_CACHE_LOCKED(di_cache));
i_ddi_di_cache_free(&di_cache);
atomic_or_32(&di_cache.cache_valid, 1);
if (di_mem2cache(st, &di_cache) == 0) {
ASSERT(di_cache.cache_data);
ASSERT(di_cache.cache_size > 0);
all = (struct di_all *)di_cache.cache_data;
CRC32(crc, di_cache.cache_data, all->map_size, -1U, crc32_table);
di_cache_write(&di_cache);
DI_CACHE_LOCK(di_cache);
DI_CACHE_UNLOCK(di_cache);
di_cache2mem(struct di_cache *cache, struct di_state *st)
struct di_cache di_cache = {1};
mutex_enter(&di_cache.cache_lock);
if (!di_cache.cache_valid)
i_ddi_di_cache_free(&di_cache);
mutex_exit(&di_cache.cache_lock);
i_ddi_di_cache_free(struct di_cache *cache)
cache_valid = atomic_swap_uint(&di_cache.cache_valid, 0);
extern struct di_cache di_cache;
extern void i_ddi_di_cache_free(struct di_cache *cache);