SUNRPC: Lockless lookup of RPCSEC_GSS mechanisms
Use RCU protected lookups for discovering the supported mechanisms. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
@ -117,7 +117,7 @@ int gss_mech_register(struct gss_api_mech *gm)
|
|||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
spin_lock(®istered_mechs_lock);
|
spin_lock(®istered_mechs_lock);
|
||||||
list_add(&gm->gm_list, ®istered_mechs);
|
list_add_rcu(&gm->gm_list, ®istered_mechs);
|
||||||
spin_unlock(®istered_mechs_lock);
|
spin_unlock(®istered_mechs_lock);
|
||||||
dprintk("RPC: registered gss mechanism %s\n", gm->gm_name);
|
dprintk("RPC: registered gss mechanism %s\n", gm->gm_name);
|
||||||
return 0;
|
return 0;
|
||||||
@ -132,7 +132,7 @@ EXPORT_SYMBOL_GPL(gss_mech_register);
|
|||||||
void gss_mech_unregister(struct gss_api_mech *gm)
|
void gss_mech_unregister(struct gss_api_mech *gm)
|
||||||
{
|
{
|
||||||
spin_lock(®istered_mechs_lock);
|
spin_lock(®istered_mechs_lock);
|
||||||
list_del(&gm->gm_list);
|
list_del_rcu(&gm->gm_list);
|
||||||
spin_unlock(®istered_mechs_lock);
|
spin_unlock(®istered_mechs_lock);
|
||||||
dprintk("RPC: unregistered gss mechanism %s\n", gm->gm_name);
|
dprintk("RPC: unregistered gss mechanism %s\n", gm->gm_name);
|
||||||
gss_mech_free(gm);
|
gss_mech_free(gm);
|
||||||
@ -151,15 +151,15 @@ _gss_mech_get_by_name(const char *name)
|
|||||||
{
|
{
|
||||||
struct gss_api_mech *pos, *gm = NULL;
|
struct gss_api_mech *pos, *gm = NULL;
|
||||||
|
|
||||||
spin_lock(®istered_mechs_lock);
|
rcu_read_lock();
|
||||||
list_for_each_entry(pos, ®istered_mechs, gm_list) {
|
list_for_each_entry_rcu(pos, ®istered_mechs, gm_list) {
|
||||||
if (0 == strcmp(name, pos->gm_name)) {
|
if (0 == strcmp(name, pos->gm_name)) {
|
||||||
if (try_module_get(pos->gm_owner))
|
if (try_module_get(pos->gm_owner))
|
||||||
gm = pos;
|
gm = pos;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
spin_unlock(®istered_mechs_lock);
|
rcu_read_unlock();
|
||||||
return gm;
|
return gm;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -186,8 +186,8 @@ struct gss_api_mech *gss_mech_get_by_OID(struct rpcsec_gss_oid *obj)
|
|||||||
dprintk("RPC: %s(%s)\n", __func__, buf);
|
dprintk("RPC: %s(%s)\n", __func__, buf);
|
||||||
request_module("rpc-auth-gss-%s", buf);
|
request_module("rpc-auth-gss-%s", buf);
|
||||||
|
|
||||||
spin_lock(®istered_mechs_lock);
|
rcu_read_lock();
|
||||||
list_for_each_entry(pos, ®istered_mechs, gm_list) {
|
list_for_each_entry_rcu(pos, ®istered_mechs, gm_list) {
|
||||||
if (obj->len == pos->gm_oid.len) {
|
if (obj->len == pos->gm_oid.len) {
|
||||||
if (0 == memcmp(obj->data, pos->gm_oid.data, obj->len)) {
|
if (0 == memcmp(obj->data, pos->gm_oid.data, obj->len)) {
|
||||||
if (try_module_get(pos->gm_owner))
|
if (try_module_get(pos->gm_owner))
|
||||||
@ -196,7 +196,7 @@ struct gss_api_mech *gss_mech_get_by_OID(struct rpcsec_gss_oid *obj)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
spin_unlock(®istered_mechs_lock);
|
rcu_read_unlock();
|
||||||
return gm;
|
return gm;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -216,15 +216,15 @@ static struct gss_api_mech *_gss_mech_get_by_pseudoflavor(u32 pseudoflavor)
|
|||||||
{
|
{
|
||||||
struct gss_api_mech *gm = NULL, *pos;
|
struct gss_api_mech *gm = NULL, *pos;
|
||||||
|
|
||||||
spin_lock(®istered_mechs_lock);
|
rcu_read_lock();
|
||||||
list_for_each_entry(pos, ®istered_mechs, gm_list) {
|
list_for_each_entry_rcu(pos, ®istered_mechs, gm_list) {
|
||||||
if (!mech_supports_pseudoflavor(pos, pseudoflavor))
|
if (!mech_supports_pseudoflavor(pos, pseudoflavor))
|
||||||
continue;
|
continue;
|
||||||
if (try_module_get(pos->gm_owner))
|
if (try_module_get(pos->gm_owner))
|
||||||
gm = pos;
|
gm = pos;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
spin_unlock(®istered_mechs_lock);
|
rcu_read_unlock();
|
||||||
return gm;
|
return gm;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -257,8 +257,8 @@ int gss_mech_list_pseudoflavors(rpc_authflavor_t *array_ptr, int size)
|
|||||||
struct gss_api_mech *pos = NULL;
|
struct gss_api_mech *pos = NULL;
|
||||||
int j, i = 0;
|
int j, i = 0;
|
||||||
|
|
||||||
spin_lock(®istered_mechs_lock);
|
rcu_read_lock();
|
||||||
list_for_each_entry(pos, ®istered_mechs, gm_list) {
|
list_for_each_entry_rcu(pos, ®istered_mechs, gm_list) {
|
||||||
for (j = 0; j < pos->gm_pf_num; j++) {
|
for (j = 0; j < pos->gm_pf_num; j++) {
|
||||||
if (i >= size) {
|
if (i >= size) {
|
||||||
spin_unlock(®istered_mechs_lock);
|
spin_unlock(®istered_mechs_lock);
|
||||||
@ -267,7 +267,7 @@ int gss_mech_list_pseudoflavors(rpc_authflavor_t *array_ptr, int size)
|
|||||||
array_ptr[i++] = pos->gm_pfs[j].pseudoflavor;
|
array_ptr[i++] = pos->gm_pfs[j].pseudoflavor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
spin_unlock(®istered_mechs_lock);
|
rcu_read_unlock();
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user