diff options
Diffstat (limited to 'fs/lockd/svc.c')
-rw-r--r-- | fs/lockd/svc.c | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c index 64f1c31b5853..abf83881f68a 100644 --- a/fs/lockd/svc.c +++ b/fs/lockd/svc.c | |||
@@ -53,17 +53,6 @@ static struct svc_rqst *nlmsvc_rqst; | |||
53 | unsigned long nlmsvc_timeout; | 53 | unsigned long nlmsvc_timeout; |
54 | 54 | ||
55 | /* | 55 | /* |
56 | * If the kernel has IPv6 support available, always listen for | ||
57 | * both AF_INET and AF_INET6 requests. | ||
58 | */ | ||
59 | #if (defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)) && \ | ||
60 | defined(CONFIG_SUNRPC_REGISTER_V4) | ||
61 | static const sa_family_t nlmsvc_family = AF_INET6; | ||
62 | #else /* (CONFIG_IPV6 || CONFIG_IPV6_MODULE) && CONFIG_SUNRPC_REGISTER_V4 */ | ||
63 | static const sa_family_t nlmsvc_family = AF_INET; | ||
64 | #endif /* (CONFIG_IPV6 || CONFIG_IPV6_MODULE) && CONFIG_SUNRPC_REGISTER_V4 */ | ||
65 | |||
66 | /* | ||
67 | * These can be set at insmod time (useful for NFS as root filesystem), | 56 | * These can be set at insmod time (useful for NFS as root filesystem), |
68 | * and also changed through the sysctl interface. -- Jamie Lokier, Aug 2003 | 57 | * and also changed through the sysctl interface. -- Jamie Lokier, Aug 2003 |
69 | */ | 58 | */ |
@@ -204,19 +193,30 @@ lockd(void *vrqstp) | |||
204 | return 0; | 193 | return 0; |
205 | } | 194 | } |
206 | 195 | ||
207 | static int create_lockd_listener(struct svc_serv *serv, char *name, | 196 | static int create_lockd_listener(struct svc_serv *serv, const char *name, |
208 | unsigned short port) | 197 | const int family, const unsigned short port) |
209 | { | 198 | { |
210 | struct svc_xprt *xprt; | 199 | struct svc_xprt *xprt; |
211 | 200 | ||
212 | xprt = svc_find_xprt(serv, name, 0, 0); | 201 | xprt = svc_find_xprt(serv, name, family, 0); |
213 | if (xprt == NULL) | 202 | if (xprt == NULL) |
214 | return svc_create_xprt(serv, name, port, SVC_SOCK_DEFAULTS); | 203 | return svc_create_xprt(serv, name, family, port, |
215 | 204 | SVC_SOCK_DEFAULTS); | |
216 | svc_xprt_put(xprt); | 205 | svc_xprt_put(xprt); |
217 | return 0; | 206 | return 0; |
218 | } | 207 | } |
219 | 208 | ||
209 | static int create_lockd_family(struct svc_serv *serv, const int family) | ||
210 | { | ||
211 | int err; | ||
212 | |||
213 | err = create_lockd_listener(serv, "udp", family, nlm_udpport); | ||
214 | if (err < 0) | ||
215 | return err; | ||
216 | |||
217 | return create_lockd_listener(serv, "tcp", family, nlm_tcpport); | ||
218 | } | ||
219 | |||
220 | /* | 220 | /* |
221 | * Ensure there are active UDP and TCP listeners for lockd. | 221 | * Ensure there are active UDP and TCP listeners for lockd. |
222 | * | 222 | * |
@@ -232,13 +232,15 @@ static int make_socks(struct svc_serv *serv) | |||
232 | static int warned; | 232 | static int warned; |
233 | int err; | 233 | int err; |
234 | 234 | ||
235 | err = create_lockd_listener(serv, "udp", nlm_udpport); | 235 | err = create_lockd_family(serv, PF_INET); |
236 | if (err < 0) | 236 | if (err < 0) |
237 | goto out_err; | 237 | goto out_err; |
238 | 238 | ||
239 | err = create_lockd_listener(serv, "tcp", nlm_tcpport); | 239 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
240 | if (err < 0) | 240 | err = create_lockd_family(serv, PF_INET6); |
241 | if (err < 0 && err != -EAFNOSUPPORT) | ||
241 | goto out_err; | 242 | goto out_err; |
243 | #endif /* CONFIG_IPV6 || CONFIG_IPV6_MODULE */ | ||
242 | 244 | ||
243 | warned = 0; | 245 | warned = 0; |
244 | return 0; | 246 | return 0; |
@@ -274,7 +276,7 @@ int lockd_up(void) | |||
274 | "lockd_up: no pid, %d users??\n", nlmsvc_users); | 276 | "lockd_up: no pid, %d users??\n", nlmsvc_users); |
275 | 277 | ||
276 | error = -ENOMEM; | 278 | error = -ENOMEM; |
277 | serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, nlmsvc_family, NULL); | 279 | serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, NULL); |
278 | if (!serv) { | 280 | if (!serv) { |
279 | printk(KERN_WARNING "lockd_up: create service failed\n"); | 281 | printk(KERN_WARNING "lockd_up: create service failed\n"); |
280 | goto out; | 282 | goto out; |