36 #include <linux/types.h>
39 #include <linux/nfs_idmap.h>
42 #include <linux/nfs_fs.h>
48 #include <linux/module.h>
53 #define NFS_UINT_MAXLEN 11
55 static const struct cred *id_resolver_cache;
56 static struct key_type key_type_id_resolver_legacy;
85 static void nfs_fattr_free_owner_name(
struct nfs_fattr *fattr)
91 static void nfs_fattr_free_group_name(
struct nfs_fattr *fattr)
132 nfs_fattr_free_owner_name(fattr);
134 nfs_fattr_free_group_name(fattr);
147 if (nfs_fattr_map_owner_name(server, fattr))
148 nfs_fattr_free_owner_name(fattr);
149 if (nfs_fattr_map_group_name(server, fattr))
150 nfs_fattr_free_group_name(fattr);
158 if (
memchr(name,
'@', namelen) !=
NULL || namelen >=
sizeof(buf))
160 memcpy(buf, name, namelen);
162 if (kstrtoul(buf, 0, &val) != 0)
168 static int nfs_map_numeric_to_string(
__u32 id,
char *buf,
size_t buflen)
170 return snprintf(buf, buflen,
"%u",
id);
173 static struct key_type key_type_id_resolver = {
174 .name =
"id_resolver",
183 static int nfs_idmap_init_keyring(
void)
190 key_type_id_resolver.name);
197 (KEY_POS_ALL & ~KEY_POS_SETATTR) |
198 KEY_USR_VIEW | KEY_USR_READ,
199 KEY_ALLOC_NOT_IN_QUOTA);
200 if (IS_ERR(keyring)) {
201 ret = PTR_ERR(keyring);
202 goto failed_put_cred;
215 goto failed_reg_legacy;
217 set_bit(KEY_FLAG_ROOT_CAN_CLEAR, &keyring->flags);
218 cred->thread_keyring = keyring;
220 id_resolver_cache = cred;
232 static void nfs_idmap_quit_keyring(
void)
234 key_revoke(id_resolver_cache->thread_keyring);
237 put_cred(id_resolver_cache);
247 static ssize_t nfs_idmap_get_desc(
const char *name,
size_t namelen,
248 const char *
type,
size_t typelen,
char **
desc)
251 size_t desclen = typelen + namelen + 2;
258 memcpy(cp, type, typelen);
262 memcpy(cp, name, namelen);
268 static ssize_t nfs_idmap_request_key(
struct key_type *key_type,
269 const char *name,
size_t namelen,
270 const char *type,
void *
data,
273 const struct cred *saved_cred;
279 ret = nfs_idmap_get_desc(name, namelen, type,
strlen(type), &desc);
287 rkey =
request_key(&key_type_id_resolver, desc,
"");
297 rkey->perm |= KEY_USR_VIEW;
304 if (IS_ERR_OR_NULL(payload)) {
305 ret = PTR_ERR(payload);
310 if (ret > 0 && ret <= data_size)
322 static ssize_t nfs_idmap_get_key(
const char *name,
size_t namelen,
323 const char *type,
void *data,
324 size_t data_size,
struct idmap *idmap)
326 ssize_t ret = nfs_idmap_request_key(&key_type_id_resolver,
327 name, namelen, type, data,
331 ret = nfs_idmap_request_key(&key_type_id_resolver_legacy,
332 name, namelen, type, data,
340 static ssize_t nfs_idmap_lookup_name(
__u32 id,
const char *type,
char *buf,
341 size_t buflen,
struct idmap *idmap)
347 id_len =
snprintf(id_str,
sizeof(id_str),
"%u",
id);
348 ret = nfs_idmap_get_key(id_str, id_len, type, buf, buflen, idmap);
355 static int nfs_idmap_lookup_id(
const char *name,
size_t namelen,
const char *type,
356 __u32 *
id,
struct idmap *idmap)
363 data_size = nfs_idmap_get_key(name, namelen, type, id_str,
NFS_UINT_MAXLEN, idmap);
364 if (data_size <= 0) {
367 ret = kstrtol(id_str, 10, &id_long);
368 *
id = (
__u32)id_long;
387 static int nfs_idmap_legacy_upcall(
struct key_construction *,
const char *,
void *);
388 static ssize_t idmap_pipe_downcall(
struct file *,
const char __user *,
390 static void idmap_release_pipe(
struct inode *);
391 static void idmap_pipe_destroy_msg(
struct rpc_pipe_msg *);
393 static const struct rpc_pipe_ops idmap_upcall_ops = {
395 .downcall = idmap_pipe_downcall,
396 .release_pipe = idmap_release_pipe,
397 .destroy_msg = idmap_pipe_destroy_msg,
400 static struct key_type key_type_id_resolver_legacy = {
408 .request_key = nfs_idmap_legacy_upcall,
411 static void __nfs_idmap_unregister(
struct rpc_pipe *
pipe)
417 static int __nfs_idmap_register(
struct dentry *dir,
419 struct rpc_pipe *pipe)
425 return PTR_ERR(dentry);
426 pipe->dentry = dentry;
430 static void nfs_idmap_unregister(
struct nfs_client *clp,
431 struct rpc_pipe *pipe)
438 __nfs_idmap_unregister(pipe);
443 static int nfs_idmap_register(
struct nfs_client *clp,
445 struct rpc_pipe *pipe)
447 struct net *net = clp->
cl_net;
454 err = __nfs_idmap_register(clp->
cl_rpcclient->cl_dentry,
465 struct rpc_pipe *
pipe;
474 error = PTR_ERR(pipe);
478 error = nfs_idmap_register(clp, idmap, pipe);
487 clp->cl_idmap = idmap;
494 struct idmap *idmap = clp->cl_idmap;
500 clp->cl_idmap =
NULL;
504 static int __rpc_pipefs_event(
struct nfs_client *clp,
unsigned long event,
510 case RPC_PIPEFS_MOUNT:
511 err = __nfs_idmap_register(clp->
cl_rpcclient->cl_dentry,
513 clp->cl_idmap->idmap_pipe);
515 case RPC_PIPEFS_UMOUNT:
516 if (clp->cl_idmap->idmap_pipe) {
519 parent = clp->cl_idmap->idmap_pipe->dentry->d_parent;
520 __nfs_idmap_unregister(clp->cl_idmap->idmap_pipe);
530 "clnt dir!\n", __func__);
541 static struct nfs_client *nfs_get_client_for_event(
struct net *net,
int event)
544 struct dentry *cl_dentry;
567 cl_dentry = clp->cl_idmap->idmap_pipe->dentry;
568 if (((event == RPC_PIPEFS_MOUNT) && cl_dentry) ||
569 ((event == RPC_PIPEFS_UMOUNT) && !cl_dentry))
579 static int rpc_pipefs_event(
struct notifier_block *nb,
unsigned long event,
589 while ((clp = nfs_get_client_for_event(sb->
s_fs_info, event))) {
590 error = __rpc_pipefs_event(clp, event, sb);
599 #define PIPEFS_NFS_PRIO 1
602 .notifier_call = rpc_pipefs_event,
603 .priority = SUNRPC_PIPEFS_NFS_PRIO,
609 ret = nfs_idmap_init_keyring();
614 nfs_idmap_quit_keyring();
622 nfs_idmap_quit_keyring();
625 static int nfs_idmap_prepare_message(
char *desc,
struct idmap *idmap,
627 struct rpc_pipe_msg *
msg)
633 token =
match_token(desc, nfs_idmap_tokens, &substr);
663 nfs_idmap_prepare_pipe_upcall(
struct idmap *idmap,
675 nfs_idmap_complete_pipe_upcall_locked(
struct idmap *idmap,
int ret)
685 nfs_idmap_abort_pipe_upcall(
struct idmap *idmap,
int ret)
688 nfs_idmap_complete_pipe_upcall_locked(idmap, ret);
691 static int nfs_idmap_legacy_upcall(
struct key_construction *
cons,
696 struct rpc_pipe_msg *
msg;
698 struct idmap *idmap = (
struct idmap *)aux;
699 struct key *
key = cons->key;
712 ret = nfs_idmap_prepare_message(key->description, idmap, im, msg);
717 if (!nfs_idmap_prepare_pipe_upcall(idmap, data))
722 nfs_idmap_abort_pipe_upcall(idmap, ret);
732 static int nfs_idmap_instantiate(
struct key *key,
struct key *authkey,
char *data)
735 id_resolver_cache->thread_keyring,
739 static int nfs_idmap_read_and_verify_message(
struct idmap_msg *im,
741 struct key *key,
struct key *authkey)
754 ret = nfs_idmap_instantiate(key, authkey, id_str);
759 ret = nfs_idmap_instantiate(key, authkey, im->
im_name);
769 idmap_pipe_downcall(
struct file *filp,
const char __user *
src,
size_t mlen)
771 struct rpc_inode *rpci = RPC_I(filp->
f_path.dentry->d_inode);
772 struct idmap *idmap = (
struct idmap *)rpci->private;
773 struct key_construction *cons;
787 if (mlen !=
sizeof(im)) {
808 ret = nfs_idmap_read_and_verify_message(&im,
810 cons->key, cons->authkey);
817 nfs_idmap_complete_pipe_upcall_locked(idmap, ret);
823 idmap_pipe_destroy_msg(
struct rpc_pipe_msg *msg)
828 struct idmap *idmap = data->
idmap;
831 nfs_idmap_abort_pipe_upcall(idmap, msg->errno);
837 struct rpc_inode *rpci = RPC_I(inode);
838 struct idmap *idmap = (
struct idmap *)rpci->private;
840 nfs_idmap_abort_pipe_upcall(idmap, -
EPIPE);
845 struct idmap *idmap = server->
nfs_client->cl_idmap;
847 if (nfs_map_string_to_numeric(name, namelen, uid))
849 return nfs_idmap_lookup_id(name, namelen,
"uid", uid, idmap);
854 struct idmap *idmap = server->
nfs_client->cl_idmap;
856 if (nfs_map_string_to_numeric(name, namelen, gid))
858 return nfs_idmap_lookup_id(name, namelen,
"gid", gid, idmap);
863 struct idmap *idmap = server->
nfs_client->cl_idmap;
867 ret = nfs_idmap_lookup_name(uid,
"user", buf, buflen, idmap);
869 ret = nfs_map_numeric_to_string(uid, buf, buflen);
874 struct idmap *idmap = server->
nfs_client->cl_idmap;
878 ret = nfs_idmap_lookup_name(gid,
"group", buf, buflen, idmap);
880 ret = nfs_map_numeric_to_string(gid, buf, buflen);