]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - utils/statd/statd.c
Tell NFS/lockd client what that local state number is.
[nfs-utils.git] / utils / statd / statd.c
index 22d5deb51ecfb38afbb9650a3ae0149e0726998a..8337b64b993918fb8704daeb49cae711447779d3 100644 (file)
@@ -76,6 +76,7 @@ static struct option longopts[] =
 
 extern void sm_prog_1 (struct svc_req *, register SVCXPRT *);
 extern int statd_get_socket(void);
+static void load_state_number(void);
 
 #ifdef SIMULATIONS
 extern void simulator (int, char **);
@@ -249,7 +250,6 @@ int main (int argc, char **argv)
        int arg;
        int port = 0, out_port = 0;
        struct rlimit rlim;
-       int once = 1;
 
        int pipefds[2] = { -1, -1};
        char status;
@@ -476,25 +476,31 @@ int main (int argc, char **argv)
                        waitpid(pid, NULL, 0);
                }
 
+       /* Make sure we have a privilege port for calling into the kernel */
+       statd_get_socket();
 
-       for (;;) {
-               pmap_unset (SM_PROG, SM_VERS);
+       /* If sm-notify didn't take all the state files, load
+        * state information into our notify-list so we can
+        * pass on any SM_NOTIFY that arrives
+        */
+       load_state();
+       load_state_number();
+       pmap_unset (SM_PROG, SM_VERS);
 
-               /* If we got this far, we have successfully started, so notify parent */
-               if (pipefds[1] > 0) {
-                       status = 0;
-                       write(pipefds[1], &status, 1);
-                       close(pipefds[1]);
-                       pipefds[1] = -1;
-               }
+       /* this registers both UDP and TCP services */
+       rpc_init("statd", SM_PROG, SM_VERS, sm_prog_1, port);
 
-               /* this registers both UDP and TCP services */
-               rpc_init("statd", SM_PROG, SM_VERS, sm_prog_1, port);
+       /* If we got this far, we have successfully started, so notify parent */
+       if (pipefds[1] > 0) {
+               status = 0;
+               write(pipefds[1], &status, 1);
+               close(pipefds[1]);
+               pipefds[1] = -1;
+       }
 
-               if (once) {
-                       once = 0;
-                       drop_privs();
-               }
+       drop_privs();
+
+       for (;;) {
                /*
                 * Handle incoming requests:  SM_NOTIFY socket requests, as
                 * well as callbacks from lockd.
@@ -521,3 +527,23 @@ int main (int argc, char **argv)
        }
        return 0;
 }
+
+static void
+load_state_number(void)
+{
+       int fd;
+
+       if ((fd = open(SM_STAT_PATH, O_RDONLY)) == -1)
+               return;
+
+       read(fd, &MY_STATE, sizeof(MY_STATE));
+       close(fd);
+       fd = open("/proc/sys/fs/nfs/nsm_local_state",O_WRONLY);
+       if (fd >= 0) {
+               char buf[20];
+               snprintf(buf, sizeof(buf), "%d", MY_STATE);
+               write(fd, buf, strlen(buf));
+               close(fd);
+       }
+
+}