summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/unfs3/unfs3/fix_pid_race_parent_writes_child_pid.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/unfs3/unfs3/fix_pid_race_parent_writes_child_pid.patch')
-rw-r--r--meta/recipes-devtools/unfs3/unfs3/fix_pid_race_parent_writes_child_pid.patch61
1 files changed, 61 insertions, 0 deletions
diff --git a/meta/recipes-devtools/unfs3/unfs3/fix_pid_race_parent_writes_child_pid.patch b/meta/recipes-devtools/unfs3/unfs3/fix_pid_race_parent_writes_child_pid.patch
new file mode 100644
index 0000000000..76d7555ea9
--- /dev/null
+++ b/meta/recipes-devtools/unfs3/unfs3/fix_pid_race_parent_writes_child_pid.patch
@@ -0,0 +1,61 @@
1daemon.c: Fix race window for writing of the pid file
2
3The parent process should write the pid file such that the pid file
4will can be checked immediately following exit of the fork from the
5parent.
6
7This allows external monitoring applications to watch the daemon
8without having to add sleep calls to wait for the pid file be written
9on a busy system.
10
11Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
12
13Upstream-Status: Pending
14
15---
16 daemon.c | 12 +++++++++---
17 1 file changed, 9 insertions(+), 3 deletions(-)
18
19--- a/daemon.c
20+++ b/daemon.c
21@@ -153,7 +153,7 @@ int get_socket_type(struct svc_req *rqst
22 /*
23 * write current pid to a file
24 */
25-static void create_pid_file(void)
26+static void create_pid_file(int pid)
27 {
28 char buf[16];
29 int fd, res, len;
30@@ -175,7 +175,7 @@ static void create_pid_file(void)
31 }
32 #endif
33
34- sprintf(buf, "%i\n", backend_getpid());
35+ sprintf(buf, "%i\n", pid);
36 len = strlen(buf);
37
38 res = backend_pwrite(fd, buf, len, 0);
39@@ -970,6 +970,10 @@ int main(int argc, char **argv)
40 fprintf(stderr, "could not fork into background\n");
41 daemon_exit(0);
42 }
43+ if (pid)
44+ create_pid_file(pid);
45+ } else {
46+ create_pid_file(backend_getpid());
47 }
48 #endif /* WIN32 */
49
50@@ -1006,8 +1010,10 @@ int main(int argc, char **argv)
51 /* no umask to not screw up create modes */
52 umask(0);
53
54+#ifdef WIN32
55 /* create pid file if wanted */
56- create_pid_file();
57+ create_pid_file(backend_getpid());
58+#endif
59
60 /* initialize internal stuff */
61 fh_cache_init();