diff options
Diffstat (limited to 'fs/lockd/clntlock.c')
-rw-r--r-- | fs/lockd/clntlock.c | 23 |
1 files changed, 16 insertions, 7 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 | } |