diff options
Diffstat (limited to 'fs/nfs/idmap.c')
| -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) |
