diff options
-rw-r--r-- | fs/nfs/idmap.c | 56 |
1 files changed, 26 insertions, 30 deletions
diff --git a/fs/nfs/idmap.c b/fs/nfs/idmap.c index c516da5873fd..c2c4163d5683 100644 --- a/fs/nfs/idmap.c +++ b/fs/nfs/idmap.c | |||
@@ -262,29 +262,42 @@ static ssize_t nfs_idmap_get_desc(const char *name, size_t namelen, | |||
262 | return desclen; | 262 | return desclen; |
263 | } | 263 | } |
264 | 264 | ||
265 | static ssize_t nfs_idmap_request_key(struct key_type *key_type, | 265 | static struct key *nfs_idmap_request_key(const char *name, size_t namelen, |
266 | const char *name, size_t namelen, | 266 | const char *type, struct idmap *idmap) |
267 | const char *type, void *data, | ||
268 | size_t data_size, struct idmap *idmap) | ||
269 | { | 267 | { |
270 | const struct cred *saved_cred; | ||
271 | struct key *rkey; | ||
272 | char *desc; | 268 | char *desc; |
273 | struct user_key_payload *payload; | 269 | struct key *rkey; |
274 | ssize_t ret; | 270 | ssize_t ret; |
275 | 271 | ||
276 | ret = nfs_idmap_get_desc(name, namelen, type, strlen(type), &desc); | 272 | ret = nfs_idmap_get_desc(name, namelen, type, strlen(type), &desc); |
277 | if (ret <= 0) | 273 | if (ret <= 0) |
278 | goto out; | 274 | return ERR_PTR(ret); |
275 | |||
276 | rkey = request_key(&key_type_id_resolver, desc, ""); | ||
277 | if (IS_ERR(rkey)) { | ||
278 | mutex_lock(&idmap->idmap_mutex); | ||
279 | rkey = request_key_with_auxdata(&key_type_id_resolver_legacy, | ||
280 | desc, "", 0, idmap); | ||
281 | mutex_unlock(&idmap->idmap_mutex); | ||
282 | } | ||
283 | |||
284 | kfree(desc); | ||
285 | return rkey; | ||
286 | } | ||
287 | |||
288 | static ssize_t nfs_idmap_get_key(const char *name, size_t namelen, | ||
289 | const char *type, void *data, | ||
290 | size_t data_size, struct idmap *idmap) | ||
291 | { | ||
292 | const struct cred *saved_cred; | ||
293 | struct key *rkey; | ||
294 | struct user_key_payload *payload; | ||
295 | ssize_t ret; | ||
279 | 296 | ||
280 | saved_cred = override_creds(id_resolver_cache); | 297 | saved_cred = override_creds(id_resolver_cache); |
281 | if (idmap) | 298 | rkey = nfs_idmap_request_key(name, namelen, type, idmap); |
282 | rkey = request_key_with_auxdata(key_type, desc, "", 0, idmap); | ||
283 | else | ||
284 | rkey = request_key(&key_type_id_resolver, desc, ""); | ||
285 | revert_creds(saved_cred); | 299 | revert_creds(saved_cred); |
286 | 300 | ||
287 | kfree(desc); | ||
288 | if (IS_ERR(rkey)) { | 301 | if (IS_ERR(rkey)) { |
289 | ret = PTR_ERR(rkey); | 302 | ret = PTR_ERR(rkey); |
290 | goto out; | 303 | goto out; |
@@ -316,23 +329,6 @@ out: | |||
316 | return ret; | 329 | return ret; |
317 | } | 330 | } |
318 | 331 | ||
319 | static ssize_t nfs_idmap_get_key(const char *name, size_t namelen, | ||
320 | const char *type, void *data, | ||
321 | size_t data_size, struct idmap *idmap) | ||
322 | { | ||
323 | ssize_t ret = nfs_idmap_request_key(&key_type_id_resolver, | ||
324 | name, namelen, type, data, | ||
325 | data_size, NULL); | ||
326 | if (ret < 0) { | ||
327 | mutex_lock(&idmap->idmap_mutex); | ||
328 | ret = nfs_idmap_request_key(&key_type_id_resolver_legacy, | ||
329 | name, namelen, type, data, | ||
330 | data_size, idmap); | ||
331 | mutex_unlock(&idmap->idmap_mutex); | ||
332 | } | ||
333 | return ret; | ||
334 | } | ||
335 | |||
336 | /* ID -> Name */ | 332 | /* ID -> Name */ |
337 | static ssize_t nfs_idmap_lookup_name(__u32 id, const char *type, char *buf, | 333 | static ssize_t nfs_idmap_lookup_name(__u32 id, const char *type, char *buf, |
338 | size_t buflen, struct idmap *idmap) | 334 | size_t buflen, struct idmap *idmap) |