int handle_mapping_hash_add(hash_table_t *p_hash, uint64_t object_id, unsigned int handle_hash, const void *data, uint32_t datalen) { int rc; struct gsh_buffdesc buffkey; struct gsh_buffdesc buffval; digest_pool_entry_t *digest; handle_pool_entry_t *handle; if (datalen >= sizeof(handle->fh_data)) return HANDLEMAP_INVALID_PARAM; digest = digest_alloc(); if (!digest) return HANDLEMAP_SYSTEM_ERROR; handle = handle_alloc(); if (!handle) { digest_free(digest); return HANDLEMAP_SYSTEM_ERROR; } digest->nfs23_digest.object_id = object_id; digest->nfs23_digest.handle_hash = handle_hash; memset(handle->fh_data, 0, sizeof(handle->fh_data)); memcpy(handle->fh_data, data, datalen); handle->fh_len = datalen; buffkey.addr = (caddr_t) digest; buffkey.len = sizeof(digest_pool_entry_t); buffval.addr = (caddr_t) handle; buffval.len = sizeof(handle_pool_entry_t); rc = hashtable_test_and_set(handle_map_hash, &buffkey, &buffval, HASHTABLE_SET_HOW_SET_NO_OVERWRITE); if (rc != HASHTABLE_SUCCESS) { digest_free(digest); handle_free(handle); if (rc != HASHTABLE_ERROR_KEY_ALREADY_EXISTS) { LogCrit(COMPONENT_FSAL, "ERROR %d inserting entry to handle mapping hash table", rc); return HANDLEMAP_HASHTABLE_ERROR; } else { return HANDLEMAP_EXISTS; } } return HANDLEMAP_SUCCESS; }
/** * Remove a handle from the map * when it was removed from the filesystem * or when it is stale. */ int HandleMap_DelFH(nfs23_map_handle_t *p_in_nfs23_digest) { int rc; struct gsh_buffdesc buffkey, stored_buffkey; struct gsh_buffdesc stored_buffval; digest_pool_entry_t digest; digest_pool_entry_t *p_stored_digest; handle_pool_entry_t *p_stored_handle; /* first, delete it from hash table */ digest.nfs23_digest = *p_in_nfs23_digest; buffkey.addr = (caddr_t) &digest; buffkey.len = sizeof(digest_pool_entry_t); rc = HashTable_Del(handle_map_hash, &buffkey, &stored_buffkey, &stored_buffval); if (rc != HASHTABLE_SUCCESS) return HANDLEMAP_STALE; p_stored_digest = (digest_pool_entry_t *) stored_buffkey.addr; p_stored_handle = (handle_pool_entry_t *) stored_buffval.addr; digest_free(p_stored_digest); handle_free(p_stored_handle); /* then, submit the request to the database */ return handlemap_db_delete(p_in_nfs23_digest); }
void task_preload_free(struct task_preload_st *preload) { safe_process(free, preload->date); safe_process(free, preload->http_status); safe_process(free, preload->content_length); safe_process(free, preload->cache_status); safe_process(free, preload->last_modified); digest_free(&preload->digest); data_buf_clean(&preload->m3u8.dbuf); }