Commit b1027439dff844675f6c0df97a1b1d190791a699

Authored by Bryan Schumaker
Committed by Trond Myklebust
1 parent 1a0de48ae5

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

... ... @@ -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;