| From b1027439dff844675f6c0df97a1b1d190791a699 Mon Sep 17 00:00:00 2001 |
| From: Bryan Schumaker <bjschuma@netapp.com> |
| Date: Wed, 20 Jun 2012 14:35:28 -0400 |
| Subject: NFS: Force the legacy idmapper to be single threaded |
| |
| From: Bryan Schumaker <bjschuma@netapp.com> |
| |
| commit b1027439dff844675f6c0df97a1b1d190791a699 upstream. |
| |
| 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> |
| Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/nfs/idmap.c | 13 ++++++++----- |
| 1 file changed, 8 insertions(+), 5 deletions(-) |
| |
| --- a/fs/nfs/idmap.c |
| +++ b/fs/nfs/idmap.c |
| @@ -57,6 +57,11 @@ unsigned int nfs_idmap_cache_timeout = 6 |
| static const struct cred *id_resolver_cache; |
| static struct key_type key_type_id_resolver_legacy; |
| |
| +struct idmap { |
| + struct rpc_pipe *idmap_pipe; |
| + struct key_construction *idmap_key_cons; |
| + struct mutex idmap_mutex; |
| +}; |
| |
| /** |
| * nfs_fattr_init_names - initialise the nfs_fattr owner_name/group_name fields |
| @@ -310,9 +315,11 @@ static ssize_t nfs_idmap_get_key(const c |
| name, namelen, type, data, |
| data_size, NULL); |
| if (ret < 0) { |
| + mutex_lock(&idmap->idmap_mutex); |
| ret = nfs_idmap_request_key(&key_type_id_resolver_legacy, |
| name, namelen, type, data, |
| data_size, idmap); |
| + mutex_unlock(&idmap->idmap_mutex); |
| } |
| return ret; |
| } |
| @@ -354,11 +361,6 @@ static int nfs_idmap_lookup_id(const cha |
| /* idmap classic begins here */ |
| module_param(nfs_idmap_cache_timeout, int, 0644); |
| |
| -struct idmap { |
| - struct rpc_pipe *idmap_pipe; |
| - struct key_construction *idmap_key_cons; |
| -}; |
| - |
| enum { |
| Opt_find_uid, Opt_find_gid, Opt_find_user, Opt_find_group, Opt_find_err |
| }; |
| @@ -469,6 +471,7 @@ nfs_idmap_new(struct nfs_client *clp) |
| return error; |
| } |
| idmap->idmap_pipe = pipe; |
| + mutex_init(&idmap->idmap_mutex); |
| |
| clp->cl_idmap = idmap; |
| return 0; |