lockd: Do not start the lockd thread before we've set nlmsvc_rqst->rq_task
authorTrond Myklebust <trond.myklebust@primarydata.com>
Tue, 2 Sep 2014 17:58:57 +0000 (13:58 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 2 Sep 2014 21:49:17 +0000 (17:49 -0400)
This fixes an Oopsable race when starting lockd.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Reviewed-by: Jeff Layton <jlayton@primarydata.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/lockd/svc.c

index b416b3355807de0e5217e33cbcc31bc149d28de0..09857b48d0c306b385cba6394b200a7c35c43f19 100644 (file)
@@ -306,7 +306,7 @@ static int lockd_start_svc(struct svc_serv *serv)
        svc_sock_update_bufs(serv);
        serv->sv_maxconn = nlm_max_connections;
 
-       nlmsvc_task = kthread_run(lockd, nlmsvc_rqst, "%s", serv->sv_name);
+       nlmsvc_task = kthread_create(lockd, nlmsvc_rqst, "%s", serv->sv_name);
        if (IS_ERR(nlmsvc_task)) {
                error = PTR_ERR(nlmsvc_task);
                printk(KERN_WARNING
@@ -314,6 +314,7 @@ static int lockd_start_svc(struct svc_serv *serv)
                goto out_task;
        }
        nlmsvc_rqst->rq_task = nlmsvc_task;
+       wake_up_process(nlmsvc_task);
 
        dprintk("lockd_up: service started\n");
        return 0;