/* * Null the sec_data index in the cache table, and * free the memory allocated by sec_clnt_loadinfo. */ void sec_clnt_freeinfo(struct sec_data *secdata) { switch (secdata->rpcflavor) { case AUTH_DES: purge_authtab(secdata); if (secdata->data) dh_k4_clnt_freeinfo(secdata->data); break; case RPCSEC_GSS: rpc_gss_secpurge((void *)secdata); if (secdata->data) { gss_clntdata_t *gss_data; gss_data = (gss_clntdata_t *)secdata->data; if (gss_data->mechanism.elements) { kmem_free(gss_data->mechanism.elements, gss_data->mechanism.length); } kmem_free(secdata->data, sizeof (gss_clntdata_t)); } break; case AUTH_NONE: case AUTH_UNIX: case AUTH_LOOPBACK: default: break; } kmem_free(secdata, sizeof (*secdata)); }
/* * Since sec_data is the index for the client auth handles * cache table, whenever the sec_data is freed, the index needs * to be nulled. */ void purge_authtab(struct sec_data *secdata) { struct desauthent *da; switch (secdata->rpcflavor) { case AUTH_DES: mutex_enter(&desauthtab_lock); if (desauthtab != NULL) { for (da = desauthtab; da < &desauthtab[clnt_authdes_cachesz]; da++) { if (da->da_data == secdata) { da->da_data = NULL; da->da_inuse = 0; } } } mutex_exit(&desauthtab_lock); return; case RPCSEC_GSS: rpc_gss_secpurge((void *)secdata); return; default: return; } }
/* * NFS disconnect. Clean up and unlink. */ void nfs_disconnect(struct nfsmount *nmp) { CLIENT *client; mtx_lock(&nmp->nm_mtx); if (nmp->nm_client) { client = nmp->nm_client; nmp->nm_client = NULL; mtx_unlock(&nmp->nm_mtx); #ifdef KGSSAPI rpc_gss_secpurge(client); #endif CLNT_CLOSE(client); CLNT_RELEASE(client); } else { mtx_unlock(&nmp->nm_mtx); } }