summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorDan McDonald <danmcd@omniti.com>2014-07-23 19:50:51 -0400
committerDan McDonald <danmcd@omniti.com>2014-07-24 15:04:32 -0400
commitd690b62cf13675007342e6bb43d4816ec57a46dd (patch)
treeb8de1378e53b6575d3c78b38cbb7c7696701c56b /usr/src
parentceec9e142e4fe8e2388e7bd73fa65809ab1b0715 (diff)
downloadillumos-joyent-d690b62cf13675007342e6bb43d4816ec57a46dd.tar.gz
5026 intra-node/inter-zone networking doesn't always deliver SIGPOLL
Reviewed by: Saso Kiselkov <skiselkov.ml@gmail.com> Reviewed by: Gordon Ross <gordon.ross@nexenta.com> Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com> Reviewed by: Robert Mustacchi <rm@joyent.com> Approved by: Garrett D'Amore <garrett@damore.org>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/fs/sockfs/sockcommon_subr.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/usr/src/uts/common/fs/sockfs/sockcommon_subr.c b/usr/src/uts/common/fs/sockfs/sockcommon_subr.c
index 00ab44e44c..957c8f93b4 100644
--- a/usr/src/uts/common/fs/sockfs/sockcommon_subr.c
+++ b/usr/src/uts/common/fs/sockfs/sockcommon_subr.c
@@ -22,6 +22,9 @@
/*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
*/
+/*
+ * Copyright 2014, OmniTI Computer Consulting, Inc. All rights reserved.
+ */
#include <sys/types.h>
#include <sys/param.h>
@@ -396,7 +399,12 @@ socket_sendsig(struct sonode *so, int event)
* the proc is active.
*/
mutex_enter(&pidlock);
- proc = prfind(so->so_pgrp);
+ /*
+ * Even if the thread started in another zone, we're receiving
+ * on behalf of this socket's zone, so find the proc using the
+ * socket's zone ID.
+ */
+ proc = prfind_zone(so->so_pgrp, so->so_zoneid);
if (proc == NULL) {
mutex_exit(&pidlock);
return;
@@ -413,7 +421,12 @@ socket_sendsig(struct sonode *so, int event)
pid_t pgrp = -so->so_pgrp;
mutex_enter(&pidlock);
- proc = pgfind(pgrp);
+ /*
+ * Even if the thread started in another zone, we're receiving
+ * on behalf of this socket's zone, so find the pgrp using the
+ * socket's zone ID.
+ */
+ proc = pgfind_zone(pgrp, so->so_zoneid);
while (proc != NULL) {
mutex_enter(&proc->p_lock);
socket_sigproc(proc, event);