NFS: Improve legacy idmapping fallback
authorBryan Schumaker <bjschuma@netapp.com>
Wed, 26 Jun 2013 18:09:46 +0000 (14:09 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Fri, 28 Jun 2013 19:22:07 +0000 (15:22 -0400)
Fallback should happen only when the request_key() call fails, because
this indicates that there was a problem running the nfsidmap program.
We shouldn't call the legacy code if the error was elsewhere.

Signed-off-by: Bryan Schumaker <bjschuma@netappp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/idmap.c

index c516da5873fd12df0d3c9877b2c3189423c0dec4..c2c4163d56832fd94193c2865faeb64df11e8b74 100644 (file)
@@ -262,29 +262,42 @@ static ssize_t nfs_idmap_get_desc(const char *name, size_t namelen,
        return desclen;
 }
 
-static ssize_t nfs_idmap_request_key(struct key_type *key_type,
-                                    const char *name, size_t namelen,
-                                    const char *type, void *data,
-                                    size_t data_size, struct idmap *idmap)
+static struct key *nfs_idmap_request_key(const char *name, size_t namelen,
+                                        const char *type, struct idmap *idmap)
 {
-       const struct cred *saved_cred;
-       struct key *rkey;
        char *desc;
-       struct user_key_payload *payload;
+       struct key *rkey;
        ssize_t ret;
 
        ret = nfs_idmap_get_desc(name, namelen, type, strlen(type), &desc);
        if (ret <= 0)
-               goto out;
+               return ERR_PTR(ret);
+
+       rkey = request_key(&key_type_id_resolver, desc, "");
+       if (IS_ERR(rkey)) {
+               mutex_lock(&idmap->idmap_mutex);
+               rkey = request_key_with_auxdata(&key_type_id_resolver_legacy,
+                                               desc, "", 0, idmap);
+               mutex_unlock(&idmap->idmap_mutex);
+       }
+
+       kfree(desc);
+       return rkey;
+}
+
+static ssize_t nfs_idmap_get_key(const char *name, size_t namelen,
+                                const char *type, void *data,
+                                size_t data_size, struct idmap *idmap)
+{
+       const struct cred *saved_cred;
+       struct key *rkey;
+       struct user_key_payload *payload;
+       ssize_t ret;
 
        saved_cred = override_creds(id_resolver_cache);
-       if (idmap)
-               rkey = request_key_with_auxdata(key_type, desc, "", 0, idmap);
-       else
-               rkey = request_key(&key_type_id_resolver, desc, "");
+       rkey = nfs_idmap_request_key(name, namelen, type, idmap);
        revert_creds(saved_cred);
 
-       kfree(desc);
        if (IS_ERR(rkey)) {
                ret = PTR_ERR(rkey);
                goto out;
@@ -316,23 +329,6 @@ out:
        return ret;
 }
 
-static ssize_t nfs_idmap_get_key(const char *name, size_t namelen,
-                                const char *type, void *data,
-                                size_t data_size, struct idmap *idmap)
-{
-       ssize_t ret = nfs_idmap_request_key(&key_type_id_resolver,
-                                           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;
-}
-
 /* ID -> Name */
 static ssize_t nfs_idmap_lookup_name(__u32 id, const char *type, char *buf,
                                     size_t buflen, struct idmap *idmap)