diff options
author | Anil udupa <anil.udupa@sun.com> | 2010-06-10 13:30:18 -0700 |
---|---|---|
committer | Anil udupa <anil.udupa@sun.com> | 2010-06-10 13:30:18 -0700 |
commit | 86c7bc49728b6a3228834132566f5262f2a04ba6 (patch) | |
tree | f8dd325e13d355639563c986d2785bf4f9593060 /usr/src/uts/common | |
parent | 9d2159663a6316391e58ae8fc8a1e1a63dc9789c (diff) | |
download | illumos-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.c | 8 |
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); } |