diff options
author | Christian Ambach <christian.ambach@de.ibm.com> | 2011-01-13 16:04:36 +0100 |
---|---|---|
committer | Volker Lendecke <vlendec@samba.org> | 2011-01-14 09:57:18 +0100 |
commit | 70b4c08c813af5d45e3b4af0503f851f52744381 (patch) | |
tree | 53575677863bbb631836b94a8ac915fc10d3f239 /source3 | |
parent | fa07208cee41b51d68144e2fe14d274fdb8f4873 (diff) | |
download | samba-70b4c08c813af5d45e3b4af0503f851f52744381.tar.gz samba-70b4c08c813af5d45e3b4af0503f851f52744381.tar.bz2 samba-70b4c08c813af5d45e3b4af0503f851f52744381.zip |
s3:vfs aio_fork children do not go away
on RHEL 5.5, recvmsg() does not return when it is reading
from the socket and the process on the other side closes
its connection. This left aio children around that should
have gone already and were just wasting system resources.
This patch makes the child go away by writing invalid
data to it so that the child exits.
Pair-Programmed-With: Volker Lendecke <vl@samba.org>
Autobuild-User: Volker Lendecke <vlendec@samba.org>
Autobuild-Date: Fri Jan 14 09:57:18 CET 2011 on sn-devel-104
Diffstat (limited to 'source3')
-rw-r--r-- | source3/modules/vfs_aio_fork.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/source3/modules/vfs_aio_fork.c b/source3/modules/vfs_aio_fork.c index fc5b7f1941..0d515130ee 100644 --- a/source3/modules/vfs_aio_fork.c +++ b/source3/modules/vfs_aio_fork.c @@ -422,7 +422,18 @@ static void handle_aio_completion(struct event_context *event_ctx, static int aio_child_destructor(struct aio_child *child) { + char c=0; + SMB_ASSERT((child->aiocb == NULL) || child->cancelled); + + DEBUG(10, ("aio_child_destructor: removing child %d on fd %d\n", + child->pid, child->sockfd)); + + /* + * closing the sockfd makes the child not return from recvmsg() on RHEL + * 5.5 so instead force the child to exit by writing bad data to it + */ + write(child->sockfd, &c, sizeof(c)); close(child->sockfd); DLIST_REMOVE(child->list->children, child); return 0; @@ -486,7 +497,8 @@ static NTSTATUS create_aio_child(struct smbd_server_connection *sconn, aio_child_loop(result->sockfd, result->map); } - DEBUG(10, ("Child %d created\n", result->pid)); + DEBUG(10, ("Child %d created with sockfd %d\n", + result->pid, fdpair[0])); result->sockfd = fdpair[0]; close(fdpair[1]); |