statduser=nobody
        fi)
        AC_SUBST(statduser)
+AC_ARG_WITH(start-statd,
+       [AC_HELP_STRING([--with-start-statd=scriptname],
+                       [When an nfs filesystems is mounted with locking, run this script]
+       )],
+       startstatd=$withval,
+       startstatd=/usr/sbin/start-statd
+       )
+       AC_SUBST(startstatd)
+       AC_DEFINE_UNQUOTED(START_STATD, "$startstatd", [Define this to a script which can start statd on mount])
 AC_ARG_ENABLE(nfsv3,
        [AC_HELP_STRING([--enable-nfsv3],
                         [enable support for NFSv3 @<:@default=yes@:>@])],
 
        }
 }
 
+static void start_statd()
+{
+       /* If /var/run/rpc.statd.pid exists and is non-empty,
+        * assume statd already running.
+        * If START_STATD not defined, or defined to a non-existent file,
+        * don't bother,
+        * else run that file (typically a shell script)
+        */
+       struct stat stb;
+       if (stat("/var/run/rpc.statd.pid", &stb) == 0 &&
+           stb.st_size > 0)
+               return;
+#ifdef START_STATD
+       if (stat(START_STATD, &stb) ==0 &&
+           S_ISREG(stb.st_mode) &&
+           (stb.st_mode & S_IXUSR))
+               system(START_STATD);
+#endif
+}
+
 int main(int argc, char *argv[])
 {
        int c, flags = 0, nfs_mount_vers = 0, mnt_err = 1, fake = 0;
                nfs_mount_vers = 4;
                mnt_err = nfs4mount(spec, mount_point, &flags, &extra_opts, &mount_opts, 0);
        }
-       else {
-               if (!strcmp(progname, "mount.nfs")) {
-                       mnt_err = nfsmount(spec, mount_point, &flags,
-                                       &extra_opts, &mount_opts, &nfs_mount_vers, 0);
-               }
+       else if (!strcmp(progname, "mount.nfs")) {
+               int need_statd = 0;
+               mnt_err = nfsmount(spec, mount_point, &flags,
+                                  &extra_opts, &mount_opts, &nfs_mount_vers,
+                                  0, &need_statd);
+               if (!mnt_err && !fake && need_statd)
+                       start_statd();
        }
 
        if (!mnt_err && !fake) {
 
 #define AUTH_GSS_SPKMP         390011
 #endif
 
-int nfsmount(const char *, const char *, int *, char **, char **, int *, int);
+int nfsmount(const char *, const char *, int *, char **, char **, int *,
+            int, int *);
 void mount_errors(char *, int, int);
 
 #endif /* _NFS_MOUNT_H */
 
 int
 nfsmount(const char *spec, const char *node, int *flags,
         char **extra_opts, char **mount_opts, int *nfs_mount_vers,
-        int running_bg)
+        int running_bg, int *need_statd)
 {
        static char *prev_bg_host;
        char hostdir[1024];
        strcat(new_opts, cbuf);
 
        *extra_opts = xstrdup(new_opts);
+       *need_statd = ! (data.flags & NFS_MOUNT_NONLM);
        return 0;
 
        /* abort */