state_owner_t *create_nfs4_owner(state_nfs4_owner_name_t * pname, nfs_client_id_t * pclientid, state_owner_type_t type, state_owner_t * related_owner, unsigned int init_seqid) { state_owner_t * powner; state_nfs4_owner_name_t * powner_name; /* This lock owner is not known yet, allocated and set up a new one */ powner = pool_alloc(state_owner_pool, NULL); if(powner == NULL) return NULL; powner_name = pool_alloc(state_nfs4_owner_name_pool, NULL); if(powner_name == NULL) { pool_free(state_owner_pool, powner); return NULL; } *powner_name = *pname; /* set up the content of the open_owner */ memset(powner, 0, sizeof(*powner)); powner->so_type = type; powner->so_owner.so_nfs4_owner.so_seqid = init_seqid; powner->so_owner.so_nfs4_owner.so_related_owner = related_owner; powner->so_owner.so_nfs4_owner.so_clientid = pname->son_clientid; powner->so_owner.so_nfs4_owner.so_pclientid = pclientid; powner->so_owner_len = pname->son_owner_len; powner->so_owner.so_nfs4_owner.so_resp.resop = NFS4_OP_ILLEGAL; powner->so_owner.so_nfs4_owner.so_args.argop = NFS4_OP_ILLEGAL; powner->so_refcount = 1; #if 0 /* WAITING FOR COMMUNITY FIX */ /* setting lock owner confirmed */ if ( type == STATE_LOCK_OWNER_NFSV4) powner->so_owner.so_nfs4_owner.so_confirmed = 1; #endif init_glist(&powner->so_lock_list); init_glist(&powner->so_owner.so_nfs4_owner.so_state_list); memcpy(powner->so_owner_val, pname->son_owner_val, pname->son_owner_len); powner->so_owner_val[powner->so_owner_len] = '\0'; if(pthread_mutex_init(&powner->so_mutex, NULL) == -1) { pool_free(state_owner_pool, powner); pool_free(state_nfs4_owner_name_pool, powner_name); return NULL; } if(!nfs4_owner_Set(powner_name, powner)) { pool_free(state_owner_pool, powner); pool_free(state_nfs4_owner_name_pool, powner_name); return NULL; } if(isFullDebug(COMPONENT_STATE)) { char str[HASHTABLE_DISPLAY_STRLEN]; DisplayOwner(powner, str); LogFullDebug(COMPONENT_STATE, "New Owner %s", str); } /* Increment refcount on related owner */ if(related_owner != NULL) inc_state_owner_ref(related_owner); P(pclientid->cid_mutex); if (type == STATE_OPEN_OWNER_NFSV4) { /* If open owner, add to clientid lock owner list */ powner->so_refcount++; glist_add_tail(&pclientid->cid_openowners, &powner->so_owner.so_nfs4_owner.so_perclient); } else if(type == STATE_LOCK_OWNER_NFSV4) { /* If lock owner, add to clientid open owner list */ powner->so_refcount++; glist_add_tail(&pclientid->cid_lockowners, &powner->so_owner.so_nfs4_owner.so_perclient); } /* Increment reference count for clientid record */ inc_client_id_ref(pclientid); V(pclientid->cid_mutex); return powner; }
state_owner_t *create_nfs4_owner(cache_inode_client_t * pclient, state_nfs4_owner_name_t * pname, state_owner_type_t type, state_owner_t * related_owner, unsigned int init_seqid) { state_owner_t * powner; state_nfs4_owner_name_t * powner_name; /* This lock owner is not known yet, allocated and set up a new one */ GetFromPool(powner, &pclient->pool_state_owner, state_owner_t); if(powner == NULL) return NULL; GetFromPool(powner_name, &pclient->pool_nfs4_owner_name, state_nfs4_owner_name_t); if(powner_name == NULL) { ReleaseToPool(powner, &pclient->pool_state_owner); return NULL; } *powner_name = *pname; /* set up the content of the open_owner */ memset(powner, 0, sizeof(*powner)); powner->so_type = type; powner->so_owner.so_nfs4_owner.so_seqid = init_seqid; powner->so_owner.so_nfs4_owner.so_related_owner = related_owner; powner->so_owner.so_nfs4_owner.so_clientid = pname->son_clientid; powner->so_owner_len = pname->son_owner_len; powner->so_owner.so_nfs4_owner.so_resp.resop = NFS4_OP_ILLEGAL; powner->so_owner.so_nfs4_owner.so_args.argop = NFS4_OP_ILLEGAL; powner->so_refcount = 1; init_glist(&powner->so_lock_list); memcpy(powner->so_owner_val, pname->son_owner_val, pname->son_owner_len); powner->so_owner_val[powner->so_owner_len] = '\0'; if(pthread_mutex_init(&powner->so_mutex, NULL) == -1) { ReleaseToPool(powner, &pclient->pool_state_owner); ReleaseToPool(powner_name, &pclient->pool_nfs4_owner_name); return NULL; } if(!nfs4_owner_Set(powner_name, powner)) { ReleaseToPool(powner, &pclient->pool_state_owner); ReleaseToPool(powner_name, &pclient->pool_nfs4_owner_name); return NULL; } if(isFullDebug(COMPONENT_STATE)) { char str[HASHTABLE_DISPLAY_STRLEN]; DisplayOwner(powner, str); LogFullDebug(COMPONENT_STATE, "New Open Owner %s", str); } return powner; }