summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorRalph Boehme <slow@samba.org>2016-04-19 12:55:19 +0200
committerVolker Lendecke <vl@samba.org>2016-04-19 20:35:33 +0200
commit052b8555510bf1f72c7ea777c44294264bbb67d4 (patch)
tree2d8af282ff79a6fee6f5401fb1e198a1b472873b /source3
parent34482eb7cc3d74c8de510309332e8ab176d0f3c0 (diff)
downloadsamba-052b8555510bf1f72c7ea777c44294264bbb67d4.tar.gz
cleanupd: restart as needed
Bug: https://bugzilla.samba.org/show_bug.cgi?id=11855 Signed-off-by: Ralph Boehme <slow@samba.org> Reviewed-by: Volker Lendecke <vl@samba.org> Autobuild-User(master): Volker Lendecke <vl@samba.org> Autobuild-Date(master): Tue Apr 19 20:35:33 CEST 2016 on sn-devel-144
Diffstat (limited to 'source3')
-rw-r--r--source3/smbd/server.c35
1 files changed, 25 insertions, 10 deletions
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 7e5b5d90dd8..82e686e94c8 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -468,6 +468,10 @@ static bool cleanupd_init(struct messaging_context *msg, bool interactive,
DBG_DEBUG("Started cleanupd pid=%d\n", (int)pid);
+ if (am_parent != NULL) {
+ add_child_pid(am_parent, pid);
+ }
+
*ppid = pid_to_procid(pid);
return true;
}
@@ -557,16 +561,6 @@ static void remove_child_pid(struct smbd_parent_context *parent,
struct iovec iov[2];
NTSTATUS status;
- iov[0] = (struct iovec) { .iov_base = (uint8_t *)&pid,
- .iov_len = sizeof(pid) };
- iov[1] = (struct iovec) { .iov_base = (uint8_t *)&unclean_shutdown,
- .iov_len = sizeof(bool) };
-
- status = messaging_send_iov(parent->msg_ctx, parent->cleanupd,
- MSG_SMB_NOTIFY_CLEANUP,
- iov, ARRAY_SIZE(iov), NULL, 0);
- DEBUG(10, ("messaging_send_iov returned %s\n", nt_errstr(status)));
-
for (child = parent->children; child != NULL; child = child->next) {
if (child->pid == pid) {
struct smbd_child_pid *tmp = child;
@@ -583,6 +577,27 @@ static void remove_child_pid(struct smbd_parent_context *parent,
return;
}
+ if (child->pid == procid_to_pid(&parent->cleanupd)) {
+ bool ok;
+
+ DBG_WARNING("Restarting cleanupd\n");
+ ok = cleanupd_init(parent->msg_ctx, false, &parent->cleanupd);
+ if (!ok) {
+ DBG_ERR("Failed to restart cleanupd\n");
+ }
+ return;
+ }
+
+ iov[0] = (struct iovec) { .iov_base = (uint8_t *)&pid,
+ .iov_len = sizeof(pid) };
+ iov[1] = (struct iovec) { .iov_base = (uint8_t *)&unclean_shutdown,
+ .iov_len = sizeof(bool) };
+
+ status = messaging_send_iov(parent->msg_ctx, parent->cleanupd,
+ MSG_SMB_NOTIFY_CLEANUP,
+ iov, ARRAY_SIZE(iov), NULL, 0);
+ DEBUG(10, ("messaging_send_iov returned %s\n", nt_errstr(status)));
+
if (unclean_shutdown) {
/* a child terminated uncleanly so tickle all
processes to see if they can grab any of the