/* This one ensures that our parent doesn't terminate while the
         * reclaim is in progress */
        lock_kernel();
-       lockd_up(0);
+       lockd_up(0); /* note: this cannot fail as lockd is already running */
 
        nlmclnt_prepare_reclaim(host);
        /* First, reclaim all locks that have been marked. */
 
        int                     error = 0;
 
        mutex_lock(&nlmsvc_mutex);
-       /*
-        * Unconditionally increment the user count ... this is
-        * the number of clients who _want_ a lockd process.
-        */
-       nlmsvc_users++; 
        /*
         * Check whether we're already up and running.
         */
        if (nlmsvc_pid) {
-               error = make_socks(nlmsvc_serv, proto);
+               if (proto)
+                       error = make_socks(nlmsvc_serv, proto);
                goto out;
        }
 
         * Sanity check: if there's no pid,
         * we should be the first user ...
         */
-       if (nlmsvc_users > 1)
+       if (nlmsvc_users)
                printk(KERN_WARNING
                        "lockd_up: no pid, %d users??\n", nlmsvc_users);
 
 destroy_and_out:
        svc_destroy(serv);
 out:
+       if (!error)
+               nlmsvc_users++;
        mutex_unlock(&nlmsvc_mutex);
        return error;
 }
 
        if (!list_empty(&nfsd_serv->sv_permsocks))
                return 0;
 
-       error = svc_makesock(nfsd_serv, IPPROTO_UDP, port);
-       if (error < 0)
-               return error;
        error = lockd_up(IPPROTO_UDP);
+       if (error >= 0) {
+               error = svc_makesock(nfsd_serv, IPPROTO_UDP, port);
+               if (error < 0)
+                       lockd_down();
+       }
        if (error < 0)
                return error;
 
 #ifdef CONFIG_NFSD_TCP
-       error = svc_makesock(nfsd_serv, IPPROTO_TCP, port);
-       if (error < 0)
-               return error;
        error = lockd_up(IPPROTO_TCP);
+       if (error >= 0) {
+               error = svc_makesock(nfsd_serv, IPPROTO_TCP, port);
+               if (error < 0)
+                       lockd_down();
+       }
        if (error < 0)
                return error;
 #endif