Lines Matching +full:wake +full:- +full:up
38 * type supports STREAMS-based pipes and FIFOs.
160 * writing via cross-zone named pipes. A privileged global
162 * it from a lower-level zone to a higher-level zone. The
163 * kernel-enforced mount policy for lofs mounts ensures
164 * that such mounts are read-only in the higher-level
170 * zone of the writing process. Writing up is possible since
184 (!(fnp->fn_flag & ISPIPE))) { in tsol_fifo_access()
220 * before the end waiting in open ever wakes up.
228 fifolock_t *fn_lock = fnp->fn_lock; in fifo_open()
231 ASSERT(vp->v_type == VFIFO); in fifo_open()
237 mutex_enter(&fn_lock->flk_lock); in fifo_open()
239 * If we are the first reader, wake up any writers that in fifo_open()
241 * wake up before proceeding (i.e. fn_wsynccnt == 0) in fifo_open()
244 fnp->fn_rcnt++; /* record reader present */ in fifo_open()
245 if (! (fnp->fn_flag & ISPIPE)) in fifo_open()
246 fnp->fn_rsynccnt++; /* record reader in open */ in fifo_open()
250 * If we are the first writer, wake up any readers that in fifo_open()
252 * wake up before proceeding (i.e. fn_rsynccnt == 0) in fifo_open()
255 fnp->fn_wcnt++; /* record writer present */ in fifo_open()
256 if (! (fnp->fn_flag & ISPIPE)) in fifo_open()
257 fnp->fn_wsynccnt++; /* record writer in open */ in fifo_open()
267 * since fifo's are the only thing we need to sync up, in fifo_open()
272 ASSERT(MUTEX_HELD(&VTOF(*vpp)->fn_lock->flk_lock)); in fifo_open()
273 if (fnp->fn_flag & ISPIPE) { in fifo_open()
274 ASSERT(VTOF(*vpp)->fn_flag & ISPIPE); in fifo_open()
275 ASSERT(VTOF(*vpp)->fn_rsynccnt == 0); in fifo_open()
276 ASSERT(VTOF(*vpp)->fn_rsynccnt == 0); in fifo_open()
281 ASSERT(fnp->fn_rsynccnt == 0); in fifo_open()
282 ASSERT(fnp->fn_wsynccnt == 0); in fifo_open()
283 mutex_exit(&VTOF(*vpp)->fn_lock->flk_lock); in fifo_open()
293 * if there is a writer (or reader) waiting for us, wake them up in fifo_open()
296 * before the writer (or reader) has a chance to wake up in fifo_open()
300 fnp->fn_rsynccnt--; /* reader done with open */ in fifo_open()
301 if (fnp->fn_flag & FIFOSYNC) { in fifo_open()
307 fnp->fn_flag |= FIFOROCR; in fifo_open()
308 cv_broadcast(&fnp->fn_wait_cv); in fifo_open()
312 fnp->fn_wsynccnt--; /* writer done with open */ in fifo_open()
313 if (fnp->fn_flag & FIFOSYNC) { in fifo_open()
319 fnp->fn_flag |= FIFOWOCR; in fifo_open()
320 cv_broadcast(&fnp->fn_wait_cv); in fifo_open()
324 fnp->fn_flag &= ~FIFOSYNC; in fifo_open()
328 * Note: XXX other end will wake up and continue despite error. in fifo_open()
333 mutex_exit(&fnp->fn_lock->flk_lock); in fifo_open()
336 ASSERT(fnp->fn_rsynccnt <= fnp->fn_rcnt); in fifo_open()
337 ASSERT(fnp->fn_wsynccnt <= fnp->fn_wcnt); in fifo_open()
340 * has woken us up and is done with open (this way, if the other in fifo_open()
348 while ((fnp->fn_flag & FIFOWOCR) == 0 && in fifo_open()
349 fnp->fn_wcnt == fnp->fn_wsynccnt) { in fifo_open()
351 mutex_exit(&fnp->fn_lock->flk_lock); in fifo_open()
354 fnp->fn_insync++; in fifo_open()
355 fnp->fn_flag |= FIFOSYNC; in fifo_open()
356 if (!cv_wait_sig_swap(&fnp->fn_wait_cv, in fifo_open()
357 &fnp->fn_lock->flk_lock)) { in fifo_open()
363 if (--fnp->fn_insync == 0 && in fifo_open()
364 fnp->fn_flag & FIFOWOCR) { in fifo_open()
365 fnp->fn_flag &= ~(FIFOWOCR|FIFOROCR); in fifo_open()
367 mutex_exit(&fnp->fn_lock->flk_lock); in fifo_open()
377 if (--fnp->fn_insync == 0 && in fifo_open()
378 fnp->fn_flag & FIFOWOCR) { in fifo_open()
379 fnp->fn_flag &= ~(FIFOWOCR|FIFOROCR); in fifo_open()
384 while ((fnp->fn_flag & FIFOROCR) == 0 && in fifo_open()
385 fnp->fn_rcnt == fnp->fn_rsynccnt) { in fifo_open()
386 if ((flag & (FNDELAY|FNONBLOCK)) && fnp->fn_rcnt == 0) { in fifo_open()
387 mutex_exit(&fnp->fn_lock->flk_lock); in fifo_open()
392 fnp->fn_flag |= FIFOSYNC; in fifo_open()
393 fnp->fn_insync++; in fifo_open()
394 if (!cv_wait_sig_swap(&fnp->fn_wait_cv, in fifo_open()
395 &fnp->fn_lock->flk_lock)) { in fifo_open()
401 if (--fnp->fn_insync == 0 && in fifo_open()
402 (fnp->fn_flag & FIFOROCR) != 0) { in fifo_open()
403 fnp->fn_flag &= ~(FIFOWOCR|FIFOROCR); in fifo_open()
405 mutex_exit(&fnp->fn_lock->flk_lock); in fifo_open()
415 if (--fnp->fn_insync == 0 && in fifo_open()
416 (fnp->fn_flag & FIFOROCR) != 0) { in fifo_open()
417 fnp->fn_flag &= ~(FIFOWOCR|FIFOROCR); in fifo_open()
422 mutex_exit(&fn_lock->flk_lock); in fifo_open()
443 fifonode_t *fn_dest = fnp->fn_dest; in fifo_close()
445 fifolock_t *fn_lock = fnp->fn_lock; in fifo_close()
450 ASSERT(vp->v_stream != NULL); in fifo_close()
454 (void) cleanlocks(vp, ttoproc(curthread)->p_pid, 0); in fifo_close()
455 cleanshares(vp, ttoproc(curthread)->p_pid); in fifo_close()
466 mutex_enter(&fn_lock->flk_lock); in fifo_close()
469 * wait for pending opens to finish up in fifo_close()
472 while (fn_lock->flk_ocsync) in fifo_close()
473 cv_wait(&fn_lock->flk_wait_cv, &fn_lock->flk_lock); in fifo_close()
475 fn_lock->flk_ocsync = 1; in fifo_close()
478 fnp->fn_rcnt--; in fifo_close()
481 * If we are last writer wake up sleeping readers in fifo_close()
488 if (--fnp->fn_wcnt == 0 && fn_dest->fn_rcnt > 0) { in fifo_close()
489 if ((fn_dest->fn_flag & (FIFOFAST | FIFOWANTR)) == in fifo_close()
493 * Wake up any sleeping readers or in fifo_close()
496 fn_dest->fn_flag &= ~(FIFOWANTR | FIFOWANTW); in fifo_close()
497 cv_broadcast(&fn_dest->fn_wait_cv); in fifo_close()
501 * was opened non-blocking. It is the in fifo_close()
505 if (!(fnp->fn_flag & ISPIPE)) in fifo_close()
506 fnp->fn_flag |= FIFOCLOSE; in fifo_close()
519 * Pipes just need to wake up the other end so that it can in fifo_close()
523 if (fnp->fn_rcnt == 0 && fn_dest->fn_wcnt > 0) { in fifo_close()
524 if ((fn_dest->fn_flag & (FIFOFAST | FIFOWANTW)) == in fifo_close()
527 * wake up any sleeping writers in fifo_close()
529 fn_dest->fn_flag &= ~FIFOWANTW; in fifo_close()
530 cv_broadcast(&fn_dest->fn_wait_cv); in fifo_close()
539 if (--fnp->fn_open > 0) { in fifo_close()
540 ASSERT((fnp->fn_rcnt + fnp->fn_wcnt) != 0); in fifo_close()
541 fn_lock->flk_ocsync = 0; in fifo_close()
542 cv_broadcast(&fn_lock->flk_wait_cv); in fifo_close()
543 mutex_exit(&fn_lock->flk_lock); in fifo_close()
549 * (fnp->fn_rcnt or fnp->fn_wcnt may not be zero (some thread in fifo_close()
562 if (fn_dest->fn_open && senthang == 0) in fifo_close()
570 * Wake up anybody blocked at the other end and for named pipes, in fifo_close()
579 fnp->fn_flag &= ~FIFOISOPEN; in fifo_close()
580 if ((fnp->fn_flag & ISPIPE) && !(fnp->fn_flag & FIFOCLOSE)) { in fifo_close()
581 fnp->fn_flag |= FIFOCLOSE; in fifo_close()
582 fn_dest->fn_flag |= FIFOCLOSE; in fifo_close()
583 if (fnp->fn_flag & FIFOFAST) in fifo_close()
585 if (vp->v_stream != NULL) { in fifo_close()
586 mutex_exit(&fn_lock->flk_lock); in fifo_close()
588 mutex_enter(&fn_lock->flk_lock); in fifo_close()
590 cv_broadcast(&fn_dest->fn_wait_cv); in fifo_close()
596 fn_lock->flk_ocsync = 0; in fifo_close()
597 cv_broadcast(&fn_lock->flk_wait_cv); in fifo_close()
603 if (fn_dest_vp->v_stream && in fifo_close()
604 (fn_dest_vp->v_stream->sd_flag & STRMOUNT)) { in fifo_close()
612 mutex_exit(&fn_lock->flk_lock); in fifo_close()
617 ASSERT(vp->v_count >= 1); in fifo_close()
618 mutex_exit(&fn_lock->flk_lock); in fifo_close()
621 if (fnp->fn_flag & FIFOFAST) in fifo_close()
625 if (fn_dest_vp->v_stream) in fifo_close()
626 ASSERT((fn_dest_vp->v_stream->sd_flag & STRMOUNT) == 0); in fifo_close()
628 if (vp->v_stream != NULL) { in fifo_close()
629 mutex_exit(&fn_lock->flk_lock); in fifo_close()
631 mutex_enter(&fn_lock->flk_lock); in fifo_close()
633 fn_lock->flk_ocsync = 0; in fifo_close()
634 cv_broadcast(&fn_lock->flk_wait_cv); in fifo_close()
635 cv_broadcast(&fn_dest->fn_wait_cv); in fifo_close()
636 mutex_exit(&fn_lock->flk_lock); in fifo_close()
646 * (3) write-only FIFO with no data
653 * - if the NDELAY/NONBLOCK flag is set, return 0/EAGAIN.
654 * - wait for a write.
665 fifolock_t *fn_lock = fnp->fn_lock; in fifo_read()
669 ASSERT(vp->v_stream != NULL); in fifo_read()
670 if (uiop->uio_resid == 0) in fifo_read()
673 mutex_enter(&fn_lock->flk_lock); in fifo_read()
677 if (! (fnp->fn_flag & FIFOFAST)) in fifo_read()
680 fn_dest = fnp->fn_dest; in fifo_read()
685 while (fnp->fn_count == 0) { in fifo_read()
689 if (fn_dest->fn_wcnt == 0 || fn_dest->fn_rcnt == 0) { in fifo_read()
690 mutex_exit(&fn_lock->flk_lock); in fifo_read()
694 * no data found.. if non-blocking, return EAGAIN in fifo_read()
697 if (uiop->uio_fmode & (FNDELAY|FNONBLOCK)) { in fifo_read()
698 mutex_exit(&fn_lock->flk_lock); in fifo_read()
699 if (uiop->uio_fmode & FNONBLOCK) in fifo_read()
709 ASSERT((fnp->fn_flag & (ISPIPE|FIFOCLOSE)) != in fifo_read()
714 fnp->fn_flag |= FIFOWANTR; in fifo_read()
718 if (!cv_wait_sig_swap(&fnp->fn_wait_cv, in fifo_read()
719 &fn_lock->flk_lock)) { in fifo_read()
730 if (!(fnp->fn_flag & FIFOFAST)) in fifo_read()
734 ASSERT(fnp->fn_mp != NULL); in fifo_read()
737 uiop->uio_extflg |= UIO_COPY_CACHED; in fifo_read()
740 int bpsize = MBLKL(fnp->fn_mp); in fifo_read()
741 int uiosize = MIN(bpsize, uiop->uio_resid); in fifo_read()
743 error = uiomove(fnp->fn_mp->b_rptr, uiosize, UIO_READ, uiop); in fifo_read()
747 fnp->fn_count -= uiosize; in fifo_read()
750 bp = fnp->fn_mp; in fifo_read()
751 fnp->fn_mp = fnp->fn_mp->b_cont; in fifo_read()
754 if (uiop->uio_resid == 0) in fifo_read()
757 while (fnp->fn_mp == NULL && fn_dest->fn_wwaitcnt > 0) { in fifo_read()
758 ASSERT(fnp->fn_count == 0); in fifo_read()
760 if (uiop->uio_fmode & (FNDELAY|FNONBLOCK)) in fifo_read()
769 fnp->fn_flag |= FIFOWANTR; in fifo_read()
772 if (!cv_wait_sig(&fnp->fn_wait_cv, in fifo_read()
773 &fn_lock->flk_lock)) in fifo_read()
776 if (!(fnp->fn_flag & FIFOFAST)) in fifo_read()
780 fnp->fn_mp->b_rptr += uiosize; in fifo_read()
781 ASSERT(uiop->uio_resid == 0); in fifo_read()
783 } while (uiop->uio_resid != 0 && fnp->fn_mp != NULL); in fifo_read()
786 ASSERT(msgdsize(fnp->fn_mp) == fnp->fn_count); in fifo_read()
789 * wake up any blocked writers, processes in fifo_read()
794 if (fn_dest->fn_flag & (FIFOWANTW | FIFOHIWATW) && in fifo_read()
795 fnp->fn_count < Fifohiwat) { in fifo_read()
805 mutex_exit(&fn_lock->flk_lock); in fifo_read()
811 mutex_enter(&fn_lock->flk_lock); in fifo_read()
818 gethrestime(&fnp->fn_atime); in fifo_read()
820 if (fnp->fn_flag & ISPIPE) in fifo_read()
821 fnp->fn_dest->fn_atime = fnp->fn_atime; in fifo_read()
825 mutex_exit(&fn_lock->flk_lock); in fifo_read()
838 * - if the NDELAY/NONBLOCK flag is set, return 0/EAGAIN.
839 * - unlock the fifonode and sleep waiting for a reader.
840 * - if a pipe and it has a mate, sleep waiting for its mate
858 ASSERT(vp->v_stream); in fifo_write()
859 uiop->uio_loffset = 0; in fifo_write()
860 stp = vp->v_stream; in fifo_write()
866 write_size = uiop->uio_resid; in fifo_write()
869 * only send zero-length messages if SW_SNDZERO is set in fifo_write()
873 if ((write_size == 0) && !(stp->sd_wput_opt & SW_SNDZERO)) in fifo_write()
877 fn_lock = fnp->fn_lock; in fifo_write()
878 fn_dest = fnp->fn_dest; in fifo_write()
880 mutex_enter(&fn_lock->flk_lock); in fifo_write()
888 if (fn_dest->fn_rcnt == 0 || fn_dest->fn_wcnt == 0) { in fifo_write()
895 if (!(fnp->fn_flag & FIFOFAST)) in fifo_write()
898 fmode = uiop->uio_fmode & (FNDELAY|FNONBLOCK); in fifo_write()
901 uiop->uio_extflg |= UIO_COPY_CACHED; in fifo_write()
907 while (fn_dest->fn_count >= Fifohiwat) { in fifo_write()
913 * if non-blocking, return in fifo_write()
917 fnp->fn_flag |= FIFOHIWATW; in fifo_write()
918 if (uiop->uio_resid == write_size) { in fifo_write()
919 mutex_exit(&fn_lock->flk_lock); in fifo_write()
931 fnp->fn_flag |= FIFOWANTW; in fifo_write()
932 fnp->fn_wwaitcnt++; in fifo_write()
935 if (!cv_wait_sig_swap(&fnp->fn_wait_cv, in fifo_write()
936 &fn_lock->flk_lock)) { in fifo_write()
938 fnp->fn_wwaitcnt--; in fifo_write()
942 fnp->fn_wwaitcnt--; in fifo_write()
945 "fifo_write wake: %p", vp); in fifo_write()
950 if (!(fnp->fn_flag & FIFOFAST)) in fifo_write()
956 if (fn_dest->fn_rcnt == 0 || fn_dest->fn_wcnt == 0) { in fifo_write()
962 * then we must break the message up into PIPE_BUF in fifo_write()
965 if (uiop->uio_resid + fn_dest->fn_count > Fifohiwat) in fifo_write()
966 size = MIN(uiop->uio_resid, PIPE_BUF); in fifo_write()
968 size = uiop->uio_resid; in fifo_write()
978 * back to sleep, only to be woken up microseconds later by in fifo_write()
981 hotread = fn_dest->fn_count > 0; in fifo_write()
985 mutex_exit(&fn_lock->flk_lock); in fifo_write()
996 mutex_exit(&fn_lock->flk_lock); in fifo_write()
1000 mutex_enter(&fn_lock->flk_lock); in fifo_write()
1005 * need to wake up any thread waiting to be in fifo_write()
1016 if (!(fnp->fn_flag & FIFOFAST)) in fifo_write()
1022 if (fn_dest->fn_rcnt == 0 || fn_dest->fn_wcnt == 0) { in fifo_write()
1031 bp->b_rptr += ((uintptr_t)uiop->uio_iov->iov_base & 0x7); in fifo_write()
1032 bp->b_wptr = bp->b_rptr + size; in fifo_write()
1033 error = uiomove((caddr_t)bp->b_rptr, size, UIO_WRITE, uiop); in fifo_write()
1035 mutex_enter(&fn_lock->flk_lock); in fifo_write()
1038 * - wake up any thread waiting to be allowed to go in fifo_write()
1040 * - make sure readers didn't go away. in fifo_write()
1043 if (fn_dest->fn_rcnt == 0 || fn_dest->fn_wcnt == 0) { in fifo_write()
1054 fn_dest->fn_count += size; in fifo_write()
1055 if (fn_dest->fn_mp != NULL) { in fifo_write()
1056 fn_dest->fn_tail->b_cont = bp; in fifo_write()
1057 fn_dest->fn_tail = bp; in fifo_write()
1059 fn_dest->fn_mp = fn_dest->fn_tail = bp; in fifo_write()
1061 * This is the first bit of data; wake up any sleeping in fifo_write()
1067 } while (uiop->uio_resid != 0); in fifo_write()
1076 ASSERT(MUTEX_HELD(&fn_lock->flk_lock)); in fifo_write()
1078 mutex_exit(&fn_lock->flk_lock); in fifo_write()
1084 mutex_enter(&fn_lock->flk_lock); in fifo_write()
1091 if (error == 0 && write_size != uiop->uio_resid) { in fifo_write()
1095 if (fnp->fn_flag & ISPIPE) { in fifo_write()
1096 fn_dest->fn_mtime = fn_dest->fn_ctime = now; in fifo_write()
1098 fnp->fn_mtime = fnp->fn_ctime = now; in fifo_write()
1099 } else if (fn_dest->fn_rcnt == 0 || fn_dest->fn_wcnt == 0) { in fifo_write()
1104 mutex_exit(&fn_lock->flk_lock); in fifo_write()
1110 mutex_exit(&fn_lock->flk_lock); in fifo_write()
1126 return ((VTOF(vp)->fn_flag & FIFOFAST) ? in fifo_ioctl()
1136 if (mode == FKIOCTL && fnp->fn_pcredp != NULL) { in fifo_ioctl_getpeercred()
1137 crhold(fnp->fn_pcredp); in fifo_ioctl_getpeercred()
1138 kp->pc_cr = fnp->fn_pcredp; in fifo_ioctl_getpeercred()
1139 kp->pc_cpid = fnp->fn_cpid; in fifo_ioctl_getpeercred()
1153 fifolock_t *fn_lock = fnp->fn_lock; in fifo_fastioctl()
1165 mutex_enter(&fn_lock->flk_lock); in fifo_fastioctl()
1167 if (!(fnp->fn_flag & FIFOFAST)) { in fifo_fastioctl()
1205 mutex_exit(&fn_lock->flk_lock); in fifo_fastioctl()
1217 *rvalp = (fnp->fn_dest->fn_count < Fifohiwat) ? 1 : 0; in fifo_fastioctl()
1218 mutex_exit(&fn_lock->flk_lock); in fifo_fastioctl()
1223 * This may seem a bit silly for non-streams semantics, in fifo_fastioctl()
1227 error = copyout((caddr_t)&fnp->fn_count, (caddr_t)arg, in fifo_fastioctl()
1230 *rvalp = (fnp->fn_count == 0) ? 0 : 1; in fifo_fastioctl()
1235 *rvalp = fnp->fn_count; in fifo_fastioctl()
1249 if (fnp->fn_count == 0) { in fifo_fastioctl()
1281 count = fnp->fn_count; in fifo_fastioctl()
1282 bp = fnp->fn_mp; in fifo_fastioctl()
1285 if ((error = uiomove((char *)bp->b_rptr, cnt, in fifo_fastioctl()
1289 count -= cnt; in fifo_fastioctl()
1290 bp = bp->b_cont; in fifo_fastioctl()
1292 STRUCT_FSET(strpeek, databuf.len, len - uio.uio_resid); in fifo_fastioctl()
1295 STRUCT_FSET(strpeek, ctlbuf.len, -1); in fifo_fastioctl()
1308 error = copyout((caddr_t)&fnp->fn_count, (caddr_t)arg, in fifo_fastioctl()
1309 sizeof (fnp->fn_count)); in fifo_fastioctl()
1316 * let streams set up the signal masking for us in fifo_fastioctl()
1322 if (vp->v_stream->sd_sigflags & (S_INPUT|S_RDNORM|S_WRNORM)) in fifo_fastioctl()
1323 fnp->fn_flag |= FIFOSETSIG; in fifo_fastioctl()
1325 fnp->fn_flag &= ~FIFOSETSIG; in fifo_fastioctl()
1339 fn_dest = fnp->fn_dest; in fifo_fastioctl()
1344 * wake up any sleeping readers or writers in fifo_fastioctl()
1349 if (fn_dest->fn_flag & (FIFOWANTW | FIFOWANTR)) { in fifo_fastioctl()
1350 fn_dest->fn_flag &= ~(FIFOWANTW | FIFOWANTR); in fifo_fastioctl()
1351 cv_broadcast(&fn_dest->fn_wait_cv); in fifo_fastioctl()
1390 mutex_exit(&fn_lock->flk_lock); in fifo_fastioctl()
1400 mutex_exit(&fn_lock->flk_lock); in fifo_fastioctl()
1433 fn_lock = fnp->fn_lock; in fifo_strioctl()
1434 mutex_enter(&fn_lock->flk_lock); in fifo_strioctl()
1435 if (fnp->fn_flag & FIFOSEND) { in fifo_strioctl()
1436 fnp->fn_flag &= ~FIFOSEND; in fifo_strioctl()
1437 cv_broadcast(&fnp->fn_dest->fn_wait_cv); in fifo_strioctl()
1439 mutex_exit(&fn_lock->flk_lock); in fifo_strioctl()
1462 fifolock_t *fn_lock = fnp->fn_lock; in fifo_getattr()
1464 if (fnp->fn_realvp) { in fifo_getattr()
1468 if (error = VOP_GETATTR(fnp->fn_realvp, vap, flags, crp, ct)) in fifo_getattr()
1470 mutex_enter(&fn_lock->flk_lock); in fifo_getattr()
1472 vap->va_atime = fnp->fn_atime; in fifo_getattr()
1473 vap->va_mtime = fnp->fn_mtime; in fifo_getattr()
1474 vap->va_ctime = fnp->fn_ctime; in fifo_getattr()
1477 * for non-attached/ordinary pipes in fifo_getattr()
1479 vap->va_mode = 0; in fifo_getattr()
1480 mutex_enter(&fn_lock->flk_lock); in fifo_getattr()
1481 vap->va_atime = fnp->fn_atime; in fifo_getattr()
1482 vap->va_mtime = fnp->fn_mtime; in fifo_getattr()
1483 vap->va_ctime = fnp->fn_ctime; in fifo_getattr()
1484 vap->va_uid = crgetuid(crp); in fifo_getattr()
1485 vap->va_gid = crgetgid(crp); in fifo_getattr()
1486 vap->va_nlink = 0; in fifo_getattr()
1487 vap->va_fsid = fifodev; in fifo_getattr()
1488 vap->va_nodeid = (ino64_t)fnp->fn_ino; in fifo_getattr()
1489 vap->va_rdev = 0; in fifo_getattr()
1491 vap->va_type = VFIFO; in fifo_getattr()
1492 vap->va_blksize = PIPE_BUF; in fifo_getattr()
1494 * Size is number of un-read bytes at the stream head and in fifo_getattr()
1497 if (vp->v_stream && (fnp->fn_flag & FIFOISOPEN)) { in fifo_getattr()
1498 if ((fnp->fn_flag & FIFOFAST)) { in fifo_getattr()
1499 vap->va_size = (u_offset_t)fnp->fn_count; in fifo_getattr()
1502 vap->va_size = (u_offset_t)qp->q_count; in fifo_getattr()
1503 if (qp->q_nband != 0) { in fifo_getattr()
1505 for (bandp = qp->q_bandp; bandp; in fifo_getattr()
1506 bandp = bandp->qb_next) in fifo_getattr()
1507 vap->va_size += bandp->qb_count; in fifo_getattr()
1511 vap->va_nblocks = (fsblkcnt64_t)btod(vap->va_size); in fifo_getattr()
1513 vap->va_size = (u_offset_t)0; in fifo_getattr()
1514 vap->va_nblocks = (fsblkcnt64_t)0; in fifo_getattr()
1516 mutex_exit(&fn_lock->flk_lock); in fifo_getattr()
1517 vap->va_seq = 0; in fifo_getattr()
1533 if (fnp->fn_realvp) in fifo_setattr()
1534 error = VOP_SETATTR(fnp->fn_realvp, vap, flags, crp, ctp); in fifo_setattr()
1536 fn_lock = fnp->fn_lock; in fifo_setattr()
1537 mutex_enter(&fn_lock->flk_lock); in fifo_setattr()
1538 if (vap->va_mask & AT_ATIME) in fifo_setattr()
1539 fnp->fn_atime = vap->va_atime; in fifo_setattr()
1540 if (vap->va_mask & AT_MTIME) in fifo_setattr()
1541 fnp->fn_mtime = vap->va_mtime; in fifo_setattr()
1542 gethrestime(&fnp->fn_ctime); in fifo_setattr()
1543 mutex_exit(&fn_lock->flk_lock); in fifo_setattr()
1555 if (VTOF(vp)->fn_realvp) in fifo_access()
1556 return (VOP_ACCESS(VTOF(vp)->fn_realvp, mode, flags, crp, ct)); in fifo_access()
1573 ASSERT(dvp && (dvp->v_flag & VROOT) && *name == '\0'); in fifo_create()
1586 if (targ->tv_sec > base->tv_sec) { in fifo_hres_gt()
1590 return (targ->tv_sec == base->tv_sec && in fifo_hres_gt()
1591 targ->tv_nsec > base->tv_nsec); in fifo_hres_gt()
1604 if (fnp->fn_realvp == NULL) in fifo_fsync()
1609 if (VOP_GETATTR(fnp->fn_realvp, &va, 0, crp, ct) == 0) { in fifo_fsync()
1611 if (fifo_hres_gt(&fnp->fn_mtime, &va.va_mtime)) { in fifo_fsync()
1612 va.va_mtime = fnp->fn_mtime; in fifo_fsync()
1615 if (fifo_hres_gt(&fnp->fn_atime, &va.va_atime)) { in fifo_fsync()
1616 va.va_atime = fnp->fn_atime; in fifo_fsync()
1620 (void) VOP_SETATTR(fnp->fn_realvp, &va, 0, crp, ct); in fifo_fsync()
1622 return (VOP_FSYNC(fnp->fn_realvp, syncflag, crp, ct)); in fifo_fsync()
1636 mutex_enter(&vp->v_lock); in fifo_inactive()
1637 ASSERT(vp->v_count >= 1); in fifo_inactive()
1639 if (vp->v_count != 0) { in fifo_inactive()
1644 mutex_exit(&vp->v_lock); in fifo_inactive()
1648 mutex_exit(&vp->v_lock); in fifo_inactive()
1658 if (fnp->fn_realvp) { in fifo_inactive()
1662 VN_RELE(fnp->fn_realvp); in fifo_inactive()
1663 VFS_RELE(vp->v_vfsp); in fifo_inactive()
1664 vp->v_vfsp = NULL; in fifo_inactive()
1668 fn_lock = fnp->fn_lock; in fifo_inactive()
1670 mutex_enter(&fn_lock->flk_lock); in fifo_inactive()
1671 ASSERT(vp->v_stream == NULL); in fifo_inactive()
1672 ASSERT(vp->v_count == 0); in fifo_inactive()
1675 * free everything up. in fifo_inactive()
1677 if (--fn_lock->flk_ref == 0) { in fifo_inactive()
1678 mutex_exit(&fn_lock->flk_lock); in fifo_inactive()
1679 ASSERT(fnp->fn_open == 0); in fifo_inactive()
1680 ASSERT(fnp->fn_dest->fn_open == 0); in fifo_inactive()
1681 if (fnp->fn_mp) { in fifo_inactive()
1682 freemsg(fnp->fn_mp); in fifo_inactive()
1683 fnp->fn_mp = NULL; in fifo_inactive()
1684 fnp->fn_count = 0; in fifo_inactive()
1686 if (fnp->fn_pcredp != NULL) { in fifo_inactive()
1687 crfree(fnp->fn_pcredp); in fifo_inactive()
1688 fnp->fn_pcredp = NULL; in fifo_inactive()
1690 if (fnp->fn_flag & ISPIPE) { in fifo_inactive()
1691 fifonode_t *fn_dest = fnp->fn_dest; in fifo_inactive()
1694 if (fn_dest->fn_mp) { in fifo_inactive()
1695 freemsg(fn_dest->fn_mp); in fifo_inactive()
1696 fn_dest->fn_mp = NULL; in fifo_inactive()
1697 fn_dest->fn_count = 0; in fifo_inactive()
1699 if (fn_dest->fn_pcredp != NULL) { in fifo_inactive()
1700 crfree(fn_dest->fn_pcredp); in fifo_inactive()
1701 fn_dest->fn_pcredp = NULL; in fifo_inactive()
1707 mutex_exit(&fn_lock->flk_lock); in fifo_inactive()
1718 if (VTOF(vp)->fn_realvp) in fifo_fid()
1719 return (VOP_FID(VTOF(vp)->fn_realvp, fidfnp, ct)); in fifo_fid()
1731 return (-1); in fifo_rwlock()
1761 if ((rvp = VTOF(vp)->fn_realvp) != NULL) { in fifo_realvp()
1784 ASSERT(vp->v_stream != NULL); in fifo_poll()
1786 stp = vp->v_stream; in fifo_poll()
1789 fn_dest = fnp->fn_dest; in fifo_poll()
1790 fn_lock = fnp->fn_lock; in fifo_poll()
1792 if (polllock(&stp->sd_pollist, &fn_lock->flk_lock) != 0) { in fifo_poll()
1800 if ((fnp->fn_flag & FIFOISOPEN) == 0) { in fifo_poll()
1802 fnp->fn_rcnt == 0) || in fifo_poll()
1804 fnp->fn_wcnt == 0)) { in fifo_poll()
1805 mutex_exit(&fnp->fn_lock->flk_lock); in fifo_poll()
1814 if (!(fnp->fn_flag & FIFOFAST)) { in fifo_poll()
1815 mutex_exit(&fnp->fn_lock->flk_lock); in fifo_poll()
1825 if ((fnp->fn_flag & ISPIPE) && (fn_dest->fn_open == 0)) { in fifo_poll()
1827 } else if ((fnp->fn_flag & (FIFOCLOSE | ISPIPE)) == FIFOCLOSE && in fifo_poll()
1828 (fn_dest->fn_wcnt == 0)) { in fifo_poll()
1836 if (fn_dest->fn_count < Fifohiwat) in fifo_poll()
1839 fnp->fn_flag |= FIFOHIWATW; in fifo_poll()
1849 if (fnp->fn_count) in fifo_poll()
1854 * if we happened to get something and we're not edge-triggered, return in fifo_poll()
1857 mutex_exit(&fnp->fn_lock->flk_lock); in fifo_poll()
1862 * If poll() has not found any events yet or we're edge-triggered, set in fifo_poll()
1863 * up event cell to wake up the poll if a requested event occurs on this in fifo_poll()
1868 fnp->fn_flag |= FIFOPOLLW; in fifo_poll()
1870 fnp->fn_flag |= FIFOPOLLR; in fifo_poll()
1872 fnp->fn_flag |= FIFOPOLLRBAND; in fifo_poll()
1876 *phpp = &stp->sd_pollist; in fifo_poll()
1878 mutex_exit(&fnp->fn_lock->flk_lock); in fifo_poll()
1923 if (vp->v_vfsp->vfs_flag & VFS_NOTRUNC) in fifo_pathconf()
1926 val = (ulong_t)-1; in fifo_pathconf()
1937 val = (ulong_t)-1; in fifo_pathconf()
1941 val = (ulong_t)-1; in fifo_pathconf()
1945 if (VTOF(vp)->fn_realvp) in fifo_pathconf()
1946 error = VOP_PATHCONF(VTOF(vp)->fn_realvp, cmd, in fifo_pathconf()
1973 if (VTOF(vp)->fn_realvp) { in fifo_setsecattr()
1974 (void) VOP_RWLOCK(VTOF(vp)->fn_realvp, V_WRITELOCK_TRUE, ct); in fifo_setsecattr()
1975 error = VOP_SETSECATTR(VTOF(vp)->fn_realvp, vsap, flag, in fifo_setsecattr()
1977 VOP_RWUNLOCK(VTOF(vp)->fn_realvp, V_WRITELOCK_TRUE, ct); in fifo_setsecattr()
1985 * an ACL from the permission bits that fifo_getattr() makes up.
1991 if (VTOF(vp)->fn_realvp) in fifo_getsecattr()
1992 return (VOP_GETSECATTR(VTOF(vp)->fn_realvp, vsap, flag, in fifo_getsecattr()
2001 * If the flag is already set then wait until it is removed - releasing
2008 ASSERT(MUTEX_HELD(&fnp->fn_lock->flk_lock)); in fifo_stayfast_enter()
2009 while (fnp->fn_flag & FIFOSTAYFAST) { in fifo_stayfast_enter()
2010 fnp->fn_flag |= FIFOWAITMODE; in fifo_stayfast_enter()
2011 cv_wait(&fnp->fn_wait_cv, &fnp->fn_lock->flk_lock); in fifo_stayfast_enter()
2012 fnp->fn_flag &= ~FIFOWAITMODE; in fifo_stayfast_enter()
2014 if (!(fnp->fn_flag & FIFOFAST)) in fifo_stayfast_enter()
2017 fnp->fn_flag |= FIFOSTAYFAST; in fifo_stayfast_enter()
2024 * - threads wanting to turn into stream mode waiting in fifo_fastoff(),
2025 * - other writers threads waiting in fifo_stayfast_enter().
2030 fifonode_t *fn_dest = fnp->fn_dest; in fifo_stayfast_exit()
2032 ASSERT(MUTEX_HELD(&fnp->fn_lock->flk_lock)); in fifo_stayfast_exit()
2034 fnp->fn_flag &= ~FIFOSTAYFAST; in fifo_stayfast_exit()
2036 if (fnp->fn_flag & FIFOWAITMODE) in fifo_stayfast_exit()
2037 cv_broadcast(&fnp->fn_wait_cv); in fifo_stayfast_exit()
2039 if ((fnp->fn_flag & ISPIPE) && (fn_dest->fn_flag & FIFOWAITMODE)) in fifo_stayfast_exit()
2040 cv_broadcast(&fn_dest->fn_wait_cv); in fifo_stayfast_exit()