/** * @brief Set a state into the stateid hashtable. * * @param[in] other stateid4.other * @param[in] state The state to add * * @retval 1 if ok. * @retval 0 if not ok. */ int nfs4_State_Set(char other[OTHERSIZE], state_t *state) { struct gsh_buffdesc buffkey; struct gsh_buffdesc buffval; buffkey.addr = gsh_malloc(OTHERSIZE); if (buffkey.addr == NULL) return 0; LogFullDebug(COMPONENT_STATE, "Allocating stateid key %p", buffkey.addr); memcpy(buffkey.addr, other, OTHERSIZE); buffkey.len = OTHERSIZE; buffval.addr = state; buffval.len = sizeof(state_t); if (hashtable_test_and_set (ht_state_id, &buffkey, &buffval, HASHTABLE_SET_HOW_SET_NO_OVERWRITE) != HASHTABLE_SUCCESS) { LogCrit(COMPONENT_STATE, "hashtable_test_and_set failed for key %p", buffkey.addr); gsh_free(buffkey.addr); return 0; } return 1; }
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; }