summaryrefslogtreecommitdiff
path: root/usr/src/uts/common
diff options
context:
space:
mode:
authorAnil udupa <anil.udupa@sun.com>2010-06-10 13:30:18 -0700
committerAnil udupa <anil.udupa@sun.com>2010-06-10 13:30:18 -0700
commit86c7bc49728b6a3228834132566f5262f2a04ba6 (patch)
treef8dd325e13d355639563c986d2785bf4f9593060 /usr/src/uts/common
parent9d2159663a6316391e58ae8fc8a1e1a63dc9789c (diff)
downloadillumos-joyent-86c7bc49728b6a3228834132566f5262f2a04ba6.tar.gz
6714700 logic error in strdoioctl
Diffstat (limited to 'usr/src/uts/common')
-rw-r--r--usr/src/uts/common/os/streamio.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/usr/src/uts/common/os/streamio.c b/usr/src/uts/common/os/streamio.c
index 2ac660e419..c2e31b0711 100644
--- a/usr/src/uts/common/os/streamio.c
+++ b/usr/src/uts/common/os/streamio.c
@@ -23,8 +23,7 @@
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
*/
#include <sys/types.h>
@@ -5892,6 +5891,7 @@ strdoioctl(
int sigflag = (flag & STR_NOSIG);
int errs;
uint_t waitflags;
+ boolean_t set_iocwaitne = B_FALSE;
ASSERT(copyflag == U_TO_K || copyflag == K_TO_K);
ASSERT((fflags & FMODELS) != 0);
@@ -5977,7 +5977,8 @@ strdoioctl(
error = 0;
mutex_enter(&stp->sd_lock);
- while (stp->sd_flag & (IOCWAIT | IOCWAITNE)) {
+ while ((stp->sd_flag & IOCWAIT) ||
+ (!set_iocwaitne && (stp->sd_flag & IOCWAITNE))) {
clock_t cv_rval;
TRACE_0(TR_FAC_STREAMS_FR,
@@ -5997,6 +5998,7 @@ strdoioctl(
* operation completes.
*/
if (!(stp->sd_flag & IOCWAITNE)) {
+ set_iocwaitne = B_TRUE;
stp->sd_flag |= IOCWAITNE;
cv_broadcast(&stp->sd_monitor);
}