diff options
Diffstat (limited to 'fs/nfs/idmap.c')
-rw-r--r-- | fs/nfs/idmap.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/fs/nfs/idmap.c b/fs/nfs/idmap.c index 47d1c6ff2d8e..2c05f1991e1e 100644 --- a/fs/nfs/idmap.c +++ b/fs/nfs/idmap.c | |||
@@ -38,6 +38,89 @@ | |||
38 | #include <linux/kernel.h> | 38 | #include <linux/kernel.h> |
39 | #include <linux/slab.h> | 39 | #include <linux/slab.h> |
40 | #include <linux/nfs_idmap.h> | 40 | #include <linux/nfs_idmap.h> |
41 | #include <linux/nfs_fs.h> | ||
42 | |||
43 | /** | ||
44 | * nfs_fattr_init_names - initialise the nfs_fattr owner_name/group_name fields | ||
45 | * @fattr: fully initialised struct nfs_fattr | ||
46 | * @owner_name: owner name string cache | ||
47 | * @group_name: group name string cache | ||
48 | */ | ||
49 | void nfs_fattr_init_names(struct nfs_fattr *fattr, | ||
50 | struct nfs4_string *owner_name, | ||
51 | struct nfs4_string *group_name) | ||
52 | { | ||
53 | fattr->owner_name = owner_name; | ||
54 | fattr->group_name = group_name; | ||
55 | } | ||
56 | |||
57 | static void nfs_fattr_free_owner_name(struct nfs_fattr *fattr) | ||
58 | { | ||
59 | fattr->valid &= ~NFS_ATTR_FATTR_OWNER_NAME; | ||
60 | kfree(fattr->owner_name->data); | ||
61 | } | ||
62 | |||
63 | static void nfs_fattr_free_group_name(struct nfs_fattr *fattr) | ||
64 | { | ||
65 | fattr->valid &= ~NFS_ATTR_FATTR_GROUP_NAME; | ||
66 | kfree(fattr->group_name->data); | ||
67 | } | ||
68 | |||
69 | static bool nfs_fattr_map_owner_name(struct nfs_server *server, struct nfs_fattr *fattr) | ||
70 | { | ||
71 | struct nfs4_string *owner = fattr->owner_name; | ||
72 | __u32 uid; | ||
73 | |||
74 | if (!(fattr->valid & NFS_ATTR_FATTR_OWNER_NAME)) | ||
75 | return false; | ||
76 | if (nfs_map_name_to_uid(server, owner->data, owner->len, &uid) == 0) { | ||
77 | fattr->uid = uid; | ||
78 | fattr->valid |= NFS_ATTR_FATTR_OWNER; | ||
79 | } | ||
80 | return true; | ||
81 | } | ||
82 | |||
83 | static bool nfs_fattr_map_group_name(struct nfs_server *server, struct nfs_fattr *fattr) | ||
84 | { | ||
85 | struct nfs4_string *group = fattr->group_name; | ||
86 | __u32 gid; | ||
87 | |||
88 | if (!(fattr->valid & NFS_ATTR_FATTR_GROUP_NAME)) | ||
89 | return false; | ||
90 | if (nfs_map_group_to_gid(server, group->data, group->len, &gid) == 0) { | ||
91 | fattr->gid = gid; | ||
92 | fattr->valid |= NFS_ATTR_FATTR_GROUP; | ||
93 | } | ||
94 | return true; | ||
95 | } | ||
96 | |||
97 | /** | ||
98 | * nfs_fattr_free_names - free up the NFSv4 owner and group strings | ||
99 | * @fattr: a fully initialised nfs_fattr structure | ||
100 | */ | ||
101 | void nfs_fattr_free_names(struct nfs_fattr *fattr) | ||
102 | { | ||
103 | if (fattr->valid & NFS_ATTR_FATTR_OWNER_NAME) | ||
104 | nfs_fattr_free_owner_name(fattr); | ||
105 | if (fattr->valid & NFS_ATTR_FATTR_GROUP_NAME) | ||
106 | nfs_fattr_free_group_name(fattr); | ||
107 | } | ||
108 | |||
109 | /** | ||
110 | * nfs_fattr_map_and_free_names - map owner/group strings into uid/gid and free | ||
111 | * @server: pointer to the filesystem nfs_server structure | ||
112 | * @fattr: a fully initialised nfs_fattr structure | ||
113 | * | ||
114 | * This helper maps the cached NFSv4 owner/group strings in fattr into | ||
115 | * their numeric uid/gid equivalents, and then frees the cached strings. | ||
116 | */ | ||
117 | void nfs_fattr_map_and_free_names(struct nfs_server *server, struct nfs_fattr *fattr) | ||
118 | { | ||
119 | if (nfs_fattr_map_owner_name(server, fattr)) | ||
120 | nfs_fattr_free_owner_name(fattr); | ||
121 | if (nfs_fattr_map_group_name(server, fattr)) | ||
122 | nfs_fattr_free_group_name(fattr); | ||
123 | } | ||
41 | 124 | ||
42 | static int nfs_map_string_to_numeric(const char *name, size_t namelen, __u32 *res) | 125 | static int nfs_map_string_to_numeric(const char *name, size_t namelen, __u32 *res) |
43 | { | 126 | { |