If statd is not running (/var/run/rpc.statd.pid) when an nfs filesystem
is mounted (v2 or v3, with remote locking enabled), and if
/usr/sbin/start-statd (or other program specified at config time) is
present, then run that program to start statd.
This means that statd does not need to be running "just in case".
It only needs to be started at boot time if the nfs server is
started.
statduser=nobody
fi)
AC_SUBST(statduser)
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@:>@])],
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;
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);
}
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) {
}
if (!mnt_err && !fake) {
#define AUTH_GSS_SPKMP 390011
#endif
#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 */
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
nfsmount(const char *spec, const char *node, int *flags,
char **extra_opts, char **mount_opts, int *nfs_mount_vers,
+ int running_bg, int *need_statd)
{
static char *prev_bg_host;
char hostdir[1024];
{
static char *prev_bg_host;
char hostdir[1024];
strcat(new_opts, cbuf);
*extra_opts = xstrdup(new_opts);
strcat(new_opts, cbuf);
*extra_opts = xstrdup(new_opts);
+ *need_statd = ! (data.flags & NFS_MOUNT_NONLM);