summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorнаб <[email protected]>2021-05-17 18:03:26 +0200
committerTony Hutter <[email protected]>2022-02-03 15:28:01 -0800
commita1a52a356ba7c41c7318a893e0aafd9faacca939 (patch)
treefbf1662657130026eae081b2ab32fc877b40f072 /lib
parent9ec630ff2cd7563409b804455cc843815d00ae94 (diff)
freebsd/libshare: nfs: don't send SIGHUP to all processes
pidfile_open() sets *pidptr to -1 if the process currently holding the lock is between pidfile_open() and pidfile_write(), the subsequent kill(mountdpid) would potentially SIGHUP all non-system processes except init: just sleep for half a millisecond and try again in that case Reviewed-by: Don Brady <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: John Kennedy <[email protected]> Signed-off-by: Ahelenia Ziemiańska <[email protected]> Closes #12067
Diffstat (limited to 'lib')
-rw-r--r--lib/libshare/os/freebsd/nfs.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/lib/libshare/os/freebsd/nfs.c b/lib/libshare/os/freebsd/nfs.c
index 56df3e666..97092bdc0 100644
--- a/lib/libshare/os/freebsd/nfs.c
+++ b/lib/libshare/os/freebsd/nfs.c
@@ -423,9 +423,10 @@ nfs_commit_shares(void)
struct pidfh *pfh;
pid_t mountdpid;
+start:
pfh = pidfile_open(_PATH_MOUNTDPID, 0600, &mountdpid);
if (pfh != NULL) {
- /* Mountd is not running. */
+ /* mountd(8) is not running. */
pidfile_remove(pfh);
return (SA_OK);
}
@@ -433,6 +434,11 @@ nfs_commit_shares(void)
/* Cannot open pidfile for some reason. */
return (SA_SYSTEM_ERR);
}
+ if (mountdpid == -1) {
+ /* mountd(8) exists, but didn't write the PID yet */
+ usleep(500);
+ goto start;
+ }
/* We have mountd(8) PID in mountdpid variable. */
kill(mountdpid, SIGHUP);
return (SA_OK);