diff options
-rw-r--r-- | fs/lockd/clntlock.c | 5 | ||||
-rw-r--r-- | fs/lockd/host.c | 32 | ||||
-rw-r--r-- | include/linux/lockd/lockd.h | 9 |
3 files changed, 28 insertions, 18 deletions
diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c index 237224a3c420..9eaf306d15fa 100644 --- a/fs/lockd/clntlock.c +++ b/fs/lockd/clntlock.c | |||
@@ -58,10 +58,9 @@ struct nlm_host *nlmclnt_init(const struct nlmclnt_initdata *nlm_init) | |||
58 | if (status < 0) | 58 | if (status < 0) |
59 | return ERR_PTR(status); | 59 | return ERR_PTR(status); |
60 | 60 | ||
61 | host = nlmclnt_lookup_host((struct sockaddr_in *)nlm_init->address, | 61 | host = nlmclnt_lookup_host(nlm_init->address, nlm_init->addrlen, |
62 | nlm_init->protocol, nlm_version, | 62 | nlm_init->protocol, nlm_version, |
63 | nlm_init->hostname, | 63 | nlm_init->hostname); |
64 | strlen(nlm_init->hostname)); | ||
65 | if (host == NULL) { | 64 | if (host == NULL) { |
66 | lockd_down(); | 65 | lockd_down(); |
67 | return ERR_PTR(-ENOLCK); | 66 | return ERR_PTR(-ENOLCK); |
diff --git a/fs/lockd/host.c b/fs/lockd/host.c index 5876b0e4c0be..cbd2398e594c 100644 --- a/fs/lockd/host.c +++ b/fs/lockd/host.c | |||
@@ -264,32 +264,42 @@ nlm_destroy_host(struct nlm_host *host) | |||
264 | kfree(host); | 264 | kfree(host); |
265 | } | 265 | } |
266 | 266 | ||
267 | /* | 267 | /** |
268 | * Find an NLM server handle in the cache. If there is none, create it. | 268 | * nlmclnt_lookup_host - Find an NLM host handle matching a remote server |
269 | * @sap: network address of server | ||
270 | * @salen: length of server address | ||
271 | * @protocol: transport protocol to use | ||
272 | * @version: NLM protocol version | ||
273 | * @hostname: '\0'-terminated hostname of server | ||
274 | * | ||
275 | * Returns an nlm_host structure that matches the passed-in | ||
276 | * [server address, transport protocol, NLM version, server hostname]. | ||
277 | * If one doesn't already exist in the host cache, a new handle is | ||
278 | * created and returned. | ||
269 | */ | 279 | */ |
270 | struct nlm_host *nlmclnt_lookup_host(const struct sockaddr_in *sin, | 280 | struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap, |
271 | int proto, u32 version, | 281 | const size_t salen, |
272 | const char *hostname, | 282 | const unsigned short protocol, |
273 | unsigned int hostname_len) | 283 | const u32 version, const char *hostname) |
274 | { | 284 | { |
275 | const struct sockaddr source = { | 285 | const struct sockaddr source = { |
276 | .sa_family = AF_UNSPEC, | 286 | .sa_family = AF_UNSPEC, |
277 | }; | 287 | }; |
278 | struct nlm_lookup_host_info ni = { | 288 | struct nlm_lookup_host_info ni = { |
279 | .server = 0, | 289 | .server = 0, |
280 | .sap = (struct sockaddr *)sin, | 290 | .sap = sap, |
281 | .salen = sizeof(*sin), | 291 | .salen = salen, |
282 | .protocol = proto, | 292 | .protocol = protocol, |
283 | .version = version, | 293 | .version = version, |
284 | .hostname = hostname, | 294 | .hostname = hostname, |
285 | .hostname_len = hostname_len, | 295 | .hostname_len = strlen(hostname), |
286 | .src_sap = &source, | 296 | .src_sap = &source, |
287 | .src_len = sizeof(source), | 297 | .src_len = sizeof(source), |
288 | }; | 298 | }; |
289 | 299 | ||
290 | dprintk("lockd: %s(host='%s', vers=%u, proto=%s)\n", __func__, | 300 | dprintk("lockd: %s(host='%s', vers=%u, proto=%s)\n", __func__, |
291 | (hostname ? hostname : "<none>"), version, | 301 | (hostname ? hostname : "<none>"), version, |
292 | (proto == IPPROTO_UDP ? "udp" : "tcp")); | 302 | (protocol == IPPROTO_UDP ? "udp" : "tcp")); |
293 | 303 | ||
294 | return nlm_lookup_host(&ni); | 304 | return nlm_lookup_host(&ni); |
295 | } | 305 | } |
diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h index 973ab1d6e862..90a996d2f005 100644 --- a/include/linux/lockd/lockd.h +++ b/include/linux/lockd/lockd.h | |||
@@ -215,10 +215,11 @@ void nlmclnt_next_cookie(struct nlm_cookie *); | |||
215 | /* | 215 | /* |
216 | * Host cache | 216 | * Host cache |
217 | */ | 217 | */ |
218 | struct nlm_host *nlmclnt_lookup_host(const struct sockaddr_in *sin, | 218 | struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap, |
219 | int proto, u32 version, | 219 | const size_t salen, |
220 | const char *hostname, | 220 | const unsigned short protocol, |
221 | unsigned int hostname_len); | 221 | const u32 version, |
222 | const char *hostname); | ||
222 | struct nlm_host *nlmsvc_lookup_host(struct svc_rqst *, const char *, | 223 | struct nlm_host *nlmsvc_lookup_host(struct svc_rqst *, const char *, |
223 | unsigned int); | 224 | unsigned int); |
224 | struct rpc_clnt * nlm_bind_host(struct nlm_host *); | 225 | struct rpc_clnt * nlm_bind_host(struct nlm_host *); |