NFS: Improve legacy idmapping fallback
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>
This commit is contained in:
committed by
Trond Myklebust
parent
62f288a02f
commit
ffa57b9e53
@@ -262,29 +262,42 @@ static ssize_t nfs_idmap_get_desc(const char *name, size_t namelen,
|
|||||||
return desclen;
|
return desclen;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t nfs_idmap_request_key(struct key_type *key_type,
|
static struct key *nfs_idmap_request_key(const char *name, size_t namelen,
|
||||||
const char *name, size_t namelen,
|
const char *type, struct idmap *idmap)
|
||||||
const char *type, void *data,
|
|
||||||
size_t data_size, struct idmap *idmap)
|
|
||||||
{
|
{
|
||||||
const struct cred *saved_cred;
|
|
||||||
struct key *rkey;
|
|
||||||
char *desc;
|
char *desc;
|
||||||
struct user_key_payload *payload;
|
struct key *rkey;
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
|
|
||||||
ret = nfs_idmap_get_desc(name, namelen, type, strlen(type), &desc);
|
ret = nfs_idmap_get_desc(name, namelen, type, strlen(type), &desc);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
goto out;
|
return ERR_PTR(ret);
|
||||||
|
|
||||||
saved_cred = override_creds(id_resolver_cache);
|
rkey = request_key(&key_type_id_resolver, desc, "");
|
||||||
if (idmap)
|
if (IS_ERR(rkey)) {
|
||||||
rkey = request_key_with_auxdata(key_type, desc, "", 0, idmap);
|
mutex_lock(&idmap->idmap_mutex);
|
||||||
else
|
rkey = request_key_with_auxdata(&key_type_id_resolver_legacy,
|
||||||
rkey = request_key(&key_type_id_resolver, desc, "");
|
desc, "", 0, idmap);
|
||||||
revert_creds(saved_cred);
|
mutex_unlock(&idmap->idmap_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
kfree(desc);
|
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);
|
||||||
|
rkey = nfs_idmap_request_key(name, namelen, type, idmap);
|
||||||
|
revert_creds(saved_cred);
|
||||||
|
|
||||||
if (IS_ERR(rkey)) {
|
if (IS_ERR(rkey)) {
|
||||||
ret = PTR_ERR(rkey);
|
ret = PTR_ERR(rkey);
|
||||||
goto out;
|
goto out;
|
||||||
@@ -316,23 +329,6 @@ out:
|
|||||||
return ret;
|
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 */
|
/* ID -> Name */
|
||||||
static ssize_t nfs_idmap_lookup_name(__u32 id, const char *type, char *buf,
|
static ssize_t nfs_idmap_lookup_name(__u32 id, const char *type, char *buf,
|
||||||
size_t buflen, struct idmap *idmap)
|
size_t buflen, struct idmap *idmap)
|
||||||
|
Reference in New Issue
Block a user