lockd: convert reclaimer thread to kthread interface
[linux-2.6.git] / fs / lockd / clntlock.c
index 2976bf0..94d42cc 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/sunrpc/svc.h>
 #include <linux/lockd/lockd.h>
 #include <linux/smp_lock.h>
+#include <linux/kthread.h>
 
 #define NLMDBG_FACILITY                NLMDBG_CLIENT
 
@@ -54,7 +55,7 @@ struct nlm_host *nlmclnt_init(const struct nlmclnt_initdata *nlm_init)
        u32 nlm_version = (nlm_init->nfs_version == 2) ? 1 : 4;
        int status;
 
-       status = lockd_up(nlm_init->protocol);
+       status = lockd_up();
        if (status < 0)
                return ERR_PTR(status);
 
@@ -191,11 +192,15 @@ __be32 nlmclnt_grant(const struct sockaddr *addr, const struct nlm_lock *lock)
 void
 nlmclnt_recovery(struct nlm_host *host)
 {
+       struct task_struct *task;
+
        if (!host->h_reclaiming++) {
                nlm_get_host(host);
-               __module_get(THIS_MODULE);
-               if (kernel_thread(reclaimer, host, CLONE_FS | CLONE_FILES) < 0)
-                       module_put(THIS_MODULE);
+               task = kthread_run(reclaimer, host, "%s-reclaim", host->h_name);
+               if (IS_ERR(task))
+                       printk(KERN_ERR "lockd: unable to spawn reclaimer "
+                               "thread. Locks for %s won't be reclaimed! "
+                               "(%ld)\n", host->h_name, PTR_ERR(task));
        }
 }
 
@@ -207,7 +212,6 @@ reclaimer(void *ptr)
        struct file_lock *fl, *next;
        u32 nsmstate;
 
-       daemonize("%s-reclaim", host->h_name);
        allow_signal(SIGKILL);
 
        down_write(&host->h_rwsem);
@@ -215,7 +219,7 @@ reclaimer(void *ptr)
        /* This one ensures that our parent doesn't terminate while the
         * reclaim is in progress */
        lock_kernel();
-       lockd_up(0); /* note: this cannot fail as lockd is already running */
+       lockd_up();     /* note: this cannot fail as lockd is already running */
 
        dprintk("lockd: reclaiming locks for host %s\n", host->h_name);
 
@@ -233,7 +237,12 @@ restart:
        list_for_each_entry_safe(fl, next, &host->h_reclaim, fl_u.nfs_fl.list) {
                list_del_init(&fl->fl_u.nfs_fl.list);
 
-               /* Why are we leaking memory here? --okir */
+               /*
+                * sending this thread a SIGKILL will result in any unreclaimed
+                * locks being removed from the h_granted list. This means that
+                * the kernel will not attempt to reclaim them again if a new
+                * reclaimer thread is spawned for this host.
+                */
                if (signalled())
                        continue;
                if (nlmclnt_reclaim(host, fl) != 0)
@@ -261,5 +270,5 @@ restart:
        nlm_release_host(host);
        lockd_down();
        unlock_kernel();
-       module_put_and_exit(0);
+       return 0;
 }