diff options
Diffstat (limited to 'fs/lockd')
-rw-r--r-- | fs/lockd/clntlock.c | 23 | ||||
-rw-r--r-- | fs/lockd/host.c | 10 | ||||
-rw-r--r-- | fs/lockd/svc.c | 6 |
3 files changed, 28 insertions, 11 deletions
diff --git a/fs/lockd/clntlock.c b/fs/lockd/clntlock.c index 8307dd64bf46..1f3b0fc0d351 100644 --- a/fs/lockd/clntlock.c +++ b/fs/lockd/clntlock.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/sunrpc/svc.h> | 14 | #include <linux/sunrpc/svc.h> |
15 | #include <linux/lockd/lockd.h> | 15 | #include <linux/lockd/lockd.h> |
16 | #include <linux/smp_lock.h> | 16 | #include <linux/smp_lock.h> |
17 | #include <linux/kthread.h> | ||
17 | 18 | ||
18 | #define NLMDBG_FACILITY NLMDBG_CLIENT | 19 | #define NLMDBG_FACILITY NLMDBG_CLIENT |
19 | 20 | ||
@@ -60,7 +61,7 @@ struct nlm_host *nlmclnt_init(const struct nlmclnt_initdata *nlm_init) | |||
60 | 61 | ||
61 | host = nlmclnt_lookup_host(nlm_init->address, nlm_init->addrlen, | 62 | host = nlmclnt_lookup_host(nlm_init->address, nlm_init->addrlen, |
62 | nlm_init->protocol, nlm_version, | 63 | nlm_init->protocol, nlm_version, |
63 | nlm_init->hostname); | 64 | nlm_init->hostname, nlm_init->noresvport); |
64 | if (host == NULL) { | 65 | if (host == NULL) { |
65 | lockd_down(); | 66 | lockd_down(); |
66 | return ERR_PTR(-ENOLCK); | 67 | return ERR_PTR(-ENOLCK); |
@@ -191,11 +192,15 @@ __be32 nlmclnt_grant(const struct sockaddr *addr, const struct nlm_lock *lock) | |||
191 | void | 192 | void |
192 | nlmclnt_recovery(struct nlm_host *host) | 193 | nlmclnt_recovery(struct nlm_host *host) |
193 | { | 194 | { |
195 | struct task_struct *task; | ||
196 | |||
194 | if (!host->h_reclaiming++) { | 197 | if (!host->h_reclaiming++) { |
195 | nlm_get_host(host); | 198 | nlm_get_host(host); |
196 | __module_get(THIS_MODULE); | 199 | task = kthread_run(reclaimer, host, "%s-reclaim", host->h_name); |
197 | if (kernel_thread(reclaimer, host, CLONE_FS | CLONE_FILES) < 0) | 200 | if (IS_ERR(task)) |
198 | module_put(THIS_MODULE); | 201 | printk(KERN_ERR "lockd: unable to spawn reclaimer " |
202 | "thread. Locks for %s won't be reclaimed! " | ||
203 | "(%ld)\n", host->h_name, PTR_ERR(task)); | ||
199 | } | 204 | } |
200 | } | 205 | } |
201 | 206 | ||
@@ -207,7 +212,6 @@ reclaimer(void *ptr) | |||
207 | struct file_lock *fl, *next; | 212 | struct file_lock *fl, *next; |
208 | u32 nsmstate; | 213 | u32 nsmstate; |
209 | 214 | ||
210 | daemonize("%s-reclaim", host->h_name); | ||
211 | allow_signal(SIGKILL); | 215 | allow_signal(SIGKILL); |
212 | 216 | ||
213 | down_write(&host->h_rwsem); | 217 | down_write(&host->h_rwsem); |
@@ -233,7 +237,12 @@ restart: | |||
233 | list_for_each_entry_safe(fl, next, &host->h_reclaim, fl_u.nfs_fl.list) { | 237 | list_for_each_entry_safe(fl, next, &host->h_reclaim, fl_u.nfs_fl.list) { |
234 | list_del_init(&fl->fl_u.nfs_fl.list); | 238 | list_del_init(&fl->fl_u.nfs_fl.list); |
235 | 239 | ||
236 | /* Why are we leaking memory here? --okir */ | 240 | /* |
241 | * sending this thread a SIGKILL will result in any unreclaimed | ||
242 | * locks being removed from the h_granted list. This means that | ||
243 | * the kernel will not attempt to reclaim them again if a new | ||
244 | * reclaimer thread is spawned for this host. | ||
245 | */ | ||
237 | if (signalled()) | 246 | if (signalled()) |
238 | continue; | 247 | continue; |
239 | if (nlmclnt_reclaim(host, fl) != 0) | 248 | if (nlmclnt_reclaim(host, fl) != 0) |
@@ -261,5 +270,5 @@ restart: | |||
261 | nlm_release_host(host); | 270 | nlm_release_host(host); |
262 | lockd_down(); | 271 | lockd_down(); |
263 | unlock_kernel(); | 272 | unlock_kernel(); |
264 | module_put_and_exit(0); | 273 | return 0; |
265 | } | 274 | } |
diff --git a/fs/lockd/host.c b/fs/lockd/host.c index e05d04416037..abdebf76b820 100644 --- a/fs/lockd/host.c +++ b/fs/lockd/host.c | |||
@@ -48,6 +48,7 @@ struct nlm_lookup_host_info { | |||
48 | const size_t hostname_len; /* it's length */ | 48 | const size_t hostname_len; /* it's length */ |
49 | const struct sockaddr *src_sap; /* our address (optional) */ | 49 | const struct sockaddr *src_sap; /* our address (optional) */ |
50 | const size_t src_len; /* it's length */ | 50 | const size_t src_len; /* it's length */ |
51 | const int noresvport; /* use non-priv port */ | ||
51 | }; | 52 | }; |
52 | 53 | ||
53 | /* | 54 | /* |
@@ -222,6 +223,7 @@ static struct nlm_host *nlm_lookup_host(struct nlm_lookup_host_info *ni) | |||
222 | host->h_nsmstate = 0; /* real NSM state */ | 223 | host->h_nsmstate = 0; /* real NSM state */ |
223 | host->h_nsmhandle = nsm; | 224 | host->h_nsmhandle = nsm; |
224 | host->h_server = ni->server; | 225 | host->h_server = ni->server; |
226 | host->h_noresvport = ni->noresvport; | ||
225 | hlist_add_head(&host->h_hash, chain); | 227 | hlist_add_head(&host->h_hash, chain); |
226 | INIT_LIST_HEAD(&host->h_lockowners); | 228 | INIT_LIST_HEAD(&host->h_lockowners); |
227 | spin_lock_init(&host->h_lock); | 229 | spin_lock_init(&host->h_lock); |
@@ -272,6 +274,7 @@ nlm_destroy_host(struct nlm_host *host) | |||
272 | * @protocol: transport protocol to use | 274 | * @protocol: transport protocol to use |
273 | * @version: NLM protocol version | 275 | * @version: NLM protocol version |
274 | * @hostname: '\0'-terminated hostname of server | 276 | * @hostname: '\0'-terminated hostname of server |
277 | * @noresvport: 1 if non-privileged port should be used | ||
275 | * | 278 | * |
276 | * Returns an nlm_host structure that matches the passed-in | 279 | * Returns an nlm_host structure that matches the passed-in |
277 | * [server address, transport protocol, NLM version, server hostname]. | 280 | * [server address, transport protocol, NLM version, server hostname]. |
@@ -281,7 +284,9 @@ nlm_destroy_host(struct nlm_host *host) | |||
281 | struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap, | 284 | struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap, |
282 | const size_t salen, | 285 | const size_t salen, |
283 | const unsigned short protocol, | 286 | const unsigned short protocol, |
284 | const u32 version, const char *hostname) | 287 | const u32 version, |
288 | const char *hostname, | ||
289 | int noresvport) | ||
285 | { | 290 | { |
286 | const struct sockaddr source = { | 291 | const struct sockaddr source = { |
287 | .sa_family = AF_UNSPEC, | 292 | .sa_family = AF_UNSPEC, |
@@ -296,6 +301,7 @@ struct nlm_host *nlmclnt_lookup_host(const struct sockaddr *sap, | |||
296 | .hostname_len = strlen(hostname), | 301 | .hostname_len = strlen(hostname), |
297 | .src_sap = &source, | 302 | .src_sap = &source, |
298 | .src_len = sizeof(source), | 303 | .src_len = sizeof(source), |
304 | .noresvport = noresvport, | ||
299 | }; | 305 | }; |
300 | 306 | ||
301 | dprintk("lockd: %s(host='%s', vers=%u, proto=%s)\n", __func__, | 307 | dprintk("lockd: %s(host='%s', vers=%u, proto=%s)\n", __func__, |
@@ -417,6 +423,8 @@ nlm_bind_host(struct nlm_host *host) | |||
417 | */ | 423 | */ |
418 | if (!host->h_server) | 424 | if (!host->h_server) |
419 | args.flags |= RPC_CLNT_CREATE_HARDRTRY; | 425 | args.flags |= RPC_CLNT_CREATE_HARDRTRY; |
426 | if (host->h_noresvport) | ||
427 | args.flags |= RPC_CLNT_CREATE_NONPRIVPORT; | ||
420 | 428 | ||
421 | clnt = rpc_create(&args); | 429 | clnt = rpc_create(&args); |
422 | if (!IS_ERR(clnt)) | 430 | if (!IS_ERR(clnt)) |
diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c index 56b076736b56..252d80163d02 100644 --- a/fs/lockd/svc.c +++ b/fs/lockd/svc.c | |||
@@ -45,7 +45,7 @@ | |||
45 | static struct svc_program nlmsvc_program; | 45 | static struct svc_program nlmsvc_program; |
46 | 46 | ||
47 | struct nlmsvc_binding * nlmsvc_ops; | 47 | struct nlmsvc_binding * nlmsvc_ops; |
48 | EXPORT_SYMBOL(nlmsvc_ops); | 48 | EXPORT_SYMBOL_GPL(nlmsvc_ops); |
49 | 49 | ||
50 | static DEFINE_MUTEX(nlmsvc_mutex); | 50 | static DEFINE_MUTEX(nlmsvc_mutex); |
51 | static unsigned int nlmsvc_users; | 51 | static unsigned int nlmsvc_users; |
@@ -300,7 +300,7 @@ out: | |||
300 | mutex_unlock(&nlmsvc_mutex); | 300 | mutex_unlock(&nlmsvc_mutex); |
301 | return error; | 301 | return error; |
302 | } | 302 | } |
303 | EXPORT_SYMBOL(lockd_up); | 303 | EXPORT_SYMBOL_GPL(lockd_up); |
304 | 304 | ||
305 | /* | 305 | /* |
306 | * Decrement the user count and bring down lockd if we're the last. | 306 | * Decrement the user count and bring down lockd if we're the last. |
@@ -329,7 +329,7 @@ lockd_down(void) | |||
329 | out: | 329 | out: |
330 | mutex_unlock(&nlmsvc_mutex); | 330 | mutex_unlock(&nlmsvc_mutex); |
331 | } | 331 | } |
332 | EXPORT_SYMBOL(lockd_down); | 332 | EXPORT_SYMBOL_GPL(lockd_down); |
333 | 333 | ||
334 | #ifdef CONFIG_SYSCTL | 334 | #ifdef CONFIG_SYSCTL |
335 | 335 | ||