Commit b1027439dff844675f6c0df97a1b1d190791a699
Committed by
Trond Myklebust
1 parent
1a0de48ae5
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
NFS: Force the legacy idmapper to be single threaded
It was initially coded under the assumption that there would only be one request at a time, so use a lock to enforce this requirement.. Signed-off-by: Bryan Schumaker <bjschuma@netapp.com> CC: stable@vger.kernel.org [3.4+] Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Showing 1 changed file with 8 additions and 5 deletions Side-by-side Diff
fs/nfs/idmap.c
... | ... | @@ -57,6 +57,11 @@ |
57 | 57 | static const struct cred *id_resolver_cache; |
58 | 58 | static struct key_type key_type_id_resolver_legacy; |
59 | 59 | |
60 | +struct idmap { | |
61 | + struct rpc_pipe *idmap_pipe; | |
62 | + struct key_construction *idmap_key_cons; | |
63 | + struct mutex idmap_mutex; | |
64 | +}; | |
60 | 65 | |
61 | 66 | /** |
62 | 67 | * nfs_fattr_init_names - initialise the nfs_fattr owner_name/group_name fields |
63 | 68 | |
... | ... | @@ -310,9 +315,11 @@ |
310 | 315 | name, namelen, type, data, |
311 | 316 | data_size, NULL); |
312 | 317 | if (ret < 0) { |
318 | + mutex_lock(&idmap->idmap_mutex); | |
313 | 319 | ret = nfs_idmap_request_key(&key_type_id_resolver_legacy, |
314 | 320 | name, namelen, type, data, |
315 | 321 | data_size, idmap); |
322 | + mutex_unlock(&idmap->idmap_mutex); | |
316 | 323 | } |
317 | 324 | return ret; |
318 | 325 | } |
... | ... | @@ -354,11 +361,6 @@ |
354 | 361 | /* idmap classic begins here */ |
355 | 362 | module_param(nfs_idmap_cache_timeout, int, 0644); |
356 | 363 | |
357 | -struct idmap { | |
358 | - struct rpc_pipe *idmap_pipe; | |
359 | - struct key_construction *idmap_key_cons; | |
360 | -}; | |
361 | - | |
362 | 364 | enum { |
363 | 365 | Opt_find_uid, Opt_find_gid, Opt_find_user, Opt_find_group, Opt_find_err |
364 | 366 | }; |
... | ... | @@ -469,6 +471,7 @@ |
469 | 471 | return error; |
470 | 472 | } |
471 | 473 | idmap->idmap_pipe = pipe; |
474 | + mutex_init(&idmap->idmap_mutex); | |
472 | 475 | |
473 | 476 | clp->cl_idmap = idmap; |
474 | 477 | return 0; |