summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/os/streamio.c
diff options
context:
space:
mode:
authorPatrick Mooney <patrick.f.mooney@gmail.com>2015-10-05 17:20:33 -0700
committerRobert Mustacchi <rm@joyent.com>2015-10-16 11:59:15 -0700
commitf3bb54f387fc03cf651e19bbee54cc88ee51bb29 (patch)
tree8170dfa755df0cb62c9d35e5ad01ef8219404150 /usr/src/uts/common/os/streamio.c
parenta5eb7107f06a6e23e8e77e8d3a84c1ff90a73ac6 (diff)
downloadillumos-gate-f3bb54f387fc03cf651e19bbee54cc88ee51bb29.tar.gz
6291 nested epoll does not mimic Linux behavior
Reviewed by: Bryan Cantrill <bryan@joyent.com> Approved by: Richard Lowe <richlowe@richlowe.net>
Diffstat (limited to 'usr/src/uts/common/os/streamio.c')
-rw-r--r--usr/src/uts/common/os/streamio.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/usr/src/uts/common/os/streamio.c b/usr/src/uts/common/os/streamio.c
index 18a5ded1c6..62f94729cf 100644
--- a/usr/src/uts/common/os/streamio.c
+++ b/usr/src/uts/common/os/streamio.c
@@ -8218,7 +8218,11 @@ strpoll(
tq = qp->q_next->q_nfsrv;
ASSERT(tq != NULL);
- polllock(&stp->sd_pollist, QLOCK(tq));
+ if (polllock(&stp->sd_pollist, QLOCK(tq)) != 0) {
+ releasestr(qp);
+ *reventsp = POLLNVAL;
+ return (0);
+ }
if (events & POLLWRNORM) {
queue_t *sqp;
@@ -8228,7 +8232,12 @@ strpoll(
else if ((sqp = stp->sd_struiowrq) != NULL) {
/* Check sync stream barrier write q */
mutex_exit(QLOCK(tq));
- polllock(&stp->sd_pollist, QLOCK(sqp));
+ if (polllock(&stp->sd_pollist,
+ QLOCK(sqp)) != 0) {
+ releasestr(qp);
+ *reventsp = POLLNVAL;
+ return (0);
+ }
if (sqp->q_flag & QFULL)
/* ensure pollwakeup() is done */
sqp->q_flag |= QWANTWSYNC;
@@ -8241,7 +8250,12 @@ strpoll(
goto chkrd;
}
mutex_exit(QLOCK(sqp));
- polllock(&stp->sd_pollist, QLOCK(tq));
+ if (polllock(&stp->sd_pollist,
+ QLOCK(tq)) != 0) {
+ releasestr(qp);
+ *reventsp = POLLNVAL;
+ return (0);
+ }
} else
retevents |= POLLOUT;
}
@@ -8273,7 +8287,10 @@ chkrd:
* Note: Need to do polllock() here since ps_lock may be
* held. See bug 4191544.
*/
- polllock(&stp->sd_pollist, &stp->sd_lock);
+ if (polllock(&stp->sd_pollist, &stp->sd_lock) != 0) {
+ *reventsp = POLLNVAL;
+ return (0);
+ }
headlocked = 1;
mp = qp->q_first;
while (mp) {
@@ -8326,7 +8343,10 @@ chkrd:
if (!anyyet) {
*phpp = &stp->sd_pollist;
if (headlocked == 0) {
- polllock(&stp->sd_pollist, &stp->sd_lock);
+ if (polllock(&stp->sd_pollist, &stp->sd_lock) != 0) {
+ *reventsp = POLLNVAL;
+ return (0);
+ }
headlocked = 1;
}
stp->sd_rput_opt |= SR_POLLIN;