aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/idmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfs/idmap.c')
-rw-r--r--fs/nfs/idmap.c53
1 files changed, 36 insertions, 17 deletions
diff --git a/fs/nfs/idmap.c b/fs/nfs/idmap.c
index bc3968fa81e5..b9623d19d599 100644
--- a/fs/nfs/idmap.c
+++ b/fs/nfs/idmap.c
@@ -97,7 +97,7 @@ static void nfs_fattr_free_group_name(struct nfs_fattr *fattr)
97static bool nfs_fattr_map_owner_name(struct nfs_server *server, struct nfs_fattr *fattr) 97static bool nfs_fattr_map_owner_name(struct nfs_server *server, struct nfs_fattr *fattr)
98{ 98{
99 struct nfs4_string *owner = fattr->owner_name; 99 struct nfs4_string *owner = fattr->owner_name;
100 __u32 uid; 100 kuid_t uid;
101 101
102 if (!(fattr->valid & NFS_ATTR_FATTR_OWNER_NAME)) 102 if (!(fattr->valid & NFS_ATTR_FATTR_OWNER_NAME))
103 return false; 103 return false;
@@ -111,7 +111,7 @@ static bool nfs_fattr_map_owner_name(struct nfs_server *server, struct nfs_fattr
111static bool nfs_fattr_map_group_name(struct nfs_server *server, struct nfs_fattr *fattr) 111static bool nfs_fattr_map_group_name(struct nfs_server *server, struct nfs_fattr *fattr)
112{ 112{
113 struct nfs4_string *group = fattr->group_name; 113 struct nfs4_string *group = fattr->group_name;
114 __u32 gid; 114 kgid_t gid;
115 115
116 if (!(fattr->valid & NFS_ATTR_FATTR_GROUP_NAME)) 116 if (!(fattr->valid & NFS_ATTR_FATTR_GROUP_NAME))
117 return false; 117 return false;
@@ -193,7 +193,8 @@ static int nfs_idmap_init_keyring(void)
193 if (!cred) 193 if (!cred)
194 return -ENOMEM; 194 return -ENOMEM;
195 195
196 keyring = keyring_alloc(".id_resolver", 0, 0, cred, 196 keyring = keyring_alloc(".id_resolver",
197 GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, cred,
197 (KEY_POS_ALL & ~KEY_POS_SETATTR) | 198 (KEY_POS_ALL & ~KEY_POS_SETATTR) |
198 KEY_USR_VIEW | KEY_USR_READ, 199 KEY_USR_VIEW | KEY_USR_READ,
199 KEY_ALLOC_NOT_IN_QUOTA, NULL); 200 KEY_ALLOC_NOT_IN_QUOTA, NULL);
@@ -836,43 +837,61 @@ idmap_release_pipe(struct inode *inode)
836 nfs_idmap_abort_pipe_upcall(idmap, -EPIPE); 837 nfs_idmap_abort_pipe_upcall(idmap, -EPIPE);
837} 838}
838 839
839int nfs_map_name_to_uid(const struct nfs_server *server, const char *name, size_t namelen, __u32 *uid) 840int nfs_map_name_to_uid(const struct nfs_server *server, const char *name, size_t namelen, kuid_t *uid)
840{ 841{
841 struct idmap *idmap = server->nfs_client->cl_idmap; 842 struct idmap *idmap = server->nfs_client->cl_idmap;
843 __u32 id = -1;
844 int ret = 0;
842 845
843 if (nfs_map_string_to_numeric(name, namelen, uid)) 846 if (!nfs_map_string_to_numeric(name, namelen, &id))
844 return 0; 847 ret = nfs_idmap_lookup_id(name, namelen, "uid", &id, idmap);
845 return nfs_idmap_lookup_id(name, namelen, "uid", uid, idmap); 848 if (ret == 0) {
849 *uid = make_kuid(&init_user_ns, id);
850 if (!uid_valid(*uid))
851 ret = -ERANGE;
852 }
853 return ret;
846} 854}
847 855
848int nfs_map_group_to_gid(const struct nfs_server *server, const char *name, size_t namelen, __u32 *gid) 856int nfs_map_group_to_gid(const struct nfs_server *server, const char *name, size_t namelen, kgid_t *gid)
849{ 857{
850 struct idmap *idmap = server->nfs_client->cl_idmap; 858 struct idmap *idmap = server->nfs_client->cl_idmap;
859 __u32 id = -1;
860 int ret = 0;
851 861
852 if (nfs_map_string_to_numeric(name, namelen, gid)) 862 if (!nfs_map_string_to_numeric(name, namelen, &id))
853 return 0; 863 ret = nfs_idmap_lookup_id(name, namelen, "gid", &id, idmap);
854 return nfs_idmap_lookup_id(name, namelen, "gid", gid, idmap); 864 if (ret == 0) {
865 *gid = make_kgid(&init_user_ns, id);
866 if (!gid_valid(*gid))
867 ret = -ERANGE;
868 }
869 return ret;
855} 870}
856 871
857int nfs_map_uid_to_name(const struct nfs_server *server, __u32 uid, char *buf, size_t buflen) 872int nfs_map_uid_to_name(const struct nfs_server *server, kuid_t uid, char *buf, size_t buflen)
858{ 873{
859 struct idmap *idmap = server->nfs_client->cl_idmap; 874 struct idmap *idmap = server->nfs_client->cl_idmap;
860 int ret = -EINVAL; 875 int ret = -EINVAL;
876 __u32 id;
861 877
878 id = from_kuid(&init_user_ns, uid);
862 if (!(server->caps & NFS_CAP_UIDGID_NOMAP)) 879 if (!(server->caps & NFS_CAP_UIDGID_NOMAP))
863 ret = nfs_idmap_lookup_name(uid, "user", buf, buflen, idmap); 880 ret = nfs_idmap_lookup_name(id, "user", buf, buflen, idmap);
864 if (ret < 0) 881 if (ret < 0)
865 ret = nfs_map_numeric_to_string(uid, buf, buflen); 882 ret = nfs_map_numeric_to_string(id, buf, buflen);
866 return ret; 883 return ret;
867} 884}
868int nfs_map_gid_to_group(const struct nfs_server *server, __u32 gid, char *buf, size_t buflen) 885int nfs_map_gid_to_group(const struct nfs_server *server, kgid_t gid, char *buf, size_t buflen)
869{ 886{
870 struct idmap *idmap = server->nfs_client->cl_idmap; 887 struct idmap *idmap = server->nfs_client->cl_idmap;
871 int ret = -EINVAL; 888 int ret = -EINVAL;
889 __u32 id;
872 890
891 id = from_kgid(&init_user_ns, gid);
873 if (!(server->caps & NFS_CAP_UIDGID_NOMAP)) 892 if (!(server->caps & NFS_CAP_UIDGID_NOMAP))
874 ret = nfs_idmap_lookup_name(gid, "group", buf, buflen, idmap); 893 ret = nfs_idmap_lookup_name(id, "group", buf, buflen, idmap);
875 if (ret < 0) 894 if (ret < 0)
876 ret = nfs_map_numeric_to_string(gid, buf, buflen); 895 ret = nfs_map_numeric_to_string(id, buf, buflen);
877 return ret; 896 return ret;
878} 897}