Commit 0c1c19f4 authored by Trond Myklebust's avatar Trond Myklebust

SUNRPC: Lockless lookup of RPCSEC_GSS mechanisms

Use RCU protected lookups for discovering the supported mechanisms.
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 4e4c3bef
...@@ -117,7 +117,7 @@ int gss_mech_register(struct gss_api_mech *gm) ...@@ -117,7 +117,7 @@ int gss_mech_register(struct gss_api_mech *gm)
if (status) if (status)
return status; return status;
spin_lock(&registered_mechs_lock); spin_lock(&registered_mechs_lock);
list_add(&gm->gm_list, &registered_mechs); list_add_rcu(&gm->gm_list, &registered_mechs);
spin_unlock(&registered_mechs_lock); spin_unlock(&registered_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); ...@@ -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(&registered_mechs_lock); spin_lock(&registered_mechs_lock);
list_del(&gm->gm_list); list_del_rcu(&gm->gm_list);
spin_unlock(&registered_mechs_lock); spin_unlock(&registered_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) ...@@ -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(&registered_mechs_lock); rcu_read_lock();
list_for_each_entry(pos, &registered_mechs, gm_list) { list_for_each_entry_rcu(pos, &registered_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(&registered_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) ...@@ -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(&registered_mechs_lock); rcu_read_lock();
list_for_each_entry(pos, &registered_mechs, gm_list) { list_for_each_entry_rcu(pos, &registered_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) ...@@ -196,7 +196,7 @@ struct gss_api_mech *gss_mech_get_by_OID(struct rpcsec_gss_oid *obj)
} }
} }
} }
spin_unlock(&registered_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) ...@@ -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(&registered_mechs_lock); rcu_read_lock();
list_for_each_entry(pos, &registered_mechs, gm_list) { list_for_each_entry_rcu(pos, &registered_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(&registered_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) ...@@ -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(&registered_mechs_lock); rcu_read_lock();
list_for_each_entry(pos, &registered_mechs, gm_list) { list_for_each_entry_rcu(pos, &registered_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(&registered_mechs_lock); spin_unlock(&registered_mechs_lock);
...@@ -267,7 +267,7 @@ int gss_mech_list_pseudoflavors(rpc_authflavor_t *array_ptr, int size) ...@@ -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(&registered_mechs_lock); rcu_read_unlock();
return i; return i;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment