aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/sunrpc/auth_gss/gss_mech_switch.c28
1 files changed, 14 insertions, 14 deletions
diff --git a/net/sunrpc/auth_gss/gss_mech_switch.c b/net/sunrpc/auth_gss/gss_mech_switch.c
index 5fec3abbe19b..16ac0f4cb7d8 100644
--- a/net/sunrpc/auth_gss/gss_mech_switch.c
+++ b/net/sunrpc/auth_gss/gss_mech_switch.c
@@ -117,7 +117,7 @@ int gss_mech_register(struct gss_api_mech *gm)
117 if (status) 117 if (status)
118 return status; 118 return status;
119 spin_lock(&registered_mechs_lock); 119 spin_lock(&registered_mechs_lock);
120 list_add(&gm->gm_list, &registered_mechs); 120 list_add_rcu(&gm->gm_list, &registered_mechs);
121 spin_unlock(&registered_mechs_lock); 121 spin_unlock(&registered_mechs_lock);
122 dprintk("RPC: registered gss mechanism %s\n", gm->gm_name); 122 dprintk("RPC: registered gss mechanism %s\n", gm->gm_name);
123 return 0; 123 return 0;
@@ -132,7 +132,7 @@ EXPORT_SYMBOL_GPL(gss_mech_register);
132void gss_mech_unregister(struct gss_api_mech *gm) 132void gss_mech_unregister(struct gss_api_mech *gm)
133{ 133{
134 spin_lock(&registered_mechs_lock); 134 spin_lock(&registered_mechs_lock);
135 list_del(&gm->gm_list); 135 list_del_rcu(&gm->gm_list);
136 spin_unlock(&registered_mechs_lock); 136 spin_unlock(&registered_mechs_lock);
137 dprintk("RPC: unregistered gss mechanism %s\n", gm->gm_name); 137 dprintk("RPC: unregistered gss mechanism %s\n", gm->gm_name);
138 gss_mech_free(gm); 138 gss_mech_free(gm);
@@ -151,15 +151,15 @@ _gss_mech_get_by_name(const char *name)
151{ 151{
152 struct gss_api_mech *pos, *gm = NULL; 152 struct gss_api_mech *pos, *gm = NULL;
153 153
154 spin_lock(&registered_mechs_lock); 154 rcu_read_lock();
155 list_for_each_entry(pos, &registered_mechs, gm_list) { 155 list_for_each_entry_rcu(pos, &registered_mechs, gm_list) {
156 if (0 == strcmp(name, pos->gm_name)) { 156 if (0 == strcmp(name, pos->gm_name)) {
157 if (try_module_get(pos->gm_owner)) 157 if (try_module_get(pos->gm_owner))
158 gm = pos; 158 gm = pos;
159 break; 159 break;
160 } 160 }
161 } 161 }
162 spin_unlock(&registered_mechs_lock); 162 rcu_read_unlock();
163 return gm; 163 return gm;
164 164
165} 165}
@@ -186,8 +186,8 @@ struct gss_api_mech *gss_mech_get_by_OID(struct rpcsec_gss_oid *obj)
186 dprintk("RPC: %s(%s)\n", __func__, buf); 186 dprintk("RPC: %s(%s)\n", __func__, buf);
187 request_module("rpc-auth-gss-%s", buf); 187 request_module("rpc-auth-gss-%s", buf);
188 188
189 spin_lock(&registered_mechs_lock); 189 rcu_read_lock();
190 list_for_each_entry(pos, &registered_mechs, gm_list) { 190 list_for_each_entry_rcu(pos, &registered_mechs, gm_list) {
191 if (obj->len == pos->gm_oid.len) { 191 if (obj->len == pos->gm_oid.len) {
192 if (0 == memcmp(obj->data, pos->gm_oid.data, obj->len)) { 192 if (0 == memcmp(obj->data, pos->gm_oid.data, obj->len)) {
193 if (try_module_get(pos->gm_owner)) 193 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 } 196 }
197 } 197 }
198 } 198 }
199 spin_unlock(&registered_mechs_lock); 199 rcu_read_unlock();
200 return gm; 200 return gm;
201} 201}
202 202
@@ -216,15 +216,15 @@ static struct gss_api_mech *_gss_mech_get_by_pseudoflavor(u32 pseudoflavor)
216{ 216{
217 struct gss_api_mech *gm = NULL, *pos; 217 struct gss_api_mech *gm = NULL, *pos;
218 218
219 spin_lock(&registered_mechs_lock); 219 rcu_read_lock();
220 list_for_each_entry(pos, &registered_mechs, gm_list) { 220 list_for_each_entry_rcu(pos, &registered_mechs, gm_list) {
221 if (!mech_supports_pseudoflavor(pos, pseudoflavor)) 221 if (!mech_supports_pseudoflavor(pos, pseudoflavor))
222 continue; 222 continue;
223 if (try_module_get(pos->gm_owner)) 223 if (try_module_get(pos->gm_owner))
224 gm = pos; 224 gm = pos;
225 break; 225 break;
226 } 226 }
227 spin_unlock(&registered_mechs_lock); 227 rcu_read_unlock();
228 return gm; 228 return gm;
229} 229}
230 230
@@ -257,8 +257,8 @@ int gss_mech_list_pseudoflavors(rpc_authflavor_t *array_ptr, int size)
257 struct gss_api_mech *pos = NULL; 257 struct gss_api_mech *pos = NULL;
258 int j, i = 0; 258 int j, i = 0;
259 259
260 spin_lock(&registered_mechs_lock); 260 rcu_read_lock();
261 list_for_each_entry(pos, &registered_mechs, gm_list) { 261 list_for_each_entry_rcu(pos, &registered_mechs, gm_list) {
262 for (j = 0; j < pos->gm_pf_num; j++) { 262 for (j = 0; j < pos->gm_pf_num; j++) {
263 if (i >= size) { 263 if (i >= size) {
264 spin_unlock(&registered_mechs_lock); 264 spin_unlock(&registered_mechs_lock);
@@ -267,7 +267,7 @@ int gss_mech_list_pseudoflavors(rpc_authflavor_t *array_ptr, int size)
267 array_ptr[i++] = pos->gm_pfs[j].pseudoflavor; 267 array_ptr[i++] = pos->gm_pfs[j].pseudoflavor;
268 } 268 }
269 } 269 }
270 spin_unlock(&registered_mechs_lock); 270 rcu_read_unlock();
271 return i; 271 return i;
272} 272}
273 273