diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-01-03 03:55:57 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-01-06 14:58:58 -0500 |
commit | 58df095b732529ade8f4051b41d7c29731afecd6 (patch) | |
tree | 917819b96bac91e5daea7a31eb6eba66268952d9 /fs/nfs/idmap.c | |
parent | 0065db328533c390fbfb0fe0c46bcf9a278fb99e (diff) |
NFSv4: Allow entries in the idmap cache to expire
If someone changes the uid/gid mapping in userland, then we do eventually
want those changes to be propagated to the kernel. Currently the kernel
assumes that it may cache entries forever.
Add an expiration time + garbage collector for idmap entries.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/idmap.c')
-rw-r--r-- | fs/nfs/idmap.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/nfs/idmap.c b/fs/nfs/idmap.c index ffb8df91dc34..821edd30333b 100644 --- a/fs/nfs/idmap.c +++ b/fs/nfs/idmap.c | |||
@@ -54,7 +54,11 @@ | |||
54 | 54 | ||
55 | #define IDMAP_HASH_SZ 128 | 55 | #define IDMAP_HASH_SZ 128 |
56 | 56 | ||
57 | /* Default cache timeout is 10 minutes */ | ||
58 | unsigned int nfs_idmap_cache_timeout = 600 * HZ; | ||
59 | |||
57 | struct idmap_hashent { | 60 | struct idmap_hashent { |
61 | unsigned long ih_expires; | ||
58 | __u32 ih_id; | 62 | __u32 ih_id; |
59 | int ih_namelen; | 63 | int ih_namelen; |
60 | char ih_name[IDMAP_NAMESZ]; | 64 | char ih_name[IDMAP_NAMESZ]; |
@@ -149,6 +153,8 @@ idmap_lookup_name(struct idmap_hashtable *h, const char *name, size_t len) | |||
149 | 153 | ||
150 | if (he->ih_namelen != len || memcmp(he->ih_name, name, len) != 0) | 154 | if (he->ih_namelen != len || memcmp(he->ih_name, name, len) != 0) |
151 | return NULL; | 155 | return NULL; |
156 | if (time_after(jiffies, he->ih_expires)) | ||
157 | return NULL; | ||
152 | return he; | 158 | return he; |
153 | } | 159 | } |
154 | 160 | ||
@@ -164,6 +170,8 @@ idmap_lookup_id(struct idmap_hashtable *h, __u32 id) | |||
164 | struct idmap_hashent *he = idmap_id_hash(h, id); | 170 | struct idmap_hashent *he = idmap_id_hash(h, id); |
165 | if (he->ih_id != id || he->ih_namelen == 0) | 171 | if (he->ih_id != id || he->ih_namelen == 0) |
166 | return NULL; | 172 | return NULL; |
173 | if (time_after(jiffies, he->ih_expires)) | ||
174 | return NULL; | ||
167 | return he; | 175 | return he; |
168 | } | 176 | } |
169 | 177 | ||
@@ -192,6 +200,7 @@ idmap_update_entry(struct idmap_hashent *he, const char *name, | |||
192 | memcpy(he->ih_name, name, namelen); | 200 | memcpy(he->ih_name, name, namelen); |
193 | he->ih_name[namelen] = '\0'; | 201 | he->ih_name[namelen] = '\0'; |
194 | he->ih_namelen = namelen; | 202 | he->ih_namelen = namelen; |
203 | he->ih_expires = jiffies + nfs_idmap_cache_timeout; | ||
195 | } | 204 | } |
196 | 205 | ||
197 | /* | 206 | /* |