xref: /illumos-gate/usr/src/uts/common/fs/fifofs/fifovnops.c (revision 8a2b682e57a046b828f37bcde1776f131ef4629f)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
22 /*	  All rights reserved.		*/
23 
24 
25 /*
26  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
27  * Use is subject to license terms.
28  */
29 
30 /*
31  * Copyright 2015, Joyent, Inc.
32  * Copyright (c) 2017 by Delphix. All rights reserved.
33  */
34 
35 /*
36  * FIFOFS file system vnode operations.  This file system
37  * type supports STREAMS-based pipes and FIFOs.
38  */
39 #include <sys/types.h>
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <sys/sysmacros.h>
43 #include <sys/cred.h>
44 #include <sys/errno.h>
45 #include <sys/time.h>
46 #include <sys/file.h>
47 #include <sys/fcntl.h>
48 #include <sys/kmem.h>
49 #include <sys/uio.h>
50 #include <sys/vfs.h>
51 #include <sys/vnode.h>
52 #include <sys/vfs_opreg.h>
53 #include <sys/pathname.h>
54 #include <sys/signal.h>
55 #include <sys/user.h>
56 #include <sys/strsubr.h>
57 #include <sys/stream.h>
58 #include <sys/strsun.h>
59 #include <sys/strredir.h>
60 #include <sys/fs/fifonode.h>
61 #include <sys/fs/namenode.h>
62 #include <sys/stropts.h>
63 #include <sys/proc.h>
64 #include <sys/unistd.h>
65 #include <sys/debug.h>
66 #include <fs/fs_subr.h>
67 #include <sys/filio.h>
68 #include <sys/termio.h>
69 #include <sys/ddi.h>
70 #include <sys/vtrace.h>
71 #include <sys/policy.h>
72 #include <sys/tsol/label.h>
73 
74 /*
75  * Define the routines/data structures used in this file.
76  */
77 static int fifo_read(vnode_t *, uio_t *, int, cred_t *, caller_context_t *);
78 static int fifo_write(vnode_t *, uio_t *, int, cred_t *, caller_context_t *);
79 static int fifo_getattr(vnode_t *, vattr_t *, int, cred_t *,
80 	caller_context_t *);
81 static int fifo_setattr(vnode_t *, vattr_t *, int, cred_t *,
82 	caller_context_t *);
83 static int fifo_realvp(vnode_t *, vnode_t **, caller_context_t *);
84 static int fifo_access(vnode_t *, int, int, cred_t *, caller_context_t *);
85 static int fifo_create(struct vnode *, char *, vattr_t *, enum vcexcl,
86     int, struct vnode **, struct cred *, int, caller_context_t *,
87     vsecattr_t *);
88 static int fifo_fid(vnode_t *, fid_t *, caller_context_t *);
89 static int fifo_fsync(vnode_t *, int, cred_t *, caller_context_t *);
90 static int fifo_seek(vnode_t *, offset_t, offset_t *, caller_context_t *);
91 static int fifo_ioctl(vnode_t *, int, intptr_t, int, cred_t *, int *,
92 	caller_context_t *);
93 static int fifo_fastioctl(vnode_t *, int, intptr_t, int, cred_t *, int *);
94 static int fifo_strioctl(vnode_t *, int, intptr_t, int, cred_t *, int *);
95 static int fifo_poll(vnode_t *, short, int, short *, pollhead_t **,
96 	caller_context_t *);
97 static int fifo_pathconf(vnode_t *, int, ulong_t *, cred_t *,
98 	caller_context_t *);
99 static void fifo_inactive(vnode_t *, cred_t *, caller_context_t *);
100 static int fifo_rwlock(vnode_t *, int, caller_context_t *);
101 static void fifo_rwunlock(vnode_t *, int, caller_context_t *);
102 static int fifo_setsecattr(struct vnode *, vsecattr_t *, int, struct cred *,
103 	caller_context_t *);
104 static int fifo_getsecattr(struct vnode *, vsecattr_t *, int, struct cred *,
105 	caller_context_t *);
106 
107 /* functions local to this file */
108 static boolean_t fifo_stayfast_enter(fifonode_t *);
109 static void fifo_stayfast_exit(fifonode_t *);
110 
111 /*
112  * Define the data structures external to this file.
113  */
114 extern	dev_t	fifodev;
115 extern struct qinit fifo_stwdata;
116 extern struct qinit fifo_strdata;
117 extern kmutex_t ftable_lock;
118 
119 struct  streamtab fifoinfo = { &fifo_strdata, &fifo_stwdata, NULL, NULL };
120 
121 struct vnodeops *fifo_vnodeops;
122 
123 const fs_operation_def_t fifo_vnodeops_template[] = {
124 	VOPNAME_OPEN,		{ .vop_open = fifo_open },
125 	VOPNAME_CLOSE,		{ .vop_close = fifo_close },
126 	VOPNAME_READ,		{ .vop_read = fifo_read },
127 	VOPNAME_WRITE,		{ .vop_write = fifo_write },
128 	VOPNAME_IOCTL,		{ .vop_ioctl = fifo_ioctl },
129 	VOPNAME_GETATTR,	{ .vop_getattr = fifo_getattr },
130 	VOPNAME_SETATTR,	{ .vop_setattr = fifo_setattr },
131 	VOPNAME_ACCESS,		{ .vop_access = fifo_access },
132 	VOPNAME_CREATE,		{ .vop_create = fifo_create },
133 	VOPNAME_FSYNC,		{ .vop_fsync = fifo_fsync },
134 	VOPNAME_INACTIVE,	{ .vop_inactive = fifo_inactive },
135 	VOPNAME_FID,		{ .vop_fid = fifo_fid },
136 	VOPNAME_RWLOCK,		{ .vop_rwlock = fifo_rwlock },
137 	VOPNAME_RWUNLOCK,	{ .vop_rwunlock = fifo_rwunlock },
138 	VOPNAME_SEEK,		{ .vop_seek = fifo_seek },
139 	VOPNAME_REALVP,		{ .vop_realvp = fifo_realvp },
140 	VOPNAME_POLL,		{ .vop_poll = fifo_poll },
141 	VOPNAME_PATHCONF,	{ .vop_pathconf = fifo_pathconf },
142 	VOPNAME_DISPOSE,	{ .error = fs_error },
143 	VOPNAME_SETSECATTR,	{ .vop_setsecattr = fifo_setsecattr },
144 	VOPNAME_GETSECATTR,	{ .vop_getsecattr = fifo_getsecattr },
145 	NULL,			NULL
146 };
147 
148 /*
149  * Return the fifoinfo structure.
150  */
151 struct streamtab *
152 fifo_getinfo()
153 {
154 	return (&fifoinfo);
155 }
156 
157 /*
158  * Trusted Extensions enforces a restrictive policy for
159  * writing via cross-zone named pipes. A privileged global
160  * zone process may expose a named pipe by loopback mounting
161  * it from a lower-level zone to a higher-level zone. The
162  * kernel-enforced mount policy for lofs mounts ensures
163  * that such mounts are read-only in the higher-level
164  * zone. But this is not sufficient to prevent writing
165  * down via fifos.  This function prevents writing down
166  * by comparing the zone of the process which is requesting
167  * write access with the zone owning the named pipe rendezvous.
168  * For write access the zone of the named pipe must equal the
169  * zone of the writing process. Writing up is possible since
170  * the named pipe can be opened for read by a process in a
171  * higher level zone.
172  *
173  * An exception is made for the global zone to support trusted
174  * processes which enforce their own data flow policies.
175  */
176 static boolean_t
177 tsol_fifo_access(vnode_t *vp, int flag, cred_t *crp)
178 {
179 	fifonode_t	*fnp = VTOF(vp);
180 
181 	if (is_system_labeled() &&
182 	    (flag & FWRITE) &&
183 	    (!(fnp->fn_flag & ISPIPE))) {
184 		zone_t	*proc_zone;
185 
186 		proc_zone = crgetzone(crp);
187 		if (proc_zone != global_zone) {
188 			char		vpath[MAXPATHLEN];
189 			zone_t		*fifo_zone;
190 
191 			/*
192 			 * Get the pathname and use it to find
193 			 * the zone of the fifo.
194 			 */
195 			if (vnodetopath(rootdir, vp, vpath, sizeof (vpath),
196 			    kcred) == 0) {
197 				fifo_zone = zone_find_by_path(vpath);
198 				zone_rele(fifo_zone);
199 
200 				if (fifo_zone != global_zone &&
201 				    fifo_zone != proc_zone) {
202 					return (B_FALSE);
203 				}
204 			} else {
205 				return (B_FALSE);
206 			}
207 		}
208 	}
209 	return (B_TRUE);
210 }
211 
212 /*
213  * Open and stream a FIFO.
214  * If this is the first open of the file (FIFO is not streaming),
215  * initialize the fifonode and attach a stream to the vnode.
216  *
217  * Each end of a fifo must be synchronized with the other end.
218  * If not, the mated end may complete an open, I/O, close sequence
219  * before the end waiting in open ever wakes up.
220  * Note: namefs pipes come through this routine too.
221  */
222 int
223 fifo_open(vnode_t **vpp, int flag, cred_t *crp, caller_context_t *ct)
224 {
225 	vnode_t		*vp		= *vpp;
226 	fifonode_t	*fnp		= VTOF(vp);
227 	fifolock_t	*fn_lock	= fnp->fn_lock;
228 	int		error;
229 
230 	ASSERT(vp->v_type == VFIFO);
231 	ASSERT(vn_matchops(vp, fifo_vnodeops));
232 
233 	if (!tsol_fifo_access(vp, flag, crp))
234 		return (EACCES);
235 
236 	mutex_enter(&fn_lock->flk_lock);
237 	/*
238 	 * If we are the first reader, wake up any writers that
239 	 * may be waiting around.  wait for all of them to
240 	 * wake up before proceeding (i.e. fn_wsynccnt == 0)
241 	 */
242 	if (flag & FREAD) {
243 		fnp->fn_rcnt++;		/* record reader present */
244 		if (! (fnp->fn_flag & ISPIPE))
245 			fnp->fn_rsynccnt++;	/* record reader in open */
246 	}
247 
248 	/*
249 	 * If we are the first writer, wake up any readers that
250 	 * may be waiting around.  wait for all of them to
251 	 * wake up before proceeding (i.e. fn_rsynccnt == 0)
252 	 */
253 	if (flag & FWRITE) {
254 		fnp->fn_wcnt++;		/* record writer present */
255 		if (! (fnp->fn_flag & ISPIPE))
256 			fnp->fn_wsynccnt++;	/* record writer in open */
257 	}
258 	/*
259 	 * fifo_stropen will take care of twisting the queues on the first
260 	 * open.  The 1 being passed in means twist the queues on the first
261 	 * open.
262 	 */
263 	error = fifo_stropen(vpp, flag, crp, 1, 1);
264 	/*
265 	 * fifo_stropen() could have replaced vpp
266 	 * since fifo's are the only thing we need to sync up,
267 	 * everything else just returns;
268 	 * Note: don't need to hold lock since ISPIPE can't change
269 	 * and both old and new vp need to be pipes
270 	 */
271 	ASSERT(MUTEX_HELD(&VTOF(*vpp)->fn_lock->flk_lock));
272 	if (fnp->fn_flag & ISPIPE) {
273 		ASSERT(VTOF(*vpp)->fn_flag & ISPIPE);
274 		ASSERT(VTOF(*vpp)->fn_rsynccnt == 0);
275 		ASSERT(VTOF(*vpp)->fn_rsynccnt == 0);
276 		/*
277 		 * XXX note: should probably hold locks, but
278 		 * These values should not be changing
279 		 */
280 		ASSERT(fnp->fn_rsynccnt == 0);
281 		ASSERT(fnp->fn_wsynccnt == 0);
282 		mutex_exit(&VTOF(*vpp)->fn_lock->flk_lock);
283 		return (error);
284 	}
285 	/*
286 	 * vp can't change for FIFOS
287 	 */
288 	ASSERT(vp == *vpp);
289 	/*
290 	 * If we are opening for read (or writer)
291 	 *   indicate that the reader (or writer) is done with open
292 	 *   if there is a writer (or reader) waiting for us, wake them up
293 	 *	and indicate that at least 1 read (or write) open has occurred
294 	 *	this is need in the event the read (or write) side closes
295 	 *	before the writer (or reader) has a chance to wake up
296 	 *	i.e. it sees that a reader (or writer) was once there
297 	 */
298 	if (flag & FREAD) {
299 		fnp->fn_rsynccnt--;	/* reader done with open */
300 		if (fnp->fn_flag & FIFOSYNC) {
301 			/*
302 			 * This indicates that a read open has occurred
303 			 * Only need to set if writer is actually asleep
304 			 * Flag will be consumed by writer.
305 			 */
306 			fnp->fn_flag |= FIFOROCR;
307 			cv_broadcast(&fnp->fn_wait_cv);
308 		}
309 	}
310 	if (flag & FWRITE) {
311 		fnp->fn_wsynccnt--;	/* writer done with open */
312 		if (fnp->fn_flag & FIFOSYNC) {
313 			/*
314 			 * This indicates that a write open has occurred
315 			 * Only need to set if reader is actually asleep
316 			 * Flag will be consumed by reader.
317 			 */
318 			fnp->fn_flag |= FIFOWOCR;
319 			cv_broadcast(&fnp->fn_wait_cv);
320 		}
321 	}
322 
323 	fnp->fn_flag &= ~FIFOSYNC;
324 
325 	/*
326 	 * errors don't wait around.. just return
327 	 * Note: XXX other end will wake up and continue despite error.
328 	 * There is no defined semantic on the correct course of option
329 	 * so we do what we've done in the past
330 	 */
331 	if (error != 0) {
332 		mutex_exit(&fnp->fn_lock->flk_lock);
333 		goto done;
334 	}
335 	ASSERT(fnp->fn_rsynccnt <= fnp->fn_rcnt);
336 	ASSERT(fnp->fn_wsynccnt <= fnp->fn_wcnt);
337 	/*
338 	 * FIFOWOCR (or FIFOROCR) indicates that the writer (or reader)
339 	 * has woken us up and is done with open (this way, if the other
340 	 * end has made it to close, we don't block forever in open)
341 	 * fn_wnct == fn_wsynccnt (or fn_rcnt == fn_rsynccnt) indicates
342 	 * that no writer (or reader) has yet made it through open
343 	 * This has the side benefit of that the first
344 	 * reader (or writer) will wait until the other end finishes open
345 	 */
346 	if (flag & FREAD) {
347 		while ((fnp->fn_flag & FIFOWOCR) == 0 &&
348 		    fnp->fn_wcnt == fnp->fn_wsynccnt) {
349 			if (flag & (FNDELAY|FNONBLOCK)) {
350 				mutex_exit(&fnp->fn_lock->flk_lock);
351 				goto done;
352 			}
353 			fnp->fn_insync++;
354 			fnp->fn_flag |= FIFOSYNC;
355 			if (!cv_wait_sig_swap(&fnp->fn_wait_cv,
356 			    &fnp->fn_lock->flk_lock)) {
357 				/*
358 				 * Last reader to wakeup clear writer
359 				 * Clear both writer and reader open
360 				 * occurred flag incase other end is O_RDWR
361 				 */
362 				if (--fnp->fn_insync == 0 &&
363 				    fnp->fn_flag & FIFOWOCR) {
364 					fnp->fn_flag &= ~(FIFOWOCR|FIFOROCR);
365 				}
366 				mutex_exit(&fnp->fn_lock->flk_lock);
367 				(void) fifo_close(*vpp, flag, 1, 0, crp, ct);
368 				error = EINTR;
369 				goto done;
370 			}
371 			/*
372 			 * Last reader to wakeup clear writer open occurred flag
373 			 * Clear both writer and reader open occurred flag
374 			 * incase other end is O_RDWR
375 			 */
376 			if (--fnp->fn_insync == 0 &&
377 			    fnp->fn_flag & FIFOWOCR) {
378 				fnp->fn_flag &= ~(FIFOWOCR|FIFOROCR);
379 				break;
380 			}
381 		}
382 	} else if (flag & FWRITE) {
383 		while ((fnp->fn_flag & FIFOROCR) == 0 &&
384 		    fnp->fn_rcnt == fnp->fn_rsynccnt) {
385 			if ((flag & (FNDELAY|FNONBLOCK)) && fnp->fn_rcnt == 0) {
386 				mutex_exit(&fnp->fn_lock->flk_lock);
387 				(void) fifo_close(*vpp, flag, 1, 0, crp, ct);
388 				error = ENXIO;
389 				goto done;
390 			}
391 			fnp->fn_flag |= FIFOSYNC;
392 			fnp->fn_insync++;
393 			if (!cv_wait_sig_swap(&fnp->fn_wait_cv,
394 			    &fnp->fn_lock->flk_lock)) {
395 				/*
396 				 * Last writer to wakeup clear
397 				 * Clear both writer and reader open
398 				 * occurred flag in case other end is O_RDWR
399 				 */
400 				if (--fnp->fn_insync == 0 &&
401 				    (fnp->fn_flag & FIFOROCR) != 0) {
402 					fnp->fn_flag &= ~(FIFOWOCR|FIFOROCR);
403 				}
404 				mutex_exit(&fnp->fn_lock->flk_lock);
405 				(void) fifo_close(*vpp, flag, 1, 0, crp, ct);
406 				error = EINTR;
407 				goto done;
408 			}
409 			/*
410 			 * Last writer to wakeup clear reader open occurred flag
411 			 * Clear both writer and reader open
412 			 * occurred flag in case other end is O_RDWR
413 			 */
414 			if (--fnp->fn_insync == 0 &&
415 			    (fnp->fn_flag & FIFOROCR) != 0) {
416 				fnp->fn_flag &= ~(FIFOWOCR|FIFOROCR);
417 				break;
418 			}
419 		}
420 	}
421 	mutex_exit(&fn_lock->flk_lock);
422 done:
423 	return (error);
424 }
425 
426 /*
427  * Close down a stream.
428  * Call cleanlocks() and strclean() on every close.
429  * For last close send hangup message and force
430  * the other end of a named pipe to be unmounted.
431  * Mount guarantees that the mounted end will only call fifo_close()
432  * with a count of 1 when the unmount occurs.
433  * This routine will close down one end of a pipe or FIFO
434  * and free the stream head via strclose()
435  */
436 /*ARGSUSED*/
437 int
438 fifo_close(vnode_t *vp, int flag, int count, offset_t offset, cred_t *crp,
439     caller_context_t *ct)
440 {
441 	fifonode_t	*fnp		= VTOF(vp);
442 	fifonode_t	*fn_dest	= fnp->fn_dest;
443 	int		error		= 0;
444 	fifolock_t	*fn_lock	= fnp->fn_lock;
445 	queue_t		*sd_wrq;
446 	vnode_t		*fn_dest_vp;
447 	int		senthang = 0;
448 
449 	ASSERT(vp->v_stream != NULL);
450 	/*
451 	 * clean locks and clear events.
452 	 */
453 	(void) cleanlocks(vp, ttoproc(curthread)->p_pid, 0);
454 	cleanshares(vp, ttoproc(curthread)->p_pid);
455 	strclean(vp);
456 
457 	/*
458 	 * If a file still has the pipe/FIFO open, return.
459 	 */
460 	if (count > 1)
461 		return (0);
462 
463 
464 	sd_wrq = strvp2wq(vp);
465 	mutex_enter(&fn_lock->flk_lock);
466 
467 	/*
468 	 * wait for pending opens to finish up
469 	 * note: this also has the side effect of single threading closes
470 	 */
471 	while (fn_lock->flk_ocsync)
472 		cv_wait(&fn_lock->flk_wait_cv, &fn_lock->flk_lock);
473 
474 	fn_lock->flk_ocsync = 1;
475 
476 	if (flag & FREAD) {
477 		fnp->fn_rcnt--;
478 	}
479 	/*
480 	 * If we are last writer wake up sleeping readers
481 	 * (They'll figure out that there are no more writers
482 	 * and do the right thing)
483 	 * send hangup down stream so that stream head will do the
484 	 * right thing.
485 	 */
486 	if (flag & FWRITE) {
487 		if (--fnp->fn_wcnt == 0 && fn_dest->fn_rcnt > 0) {
488 			if ((fn_dest->fn_flag & (FIFOFAST | FIFOWANTR)) ==
489 			    (FIFOFAST | FIFOWANTR)) {
490 				/*
491 				 * While we're at it, clear FIFOWANTW too
492 				 * Wake up any sleeping readers or
493 				 * writers.
494 				 */
495 				fn_dest->fn_flag &= ~(FIFOWANTR | FIFOWANTW);
496 				cv_broadcast(&fn_dest->fn_wait_cv);
497 			}
498 			/*
499 			 * This is needed incase the other side
500 			 * was opened non-blocking.  It is the
501 			 * only way we can tell that wcnt is 0 because
502 			 * of close instead of never having a writer
503 			 */
504 			if (!(fnp->fn_flag & ISPIPE))
505 				fnp->fn_flag |= FIFOCLOSE;
506 			/*
507 			 * Note: sending hangup effectively shuts down
508 			 * both reader and writer at other end.
509 			 */
510 			(void) putnextctl_wait(sd_wrq, M_HANGUP);
511 			senthang = 1;
512 		}
513 	}
514 
515 	/*
516 	 * For FIFOs we need to indicate to stream head that last reader
517 	 * has gone away so that an error is generated
518 	 * Pipes just need to wake up the other end so that it can
519 	 * notice this end has gone away.
520 	 */
521 
522 	if (fnp->fn_rcnt == 0 && fn_dest->fn_wcnt > 0) {
523 		if ((fn_dest->fn_flag & (FIFOFAST | FIFOWANTW)) ==
524 		    (FIFOFAST | FIFOWANTW)) {
525 			/*
526 			 * wake up any sleeping writers
527 			 */
528 			fn_dest->fn_flag &= ~FIFOWANTW;
529 			cv_broadcast(&fn_dest->fn_wait_cv);
530 		}
531 	}
532 
533 	/*
534 	 * if there are still processes with this FIFO open
535 	 *	clear open/close sync flag
536 	 *	and just return;
537 	 */
538 	if (--fnp->fn_open > 0) {
539 		ASSERT((fnp->fn_rcnt + fnp->fn_wcnt) != 0);
540 		fn_lock->flk_ocsync = 0;
541 		cv_broadcast(&fn_lock->flk_wait_cv);
542 		mutex_exit(&fn_lock->flk_lock);
543 		return (0);
544 	}
545 
546 	/*
547 	 * Need to send HANGUP if other side is still open
548 	 * (fnp->fn_rcnt or fnp->fn_wcnt may not be zero (some thread
549 	 * on this end of the pipe may still be in fifo_open())
550 	 *
551 	 * Note: we can get here with fn_rcnt and fn_wcnt != 0 if some
552 	 * thread is blocked somewhere in the fifo_open() path prior to
553 	 * fifo_stropen() incrementing fn_open.  This can occur for
554 	 * normal FIFOs as well as named pipes.  fn_rcnt and
555 	 * fn_wcnt only indicate attempts to open. fn_open indicates
556 	 * successful opens. Partially opened FIFOs should proceed
557 	 * normally; i.e. they will appear to be new opens.  Partially
558 	 * opened pipes will probably fail.
559 	 */
560 
561 	if (fn_dest->fn_open && senthang == 0)
562 		(void) putnextctl_wait(sd_wrq, M_HANGUP);
563 
564 
565 	/*
566 	 * If this a pipe and this is the first end to close,
567 	 * then we have a bit of cleanup work to do.
568 	 *	Mark both ends of pipe as closed.
569 	 *	Wake up anybody blocked at the other end and for named pipes,
570 	 *	Close down this end of the stream
571 	 *	Allow other opens/closes to continue
572 	 *	force an unmount of other end.
573 	 * Otherwise if this is last close,
574 	 *	flush messages,
575 	 *	close down the stream
576 	 *	allow other opens/closes to continue
577 	 */
578 	fnp->fn_flag &= ~FIFOISOPEN;
579 	if ((fnp->fn_flag & ISPIPE) && !(fnp->fn_flag & FIFOCLOSE)) {
580 		fnp->fn_flag |= FIFOCLOSE;
581 		fn_dest->fn_flag |= FIFOCLOSE;
582 		if (fnp->fn_flag & FIFOFAST)
583 			fifo_fastflush(fnp);
584 		if (vp->v_stream != NULL) {
585 			mutex_exit(&fn_lock->flk_lock);
586 			(void) strclose(vp, flag, crp);
587 			mutex_enter(&fn_lock->flk_lock);
588 		}
589 		cv_broadcast(&fn_dest->fn_wait_cv);
590 		/*
591 		 * allow opens and closes to proceed
592 		 * Since this end is now closed down, any attempt
593 		 * to do anything with this end will fail
594 		 */
595 		fn_lock->flk_ocsync = 0;
596 		cv_broadcast(&fn_lock->flk_wait_cv);
597 		fn_dest_vp = FTOV(fn_dest);
598 		/*
599 		 * if other end of pipe has been opened and it's
600 		 * a named pipe, unmount it
601 		 */
602 		if (fn_dest_vp->v_stream &&
603 		    (fn_dest_vp->v_stream->sd_flag & STRMOUNT)) {
604 			/*
605 			 * We must hold the destination vnode because
606 			 * nm_unmountall() causes close to be called
607 			 * for the other end of named pipe.  This
608 			 * could free the vnode before we are ready.
609 			 */
610 			VN_HOLD(fn_dest_vp);
611 			mutex_exit(&fn_lock->flk_lock);
612 			error = nm_unmountall(fn_dest_vp, crp);
613 			ASSERT(error == 0);
614 			VN_RELE(fn_dest_vp);
615 		} else {
616 			ASSERT(vp->v_count >= 1);
617 			mutex_exit(&fn_lock->flk_lock);
618 		}
619 	} else {
620 		if (fnp->fn_flag & FIFOFAST)
621 			fifo_fastflush(fnp);
622 #if DEBUG
623 		fn_dest_vp = FTOV(fn_dest);
624 		if (fn_dest_vp->v_stream)
625 			ASSERT((fn_dest_vp->v_stream->sd_flag & STRMOUNT) == 0);
626 #endif
627 		if (vp->v_stream != NULL) {
628 			mutex_exit(&fn_lock->flk_lock);
629 			(void) strclose(vp, flag, crp);
630 			mutex_enter(&fn_lock->flk_lock);
631 		}
632 		fn_lock->flk_ocsync = 0;
633 		cv_broadcast(&fn_lock->flk_wait_cv);
634 		cv_broadcast(&fn_dest->fn_wait_cv);
635 		mutex_exit(&fn_lock->flk_lock);
636 	}
637 	return (error);
638 }
639 
640 /*
641  * Read from a pipe or FIFO.
642  * return 0 if....
643  *    (1) user read request is 0 or no stream
644  *    (2) broken pipe with no data
645  *    (3) write-only FIFO with no data
646  *    (4) no data and FNDELAY flag is set.
647  * Otherwise return
648  *	EAGAIN if FNONBLOCK is set and no data to read
649  *	EINTR if signal received while waiting for data
650  *
651  * While there is no data to read....
652  *   -  if the NDELAY/NONBLOCK flag is set, return 0/EAGAIN.
653  *   -  wait for a write.
654  *
655  */
656 /*ARGSUSED*/
657 
658 static int
659 fifo_read(struct vnode *vp, struct uio *uiop, int ioflag, struct cred *crp,
660     caller_context_t *ct)
661 {
662 	fifonode_t	*fnp		= VTOF(vp);
663 	fifonode_t	*fn_dest;
664 	fifolock_t	*fn_lock	= fnp->fn_lock;
665 	int		error		= 0;
666 	mblk_t		*bp;
667 
668 	ASSERT(vp->v_stream != NULL);
669 	if (uiop->uio_resid == 0)
670 		return (0);
671 
672 	mutex_enter(&fn_lock->flk_lock);
673 
674 	TRACE_2(TR_FAC_FIFO, TR_FIFOREAD_IN, "fifo_read in:%p fnp %p", vp, fnp);
675 
676 	if (! (fnp->fn_flag & FIFOFAST))
677 		goto stream_mode;
678 
679 	fn_dest	= fnp->fn_dest;
680 	/*
681 	 * Check for data on our input queue
682 	 */
683 
684 	while (fnp->fn_count == 0) {
685 		/*
686 		 * No data on first attempt and no writer, then EOF
687 		 */
688 		if (fn_dest->fn_wcnt == 0 || fn_dest->fn_rcnt == 0) {
689 			mutex_exit(&fn_lock->flk_lock);
690 			return (0);
691 		}
692 		/*
693 		 * no data found.. if non-blocking, return EAGAIN
694 		 * otherwise 0.
695 		 */
696 		if (uiop->uio_fmode & (FNDELAY|FNONBLOCK)) {
697 			mutex_exit(&fn_lock->flk_lock);
698 			if (uiop->uio_fmode & FNONBLOCK)
699 				return (EAGAIN);
700 			return (0);
701 		}
702 
703 		/*
704 		 * Note: FIFOs can get here with FIFOCLOSE set if
705 		 * write side is in the middle of opeining after
706 		 * it once closed. Pipes better not have FIFOCLOSE set
707 		 */
708 		ASSERT((fnp->fn_flag & (ISPIPE|FIFOCLOSE)) !=
709 		    (ISPIPE|FIFOCLOSE));
710 		/*
711 		 * wait for data
712 		 */
713 		fnp->fn_flag |= FIFOWANTR;
714 
715 		TRACE_1(TR_FAC_FIFO, TR_FIFOREAD_WAIT, "fiforead wait: %p", vp);
716 
717 		if (!cv_wait_sig_swap(&fnp->fn_wait_cv,
718 		    &fn_lock->flk_lock)) {
719 			error = EINTR;
720 			goto done;
721 		}
722 
723 		TRACE_1(TR_FAC_FIFO, TR_FIFOREAD_WAKE,
724 		    "fiforead awake: %p", vp);
725 
726 		/*
727 		 * check to make sure we are still in fast mode
728 		 */
729 		if (!(fnp->fn_flag & FIFOFAST))
730 			goto stream_mode;
731 	}
732 
733 	ASSERT(fnp->fn_mp != NULL);
734 
735 	/* For pipes copy should not bypass cache */
736 	uiop->uio_extflg |= UIO_COPY_CACHED;
737 
738 	do {
739 		int bpsize = MBLKL(fnp->fn_mp);
740 		int uiosize = MIN(bpsize, uiop->uio_resid);
741 
742 		error = uiomove(fnp->fn_mp->b_rptr, uiosize, UIO_READ, uiop);
743 		if (error != 0)
744 			break;
745 
746 		fnp->fn_count -= uiosize;
747 
748 		if (bpsize <= uiosize) {
749 			bp = fnp->fn_mp;
750 			fnp->fn_mp = fnp->fn_mp->b_cont;
751 			freeb(bp);
752 
753 			if (uiop->uio_resid == 0)
754 				break;
755 
756 			while (fnp->fn_mp == NULL && fn_dest->fn_wwaitcnt > 0) {
757 				ASSERT(fnp->fn_count == 0);
758 
759 				if (uiop->uio_fmode & (FNDELAY|FNONBLOCK))
760 					goto trywake;
761 
762 				/*
763 				 * We've consumed all available data but there
764 				 * are threads waiting to write more, let them
765 				 * proceed before bailing.
766 				 */
767 
768 				fnp->fn_flag |= FIFOWANTR;
769 				fifo_wakewriter(fn_dest, fn_lock);
770 
771 				if (!cv_wait_sig(&fnp->fn_wait_cv,
772 				    &fn_lock->flk_lock))
773 					goto trywake;
774 
775 				if (!(fnp->fn_flag & FIFOFAST))
776 					goto stream_mode;
777 			}
778 		} else {
779 			fnp->fn_mp->b_rptr += uiosize;
780 			ASSERT(uiop->uio_resid == 0);
781 		}
782 	} while (uiop->uio_resid != 0 && fnp->fn_mp != NULL);
783 
784 trywake:
785 	ASSERT(msgdsize(fnp->fn_mp) == fnp->fn_count);
786 
787 	/*
788 	 * wake up any blocked writers, processes
789 	 * sleeping on POLLWRNORM, or processes waiting for SIGPOLL
790 	 * Note: checking for fn_count < Fifohiwat emulates
791 	 * STREAMS functionality when low water mark is 0
792 	 */
793 	if (fn_dest->fn_flag & (FIFOWANTW | FIFOHIWATW) &&
794 	    fnp->fn_count < Fifohiwat) {
795 		fifo_wakewriter(fn_dest, fn_lock);
796 	}
797 	goto done;
798 
799 	/*
800 	 * FIFO is in streams mode.. let the stream head handle it
801 	 */
802 stream_mode:
803 
804 	mutex_exit(&fn_lock->flk_lock);
805 	TRACE_1(TR_FAC_FIFO,
806 	    TR_FIFOREAD_STREAM, "fifo_read stream_mode:%p", vp);
807 
808 	error = strread(vp, uiop, crp);
809 
810 	mutex_enter(&fn_lock->flk_lock);
811 
812 done:
813 	/*
814 	 * vnode update access time
815 	 */
816 	if (error == 0) {
817 		time_t now = gethrestime_sec();
818 
819 		if (fnp->fn_flag & ISPIPE)
820 			fnp->fn_dest->fn_atime = now;
821 		fnp->fn_atime = now;
822 	}
823 	TRACE_2(TR_FAC_FIFO, TR_FIFOREAD_OUT,
824 	    "fifo_read out:%p error %d", vp, error);
825 	mutex_exit(&fn_lock->flk_lock);
826 	return (error);
827 }
828 
829 /*
830  * send SIGPIPE and return EPIPE if ...
831  *   (1) broken pipe (essentially, reader is gone)
832  *   (2) FIFO is not open for reading
833  * return 0 if...
834  *   (1) no stream
835  *   (2) user write request is for 0 bytes and SW_SNDZERO is not set
836  *	Note: SW_SNDZERO can't be set in fast mode
837  * While the stream is flow controlled....
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
841  *	to read.
842  */
843 /*ARGSUSED*/
844 static int
845 fifo_write(vnode_t *vp, uio_t *uiop, int ioflag, cred_t *crp,
846     caller_context_t *ct)
847 {
848 	struct fifonode	*fnp, *fn_dest;
849 	fifolock_t	*fn_lock;
850 	struct stdata	*stp;
851 	int		error	= 0;
852 	int		write_size;
853 	int		size;
854 	int		fmode;
855 	mblk_t		*bp;
856 	boolean_t	hotread;
857 
858 	ASSERT(vp->v_stream);
859 	uiop->uio_loffset = 0;
860 	stp	= vp->v_stream;
861 
862 	/*
863 	 * remember original number of bytes requested. Used to determine if
864 	 * we actually have written anything at all
865 	 */
866 	write_size = uiop->uio_resid;
867 
868 	/*
869 	 * only send zero-length messages if SW_SNDZERO is set
870 	 * Note: we will be in streams mode if SW_SNDZERO is set
871 	 * XXX this streams interface should not be exposed
872 	 */
873 	if ((write_size == 0) && !(stp->sd_wput_opt & SW_SNDZERO))
874 		return (0);
875 
876 	fnp = VTOF(vp);
877 	fn_lock = fnp->fn_lock;
878 	fn_dest = fnp->fn_dest;
879 
880 	mutex_enter(&fn_lock->flk_lock);
881 
882 	TRACE_3(TR_FAC_FIFO, TR_FIFOWRITE_IN,
883 	    "fifo_write in:%p fnp %p size %d", vp, fnp, write_size);
884 
885 	/*
886 	 * oops, no readers, error
887 	 */
888 	if (fn_dest->fn_rcnt == 0 || fn_dest->fn_wcnt == 0) {
889 		goto epipe;
890 	}
891 
892 	/*
893 	 * if we are not in fast mode, let streams handle it
894 	 */
895 	if (!(fnp->fn_flag & FIFOFAST))
896 		goto stream_mode;
897 
898 	fmode = uiop->uio_fmode & (FNDELAY|FNONBLOCK);
899 
900 	/* For pipes copy should not bypass cache */
901 	uiop->uio_extflg |= UIO_COPY_CACHED;
902 
903 	do  {
904 		/*
905 		 * check to make sure we are not over high water mark
906 		 */
907 		while (fn_dest->fn_count >= Fifohiwat) {
908 			/*
909 			 * Indicate that we have gone over high
910 			 * water mark
911 			 */
912 			/*
913 			 * if non-blocking, return
914 			 * only happens first time through loop
915 			 */
916 			if (fmode) {
917 				fnp->fn_flag |= FIFOHIWATW;
918 				if (uiop->uio_resid == write_size) {
919 					mutex_exit(&fn_lock->flk_lock);
920 					if (fmode & FNDELAY)
921 						return (0);
922 					else
923 						return (EAGAIN);
924 				}
925 				goto done;
926 			}
927 
928 			/*
929 			 * wait for things to drain
930 			 */
931 			fnp->fn_flag |= FIFOWANTW;
932 			fnp->fn_wwaitcnt++;
933 			TRACE_1(TR_FAC_FIFO, TR_FIFOWRITE_WAIT,
934 			    "fifo_write wait: %p", vp);
935 			if (!cv_wait_sig_swap(&fnp->fn_wait_cv,
936 			    &fn_lock->flk_lock)) {
937 				error = EINTR;
938 				fnp->fn_wwaitcnt--;
939 				fifo_wakereader(fn_dest, fn_lock);
940 				goto done;
941 			}
942 			fnp->fn_wwaitcnt--;
943 
944 			TRACE_1(TR_FAC_FIFO, TR_FIFOWRITE_WAKE,
945 			    "fifo_write wake: %p", vp);
946 
947 			/*
948 			 * check to make sure we're still in fast mode
949 			 */
950 			if (!(fnp->fn_flag & FIFOFAST))
951 				goto stream_mode;
952 
953 			/*
954 			 * make sure readers didn't go away
955 			 */
956 			if (fn_dest->fn_rcnt == 0 || fn_dest->fn_wcnt == 0) {
957 				goto epipe;
958 			}
959 		}
960 		/*
961 		 * If the write will put us over the high water mark,
962 		 * then we must break the message up into PIPE_BUF
963 		 * chunks to stay compliant with STREAMS
964 		 */
965 		if (uiop->uio_resid + fn_dest->fn_count > Fifohiwat)
966 			size = MIN(uiop->uio_resid, PIPE_BUF);
967 		else
968 			size = uiop->uio_resid;
969 
970 		/*
971 		 * We don't need to hold flk_lock across the allocb() and
972 		 * uiomove().  However, on a multiprocessor machine where both
973 		 * the reader and writer thread are on cpu's, we must be
974 		 * careful to only drop the lock if there's data to be read.
975 		 * This forces threads entering fifo_read() to spin or block
976 		 * on flk_lock, rather than acquiring flk_lock only to
977 		 * discover there's no data to read and being forced to go
978 		 * back to sleep, only to be woken up microseconds later by
979 		 * this writer thread.
980 		 */
981 		hotread = fn_dest->fn_count > 0;
982 		if (hotread) {
983 			if (!fifo_stayfast_enter(fnp))
984 				goto stream_mode;
985 			mutex_exit(&fn_lock->flk_lock);
986 		}
987 
988 		ASSERT(size != 0);
989 		/*
990 		 * Align the mblk with the user data so that
991 		 * copying in the data can take advantage of
992 		 * the double word alignment
993 		 */
994 		if ((bp = allocb(size + 8, BPRI_MED)) == NULL) {
995 			if (!hotread)
996 				mutex_exit(&fn_lock->flk_lock);
997 
998 			error = strwaitbuf(size, BPRI_MED);
999 
1000 			mutex_enter(&fn_lock->flk_lock);
1001 
1002 			if (hotread) {
1003 				/*
1004 				 * As we dropped the mutex for a moment, we
1005 				 * need to wake up any thread waiting to be
1006 				 * allowed to go from fast mode to stream mode.
1007 				 */
1008 				fifo_stayfast_exit(fnp);
1009 			}
1010 			if (error != 0) {
1011 				goto done;
1012 			}
1013 			/*
1014 			 * check to make sure we're still in fast mode
1015 			 */
1016 			if (!(fnp->fn_flag & FIFOFAST))
1017 				goto stream_mode;
1018 
1019 			/*
1020 			 * make sure readers didn't go away
1021 			 */
1022 			if (fn_dest->fn_rcnt == 0 || fn_dest->fn_wcnt == 0) {
1023 				goto epipe;
1024 			}
1025 			/*
1026 			 * some other thread could have gotten in
1027 			 * need to go back and check hi water mark
1028 			 */
1029 			continue;
1030 		}
1031 		bp->b_rptr += ((uintptr_t)uiop->uio_iov->iov_base & 0x7);
1032 		bp->b_wptr = bp->b_rptr + size;
1033 		error = uiomove((caddr_t)bp->b_rptr, size, UIO_WRITE, uiop);
1034 		if (hotread) {
1035 			mutex_enter(&fn_lock->flk_lock);
1036 			/*
1037 			 * As we dropped the mutex for a moment, we need to:
1038 			 * - wake up any thread waiting to be allowed to go
1039 			 *   from fast mode to stream mode,
1040 			 * - make sure readers didn't go away.
1041 			 */
1042 			fifo_stayfast_exit(fnp);
1043 			if (fn_dest->fn_rcnt == 0 || fn_dest->fn_wcnt == 0) {
1044 				freeb(bp);
1045 				goto epipe;
1046 			}
1047 		}
1048 
1049 		if (error != 0) {
1050 			freeb(bp);
1051 			goto done;
1052 		}
1053 
1054 		fn_dest->fn_count += size;
1055 		if (fn_dest->fn_mp != NULL) {
1056 			fn_dest->fn_tail->b_cont = bp;
1057 			fn_dest->fn_tail = bp;
1058 		} else {
1059 			fn_dest->fn_mp = fn_dest->fn_tail = bp;
1060 			/*
1061 			 * This is the first bit of data; wake up any sleeping
1062 			 * readers, processes blocked in poll, and those
1063 			 * expecting a SIGPOLL.
1064 			 */
1065 			fifo_wakereader(fn_dest, fn_lock);
1066 		}
1067 	} while (uiop->uio_resid != 0);
1068 
1069 	goto done;
1070 
1071 stream_mode:
1072 	/*
1073 	 * streams mode
1074 	 *  let the stream head handle the write
1075 	 */
1076 	ASSERT(MUTEX_HELD(&fn_lock->flk_lock));
1077 
1078 	mutex_exit(&fn_lock->flk_lock);
1079 	TRACE_1(TR_FAC_FIFO,
1080 	    TR_FIFOWRITE_STREAM, "fifo_write stream_mode:%p", vp);
1081 
1082 	error = strwrite(vp, uiop, crp);
1083 
1084 	mutex_enter(&fn_lock->flk_lock);
1085 
1086 done:
1087 	/*
1088 	 * update vnode modification and change times
1089 	 * make sure there were no errors and some data was transferred
1090 	 */
1091 	if (error == 0 && write_size != uiop->uio_resid) {
1092 		time_t now = gethrestime_sec();
1093 
1094 		if (fnp->fn_flag & ISPIPE) {
1095 			fn_dest->fn_mtime = fn_dest->fn_ctime = now;
1096 		}
1097 		fnp->fn_mtime = fnp->fn_ctime = now;
1098 	} else if (fn_dest->fn_rcnt == 0 || fn_dest->fn_wcnt == 0) {
1099 		goto epipe;
1100 	}
1101 	TRACE_3(TR_FAC_FIFO, TR_FIFOWRITE_OUT,
1102 	    "fifo_write out: vp %p error %d fnp %p", vp, error, fnp);
1103 	mutex_exit(&fn_lock->flk_lock);
1104 	return (error);
1105 epipe:
1106 	error = EPIPE;
1107 	TRACE_3(TR_FAC_FIFO, TR_FIFOWRITE_OUT,
1108 	    "fifo_write out: vp %p error %d fnp %p", vp, error, fnp);
1109 	mutex_exit(&fn_lock->flk_lock);
1110 	tsignal(curthread, SIGPIPE);
1111 	return (error);
1112 }
1113 
1114 /*ARGSUSED6*/
1115 static int
1116 fifo_ioctl(vnode_t *vp, int cmd, intptr_t arg, int mode, cred_t *cr,
1117     int *rvalp, caller_context_t *ct)
1118 {
1119 	/*
1120 	 * Just a quick check
1121 	 * Once we go to streams mode we don't ever revert back
1122 	 * So we do this quick check so as not to incur the overhead
1123 	 * associated with acquiring the lock
1124 	 */
1125 	return ((VTOF(vp)->fn_flag & FIFOFAST) ?
1126 	    fifo_fastioctl(vp, cmd, arg, mode, cr, rvalp) :
1127 	    fifo_strioctl(vp, cmd, arg, mode, cr, rvalp));
1128 }
1129 
1130 static inline int
1131 fifo_ioctl_getpeercred(fifonode_t *fnp, intptr_t arg, int mode)
1132 {
1133 	k_peercred_t *kp = (k_peercred_t *)arg;
1134 
1135 	if (mode == FKIOCTL && fnp->fn_pcredp != NULL) {
1136 		crhold(fnp->fn_pcredp);
1137 		kp->pc_cr = fnp->fn_pcredp;
1138 		kp->pc_cpid = fnp->fn_cpid;
1139 		return (0);
1140 	} else {
1141 		return (ENOTSUP);
1142 	}
1143 }
1144 
1145 static int
1146 fifo_fastioctl(vnode_t *vp, int cmd, intptr_t arg, int mode, cred_t *cr,
1147     int *rvalp)
1148 {
1149 	fifonode_t	*fnp		= VTOF(vp);
1150 	fifonode_t	*fn_dest;
1151 	int		error		= 0;
1152 	fifolock_t	*fn_lock	= fnp->fn_lock;
1153 	int		cnt;
1154 
1155 	/*
1156 	 * tty operations not allowed
1157 	 */
1158 	if (((cmd & IOCTYPE) == LDIOC) ||
1159 	    ((cmd & IOCTYPE) == tIOC) ||
1160 	    ((cmd & IOCTYPE) == TIOC)) {
1161 		return (EINVAL);
1162 	}
1163 
1164 	mutex_enter(&fn_lock->flk_lock);
1165 
1166 	if (!(fnp->fn_flag & FIFOFAST)) {
1167 		goto stream_mode;
1168 	}
1169 
1170 	switch (cmd) {
1171 
1172 	/*
1173 	 * Things we can't handle
1174 	 * These will switch us to streams mode.
1175 	 */
1176 	default:
1177 	case I_STR:
1178 	case I_SRDOPT:
1179 	case I_PUSH:
1180 	case I_FDINSERT:
1181 	case I_SENDFD:
1182 	case I_RECVFD:
1183 	case I_E_RECVFD:
1184 	case I_ATMARK:
1185 	case I_CKBAND:
1186 	case I_GETBAND:
1187 	case I_SWROPT:
1188 		goto turn_fastoff;
1189 
1190 	/*
1191 	 * Things that don't do damage
1192 	 * These things don't adjust the state of the
1193 	 * stream head (i_setcltime does, but we don't care)
1194 	 */
1195 	case I_FIND:
1196 	case I_GETSIG:
1197 	case FIONBIO:
1198 	case FIOASYNC:
1199 	case I_GRDOPT:	/* probably should not get this, but no harm */
1200 	case I_GWROPT:
1201 	case I_LIST:
1202 	case I_SETCLTIME:
1203 	case I_GETCLTIME:
1204 		mutex_exit(&fn_lock->flk_lock);
1205 		return (strioctl(vp, cmd, arg, mode, U_TO_K, cr, rvalp));
1206 
1207 	case I_CANPUT:
1208 		/*
1209 		 * We can only handle normal band canputs.
1210 		 * XXX : We could just always go to stream mode; after all
1211 		 * canput is a streams semantics type thing
1212 		 */
1213 		if (arg != 0) {
1214 			goto turn_fastoff;
1215 		}
1216 		*rvalp = (fnp->fn_dest->fn_count < Fifohiwat) ? 1 : 0;
1217 		mutex_exit(&fn_lock->flk_lock);
1218 		return (0);
1219 
1220 	case I_NREAD:
1221 		/*
1222 		 * This may seem a bit silly for non-streams semantics,
1223 		 * (After all, if they really want a message, they'll
1224 		 * probably use getmsg() anyway). but it doesn't hurt
1225 		 */
1226 		error = copyout((caddr_t)&fnp->fn_count, (caddr_t)arg,
1227 		    sizeof (cnt));
1228 		if (error == 0) {
1229 			*rvalp = (fnp->fn_count == 0) ? 0 : 1;
1230 		}
1231 		break;
1232 
1233 	case FIORDCHK:
1234 		*rvalp = fnp->fn_count;
1235 		break;
1236 
1237 	case I_PEEK:
1238 	{
1239 		STRUCT_DECL(strpeek, strpeek);
1240 		struct uio	uio;
1241 		struct iovec	iov;
1242 		int		count;
1243 		mblk_t		*bp;
1244 		int		len;
1245 
1246 		STRUCT_INIT(strpeek, mode);
1247 
1248 		if (fnp->fn_count == 0) {
1249 			*rvalp = 0;
1250 			break;
1251 		}
1252 
1253 		error = copyin((caddr_t)arg, STRUCT_BUF(strpeek),
1254 		    STRUCT_SIZE(strpeek));
1255 		if (error)
1256 			break;
1257 
1258 		/*
1259 		 * can't have any high priority message when in fast mode
1260 		 */
1261 		if (STRUCT_FGET(strpeek, flags) & RS_HIPRI) {
1262 			*rvalp = 0;
1263 			break;
1264 		}
1265 
1266 		len = STRUCT_FGET(strpeek, databuf.maxlen);
1267 		if (len <= 0) {
1268 			STRUCT_FSET(strpeek, databuf.len, len);
1269 		} else {
1270 			iov.iov_base = STRUCT_FGETP(strpeek, databuf.buf);
1271 			iov.iov_len = len;
1272 			uio.uio_iov = &iov;
1273 			uio.uio_iovcnt = 1;
1274 			uio.uio_loffset = 0;
1275 			uio.uio_segflg = UIO_USERSPACE;
1276 			uio.uio_fmode = 0;
1277 			/* For pipes copy should not bypass cache */
1278 			uio.uio_extflg = UIO_COPY_CACHED;
1279 			uio.uio_resid = iov.iov_len;
1280 			count = fnp->fn_count;
1281 			bp = fnp->fn_mp;
1282 			while (count > 0 && uio.uio_resid) {
1283 				cnt = MIN(uio.uio_resid, MBLKL(bp));
1284 				if ((error = uiomove((char *)bp->b_rptr, cnt,
1285 				    UIO_READ, &uio)) != 0) {
1286 					break;
1287 				}
1288 				count -= cnt;
1289 				bp = bp->b_cont;
1290 			}
1291 			STRUCT_FSET(strpeek, databuf.len, len - uio.uio_resid);
1292 		}
1293 		STRUCT_FSET(strpeek, flags, 0);
1294 		STRUCT_FSET(strpeek, ctlbuf.len, -1);
1295 
1296 		error = copyout(STRUCT_BUF(strpeek), (caddr_t)arg,
1297 		    STRUCT_SIZE(strpeek));
1298 		if (error == 0 && len >= 0)
1299 			*rvalp = 1;
1300 		break;
1301 	}
1302 
1303 	case FIONREAD:
1304 		/*
1305 		 * let user know total number of bytes in message queue
1306 		 */
1307 		error = copyout((caddr_t)&fnp->fn_count, (caddr_t)arg,
1308 		    sizeof (fnp->fn_count));
1309 		if (error == 0)
1310 			*rvalp = 0;
1311 		break;
1312 
1313 	case I_SETSIG:
1314 		/*
1315 		 * let streams set up the signal masking for us
1316 		 * we just check to see if it's set
1317 		 * XXX : this interface should not be visible
1318 		 *  i.e. STREAM's framework is exposed.
1319 		 */
1320 		error = strioctl(vp, cmd, arg, mode, U_TO_K, cr, rvalp);
1321 		if (vp->v_stream->sd_sigflags & (S_INPUT|S_RDNORM|S_WRNORM))
1322 			fnp->fn_flag |= FIFOSETSIG;
1323 		else
1324 			fnp->fn_flag &= ~FIFOSETSIG;
1325 		break;
1326 
1327 	case I_FLUSH:
1328 		/*
1329 		 * flush them message queues
1330 		 */
1331 		if (arg & ~FLUSHRW) {
1332 			error = EINVAL;
1333 			break;
1334 		}
1335 		if (arg & FLUSHR) {
1336 			fifo_fastflush(fnp);
1337 		}
1338 		fn_dest = fnp->fn_dest;
1339 		if ((arg & FLUSHW)) {
1340 			fifo_fastflush(fn_dest);
1341 		}
1342 		/*
1343 		 * wake up any sleeping readers or writers
1344 		 * (waking readers probably doesn't make sense, but it
1345 		 *  doesn't hurt; i.e. we just got rid of all the data
1346 		 *  what's to read ?)
1347 		 */
1348 		if (fn_dest->fn_flag & (FIFOWANTW | FIFOWANTR)) {
1349 			fn_dest->fn_flag &= ~(FIFOWANTW | FIFOWANTR);
1350 			cv_broadcast(&fn_dest->fn_wait_cv);
1351 		}
1352 		*rvalp = 0;
1353 		break;
1354 
1355 	/*
1356 	 * Since no band data can ever get on a fifo in fast mode
1357 	 * just return 0.
1358 	 */
1359 	case I_FLUSHBAND:
1360 		error = 0;
1361 		*rvalp = 0;
1362 		break;
1363 
1364 	case _I_GETPEERCRED:
1365 		error = fifo_ioctl_getpeercred(fnp, arg, mode);
1366 		break;
1367 
1368 	/*
1369 	 * invalid calls for stream head or fifos
1370 	 */
1371 
1372 	case I_POP:		/* shouldn't happen */
1373 	case I_LOOK:
1374 	case I_LINK:
1375 	case I_PLINK:
1376 	case I_UNLINK:
1377 	case I_PUNLINK:
1378 
1379 	/*
1380 	 * more invalid tty type of ioctls
1381 	 */
1382 
1383 	case SRIOCSREDIR:
1384 	case SRIOCISREDIR:
1385 		error = EINVAL;
1386 		break;
1387 
1388 	}
1389 	mutex_exit(&fn_lock->flk_lock);
1390 	return (error);
1391 
1392 turn_fastoff:
1393 	fifo_fastoff(fnp);
1394 
1395 stream_mode:
1396 	/*
1397 	 * streams mode
1398 	 */
1399 	mutex_exit(&fn_lock->flk_lock);
1400 	return (fifo_strioctl(vp, cmd, arg, mode, cr, rvalp));
1401 
1402 }
1403 
1404 /*
1405  * FIFO is in STREAMS mode; STREAMS framework does most of the work.
1406  */
1407 static int
1408 fifo_strioctl(vnode_t *vp, int cmd, intptr_t arg, int mode, cred_t *cr,
1409     int *rvalp)
1410 {
1411 	fifonode_t	*fnp = VTOF(vp);
1412 	int		error;
1413 	fifolock_t	*fn_lock;
1414 
1415 	if (cmd == _I_GETPEERCRED)
1416 		return (fifo_ioctl_getpeercred(fnp, arg, mode));
1417 
1418 	error = strioctl(vp, cmd, arg, mode, U_TO_K, cr, rvalp);
1419 
1420 	switch (cmd) {
1421 	/*
1422 	 * The FIFOSEND flag is set to inform other processes that a file
1423 	 * descriptor is pending at the stream head of this pipe.
1424 	 * The flag is cleared and the sending process is awoken when
1425 	 * this process has completed receiving the file descriptor.
1426 	 * XXX This could become out of sync if the process does I_SENDFDs
1427 	 * and opens on connld attached to the same pipe.
1428 	 */
1429 	case I_RECVFD:
1430 	case I_E_RECVFD:
1431 		if (error == 0) {
1432 			fn_lock = fnp->fn_lock;
1433 			mutex_enter(&fn_lock->flk_lock);
1434 			if (fnp->fn_flag & FIFOSEND) {
1435 				fnp->fn_flag &= ~FIFOSEND;
1436 				cv_broadcast(&fnp->fn_dest->fn_wait_cv);
1437 			}
1438 			mutex_exit(&fn_lock->flk_lock);
1439 		}
1440 		break;
1441 	default:
1442 		break;
1443 	}
1444 
1445 	return (error);
1446 }
1447 
1448 /*
1449  * If shadowing a vnode (FIFOs), apply the VOP_GETATTR to the shadowed
1450  * vnode to Obtain the node information. If not shadowing (pipes), obtain
1451  * the node information from the credentials structure.
1452  */
1453 int
1454 fifo_getattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *crp,
1455     caller_context_t *ct)
1456 {
1457 	int		error		= 0;
1458 	fifonode_t	*fnp		= VTOF(vp);
1459 	queue_t		*qp;
1460 	qband_t		*bandp;
1461 	fifolock_t	*fn_lock	= fnp->fn_lock;
1462 
1463 	if (fnp->fn_realvp) {
1464 		/*
1465 		 * for FIFOs or mounted pipes
1466 		 */
1467 		if (error = VOP_GETATTR(fnp->fn_realvp, vap, flags, crp, ct))
1468 			return (error);
1469 		mutex_enter(&fn_lock->flk_lock);
1470 		/* set current times from fnode, even if older than vnode */
1471 		vap->va_atime.tv_sec = fnp->fn_atime;
1472 		vap->va_atime.tv_nsec = 0;
1473 		vap->va_mtime.tv_sec = fnp->fn_mtime;
1474 		vap->va_mtime.tv_nsec = 0;
1475 		vap->va_ctime.tv_sec = fnp->fn_ctime;
1476 		vap->va_ctime.tv_nsec = 0;
1477 	} else {
1478 		/*
1479 		 * for non-attached/ordinary pipes
1480 		 */
1481 		vap->va_mode = 0;
1482 		mutex_enter(&fn_lock->flk_lock);
1483 		vap->va_atime.tv_sec = fnp->fn_atime;
1484 		vap->va_atime.tv_nsec = 0;
1485 		vap->va_mtime.tv_sec = fnp->fn_mtime;
1486 		vap->va_mtime.tv_nsec = 0;
1487 		vap->va_ctime.tv_sec = fnp->fn_ctime;
1488 		vap->va_ctime.tv_nsec = 0;
1489 		vap->va_uid = crgetuid(crp);
1490 		vap->va_gid = crgetgid(crp);
1491 		vap->va_nlink = 0;
1492 		vap->va_fsid = fifodev;
1493 		vap->va_nodeid = (ino64_t)fnp->fn_ino;
1494 		vap->va_rdev = 0;
1495 	}
1496 	vap->va_type = VFIFO;
1497 	vap->va_blksize = PIPE_BUF;
1498 	/*
1499 	 * Size is number of un-read bytes at the stream head and
1500 	 * nblocks is the unread bytes expressed in blocks.
1501 	 */
1502 	if (vp->v_stream && (fnp->fn_flag & FIFOISOPEN)) {
1503 		if ((fnp->fn_flag & FIFOFAST)) {
1504 			vap->va_size = (u_offset_t)fnp->fn_count;
1505 		} else {
1506 			qp = RD((strvp2wq(vp)));
1507 			vap->va_size = (u_offset_t)qp->q_count;
1508 			if (qp->q_nband != 0) {
1509 				mutex_enter(QLOCK(qp));
1510 				for (bandp = qp->q_bandp; bandp;
1511 				    bandp = bandp->qb_next)
1512 					vap->va_size += bandp->qb_count;
1513 				mutex_exit(QLOCK(qp));
1514 			}
1515 		}
1516 		vap->va_nblocks = (fsblkcnt64_t)btod(vap->va_size);
1517 	} else {
1518 		vap->va_size = (u_offset_t)0;
1519 		vap->va_nblocks = (fsblkcnt64_t)0;
1520 	}
1521 	mutex_exit(&fn_lock->flk_lock);
1522 	vap->va_seq = 0;
1523 	return (0);
1524 }
1525 
1526 /*
1527  * If shadowing a vnode, apply the VOP_SETATTR to it, and to the fnode.
1528  * Otherwise, set the time and return 0.
1529  */
1530 int
1531 fifo_setattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *crp,
1532     caller_context_t *ctp)
1533 {
1534 	fifonode_t	*fnp	= VTOF(vp);
1535 	int		error	= 0;
1536 	fifolock_t	*fn_lock;
1537 
1538 	if (fnp->fn_realvp)
1539 		error = VOP_SETATTR(fnp->fn_realvp, vap, flags, crp, ctp);
1540 	if (error == 0) {
1541 		fn_lock = fnp->fn_lock;
1542 		mutex_enter(&fn_lock->flk_lock);
1543 		if (vap->va_mask & AT_ATIME)
1544 			fnp->fn_atime = vap->va_atime.tv_sec;
1545 		if (vap->va_mask & AT_MTIME)
1546 			fnp->fn_mtime = vap->va_mtime.tv_sec;
1547 		fnp->fn_ctime = gethrestime_sec();
1548 		mutex_exit(&fn_lock->flk_lock);
1549 	}
1550 	return (error);
1551 }
1552 
1553 /*
1554  * If shadowing a vnode, apply VOP_ACCESS to it.
1555  * Otherwise, return 0 (allow all access).
1556  */
1557 int
1558 fifo_access(vnode_t *vp, int mode, int flags, cred_t *crp, caller_context_t *ct)
1559 {
1560 	if (VTOF(vp)->fn_realvp)
1561 		return (VOP_ACCESS(VTOF(vp)->fn_realvp, mode, flags, crp, ct));
1562 	else
1563 		return (0);
1564 }
1565 
1566 /*
1567  * This can be called if creat or an open with O_CREAT is done on the root
1568  * of a lofs mount where the mounted entity is a fifo.
1569  */
1570 /*ARGSUSED*/
1571 static int
1572 fifo_create(struct vnode *dvp, char *name, vattr_t *vap, enum vcexcl excl,
1573     int mode, struct vnode **vpp, struct cred *cr, int flag,
1574     caller_context_t *ct, vsecattr_t *vsecp)
1575 {
1576 	int error;
1577 
1578 	ASSERT(dvp && (dvp->v_flag & VROOT) && *name == '\0');
1579 	if (excl == NONEXCL) {
1580 		if (mode && (error = fifo_access(dvp, mode, 0, cr, ct)))
1581 			return (error);
1582 		VN_HOLD(dvp);
1583 		return (0);
1584 	}
1585 	return (EEXIST);
1586 }
1587 
1588 /*
1589  * If shadowing a vnode, apply the VOP_FSYNC to it.
1590  * Otherwise, return 0.
1591  */
1592 int
1593 fifo_fsync(vnode_t *vp, int syncflag, cred_t *crp, caller_context_t *ct)
1594 {
1595 	fifonode_t	*fnp	= VTOF(vp);
1596 	vattr_t		va;
1597 
1598 	if (fnp->fn_realvp == NULL)
1599 		return (0);
1600 
1601 	bzero((caddr_t)&va, sizeof (va));
1602 	va.va_mask = AT_MTIME | AT_ATIME;
1603 	if (VOP_GETATTR(fnp->fn_realvp, &va, 0, crp, ct) == 0) {
1604 		va.va_mask = 0;
1605 		if (fnp->fn_mtime > va.va_mtime.tv_sec) {
1606 			va.va_mtime.tv_sec = fnp->fn_mtime;
1607 			va.va_mask = AT_MTIME;
1608 		}
1609 		if (fnp->fn_atime > va.va_atime.tv_sec) {
1610 			va.va_atime.tv_sec = fnp->fn_atime;
1611 			va.va_mask |= AT_ATIME;
1612 		}
1613 		if (va.va_mask != 0)
1614 			(void) VOP_SETATTR(fnp->fn_realvp, &va, 0, crp, ct);
1615 	}
1616 	return (VOP_FSYNC(fnp->fn_realvp, syncflag, crp, ct));
1617 }
1618 
1619 /*
1620  * Called when the upper level no longer holds references to the
1621  * vnode. Sync the file system and free the fifonode.
1622  */
1623 void
1624 fifo_inactive(vnode_t *vp, cred_t *crp, caller_context_t *ct)
1625 {
1626 	fifonode_t	*fnp;
1627 	fifolock_t	*fn_lock;
1628 
1629 	mutex_enter(&ftable_lock);
1630 	mutex_enter(&vp->v_lock);
1631 	ASSERT(vp->v_count >= 1);
1632 	VN_RELE_LOCKED(vp);
1633 	if (vp->v_count != 0) {
1634 		/*
1635 		 * Somebody accessed the fifo before we got a chance to
1636 		 * remove it.  They will remove it when they do a vn_rele.
1637 		 */
1638 		mutex_exit(&vp->v_lock);
1639 		mutex_exit(&ftable_lock);
1640 		return;
1641 	}
1642 	mutex_exit(&vp->v_lock);
1643 
1644 	fnp = VTOF(vp);
1645 
1646 	/*
1647 	 * remove fifo from fifo list so that no other process
1648 	 * can grab it.
1649 	 * Drop the reference count on the fifo node's
1650 	 * underlying vfs.
1651 	 */
1652 	if (fnp->fn_realvp) {
1653 		(void) fiforemove(fnp);
1654 		mutex_exit(&ftable_lock);
1655 		(void) fifo_fsync(vp, FSYNC, crp, ct);
1656 		VN_RELE(fnp->fn_realvp);
1657 		VFS_RELE(vp->v_vfsp);
1658 		vp->v_vfsp = NULL;
1659 	} else
1660 		mutex_exit(&ftable_lock);
1661 
1662 	fn_lock = fnp->fn_lock;
1663 
1664 	mutex_enter(&fn_lock->flk_lock);
1665 	ASSERT(vp->v_stream == NULL);
1666 	ASSERT(vp->v_count == 0);
1667 	/*
1668 	 * if this is last reference to the lock, then we can
1669 	 * free everything up.
1670 	 */
1671 	if (--fn_lock->flk_ref == 0) {
1672 		mutex_exit(&fn_lock->flk_lock);
1673 		ASSERT(fnp->fn_open == 0);
1674 		ASSERT(fnp->fn_dest->fn_open == 0);
1675 		if (fnp->fn_mp) {
1676 			freemsg(fnp->fn_mp);
1677 			fnp->fn_mp = NULL;
1678 			fnp->fn_count = 0;
1679 		}
1680 		if (fnp->fn_pcredp != NULL) {
1681 			crfree(fnp->fn_pcredp);
1682 			fnp->fn_pcredp = NULL;
1683 		}
1684 		if (fnp->fn_flag & ISPIPE) {
1685 			fifonode_t *fn_dest = fnp->fn_dest;
1686 
1687 			vp = FTOV(fn_dest);
1688 			if (fn_dest->fn_mp) {
1689 				freemsg(fn_dest->fn_mp);
1690 				fn_dest->fn_mp = NULL;
1691 				fn_dest->fn_count = 0;
1692 			}
1693 			if (fn_dest->fn_pcredp != NULL) {
1694 				crfree(fn_dest->fn_pcredp);
1695 				fn_dest->fn_pcredp = NULL;
1696 			}
1697 			kmem_cache_free(pipe_cache, (fifodata_t *)fn_lock);
1698 		} else
1699 			kmem_cache_free(fnode_cache, (fifodata_t *)fn_lock);
1700 	} else {
1701 		mutex_exit(&fn_lock->flk_lock);
1702 	}
1703 }
1704 
1705 /*
1706  * If shadowing a vnode, apply the VOP_FID to it.
1707  * Otherwise, return EINVAL.
1708  */
1709 int
1710 fifo_fid(vnode_t *vp, fid_t *fidfnp, caller_context_t *ct)
1711 {
1712 	if (VTOF(vp)->fn_realvp)
1713 		return (VOP_FID(VTOF(vp)->fn_realvp, fidfnp, ct));
1714 	else
1715 		return (EINVAL);
1716 }
1717 
1718 /*
1719  * Lock a fifonode.
1720  */
1721 /* ARGSUSED */
1722 int
1723 fifo_rwlock(vnode_t *vp, int write_lock, caller_context_t *ctp)
1724 {
1725 	return (-1);
1726 }
1727 
1728 /*
1729  * Unlock a fifonode.
1730  */
1731 /* ARGSUSED */
1732 void
1733 fifo_rwunlock(vnode_t *vp, int write_lock, caller_context_t *ctp)
1734 {
1735 }
1736 
1737 /*
1738  * Return error since seeks are not allowed on pipes.
1739  */
1740 /*ARGSUSED*/
1741 int
1742 fifo_seek(vnode_t *vp, offset_t ooff, offset_t *noffp, caller_context_t *ct)
1743 {
1744 	return (ESPIPE);
1745 }
1746 
1747 /*
1748  * If there is a realvp associated with vp, return it.
1749  */
1750 int
1751 fifo_realvp(vnode_t *vp, vnode_t **vpp, caller_context_t *ct)
1752 {
1753 	vnode_t *rvp;
1754 
1755 	if ((rvp = VTOF(vp)->fn_realvp) != NULL) {
1756 		vp = rvp;
1757 		if (VOP_REALVP(vp, &rvp, ct) == 0)
1758 			vp = rvp;
1759 	}
1760 
1761 	*vpp = vp;
1762 	return (0);
1763 }
1764 
1765 /*
1766  * Poll for interesting events on a stream pipe
1767  */
1768 /* ARGSUSED */
1769 int
1770 fifo_poll(vnode_t *vp, short events, int anyyet, short *reventsp,
1771     pollhead_t **phpp, caller_context_t *ct)
1772 {
1773 	fifonode_t	*fnp, *fn_dest;
1774 	fifolock_t	*fn_lock;
1775 	int		retevents;
1776 	struct stdata	*stp;
1777 
1778 	ASSERT(vp->v_stream != NULL);
1779 
1780 	stp = vp->v_stream;
1781 	retevents	= 0;
1782 	fnp		= VTOF(vp);
1783 	fn_dest		= fnp->fn_dest;
1784 	fn_lock		= fnp->fn_lock;
1785 
1786 	if (polllock(&stp->sd_pollist, &fn_lock->flk_lock) != 0) {
1787 		*reventsp = POLLNVAL;
1788 		return (0);
1789 	}
1790 
1791 	/*
1792 	 * see if FIFO/pipe open
1793 	 */
1794 	if ((fnp->fn_flag & FIFOISOPEN) == 0) {
1795 		if (((events & (POLLIN | POLLRDNORM | POLLPRI | POLLRDBAND)) &&
1796 		    fnp->fn_rcnt == 0) ||
1797 		    ((events & (POLLWRNORM | POLLWRBAND)) &&
1798 		    fnp->fn_wcnt == 0)) {
1799 			mutex_exit(&fnp->fn_lock->flk_lock);
1800 			*reventsp = POLLERR;
1801 			return (0);
1802 		}
1803 	}
1804 
1805 	/*
1806 	 * if not in fast mode, let the stream head take care of it
1807 	 */
1808 	if (!(fnp->fn_flag & FIFOFAST)) {
1809 		mutex_exit(&fnp->fn_lock->flk_lock);
1810 		goto stream_mode;
1811 	}
1812 
1813 	/*
1814 	 * If this is a pipe.. check to see if the other
1815 	 * end is gone.  If we are a fifo, check to see
1816 	 * if write end is gone.
1817 	 */
1818 
1819 	if ((fnp->fn_flag & ISPIPE) && (fn_dest->fn_open == 0)) {
1820 		retevents = POLLHUP;
1821 	} else if ((fnp->fn_flag & (FIFOCLOSE | ISPIPE)) == FIFOCLOSE &&
1822 	    (fn_dest->fn_wcnt == 0)) {
1823 		/*
1824 		 * no writer at other end.
1825 		 * it was closed (versus yet to be opened)
1826 		 */
1827 			retevents = POLLHUP;
1828 	} else if (events & (POLLWRNORM | POLLWRBAND)) {
1829 		if (events & POLLWRNORM) {
1830 			if (fn_dest->fn_count < Fifohiwat)
1831 				retevents = POLLWRNORM;
1832 			else
1833 				fnp->fn_flag |= FIFOHIWATW;
1834 		}
1835 		/*
1836 		 * This is always true for fast pipes
1837 		 * (Note: will go to STREAMS mode if band data is written)
1838 		 */
1839 		if (events & POLLWRBAND)
1840 			retevents |= POLLWRBAND;
1841 	}
1842 	if (events & (POLLIN | POLLRDNORM)) {
1843 		if (fnp->fn_count)
1844 			retevents |= (events & (POLLIN | POLLRDNORM));
1845 	}
1846 
1847 	/*
1848 	 * if we happened to get something and we're not edge-triggered, return
1849 	 */
1850 	if ((*reventsp = (short)retevents) != 0 && !(events & POLLET)) {
1851 		mutex_exit(&fnp->fn_lock->flk_lock);
1852 		return (0);
1853 	}
1854 
1855 	/*
1856 	 * If poll() has not found any events yet or we're edge-triggered, set
1857 	 * up event cell to wake up the poll if a requested event occurs on this
1858 	 * pipe/fifo.
1859 	 */
1860 	if (!anyyet) {
1861 		if (events & POLLWRNORM)
1862 			fnp->fn_flag |= FIFOPOLLW;
1863 		if (events & (POLLIN | POLLRDNORM))
1864 			fnp->fn_flag |= FIFOPOLLR;
1865 		if (events & POLLRDBAND)
1866 			fnp->fn_flag |= FIFOPOLLRBAND;
1867 		/*
1868 		 * XXX Don't like exposing this from streams
1869 		 */
1870 		*phpp = &stp->sd_pollist;
1871 	}
1872 	mutex_exit(&fnp->fn_lock->flk_lock);
1873 	return (0);
1874 stream_mode:
1875 	return (strpoll(stp, events, anyyet, reventsp, phpp));
1876 }
1877 
1878 /*
1879  * POSIX pathconf() support.
1880  */
1881 /* ARGSUSED */
1882 int
1883 fifo_pathconf(vnode_t *vp, int cmd, ulong_t *valp, cred_t *cr,
1884     caller_context_t *ct)
1885 {
1886 	ulong_t val;
1887 	int error = 0;
1888 
1889 	switch (cmd) {
1890 
1891 	case _PC_LINK_MAX:
1892 		val = MAXLINK;
1893 		break;
1894 
1895 	case _PC_MAX_CANON:
1896 		val = MAX_CANON;
1897 		break;
1898 
1899 	case _PC_MAX_INPUT:
1900 		val = MAX_INPUT;
1901 		break;
1902 
1903 	case _PC_NAME_MAX:
1904 		error = EINVAL;
1905 		break;
1906 
1907 	case _PC_PATH_MAX:
1908 	case _PC_SYMLINK_MAX:
1909 		val = MAXPATHLEN;
1910 		break;
1911 
1912 	case _PC_PIPE_BUF:
1913 		val = PIPE_BUF;
1914 		break;
1915 
1916 	case _PC_NO_TRUNC:
1917 		if (vp->v_vfsp->vfs_flag & VFS_NOTRUNC)
1918 			val = 1;	/* NOTRUNC is enabled for vp */
1919 		else
1920 			val = (ulong_t)-1;
1921 		break;
1922 
1923 	case _PC_VDISABLE:
1924 		val = _POSIX_VDISABLE;
1925 		break;
1926 
1927 	case _PC_CHOWN_RESTRICTED:
1928 		if (rstchown)
1929 			val = rstchown;		/* chown restricted enabled */
1930 		else
1931 			val = (ulong_t)-1;
1932 		break;
1933 
1934 	case _PC_FILESIZEBITS:
1935 		val = (ulong_t)-1;
1936 		break;
1937 
1938 	default:
1939 		if (VTOF(vp)->fn_realvp)
1940 			error = VOP_PATHCONF(VTOF(vp)->fn_realvp, cmd,
1941 			    &val, cr, ct);
1942 		else
1943 			error = EINVAL;
1944 		break;
1945 	}
1946 
1947 	if (error == 0)
1948 		*valp = val;
1949 	return (error);
1950 }
1951 
1952 /*
1953  * If shadowing a vnode, apply VOP_SETSECATTR to it.
1954  * Otherwise, return NOSYS.
1955  */
1956 int
1957 fifo_setsecattr(struct vnode *vp, vsecattr_t *vsap, int flag, struct cred *crp,
1958     caller_context_t *ct)
1959 {
1960 	int error;
1961 
1962 	/*
1963 	 * The acl(2) system call tries to grab the write lock on the
1964 	 * file when setting an ACL, but fifofs does not implement
1965 	 * VOP_RWLOCK or VOP_RWUNLOCK, so we do it here instead.
1966 	 */
1967 	if (VTOF(vp)->fn_realvp) {
1968 		(void) VOP_RWLOCK(VTOF(vp)->fn_realvp, V_WRITELOCK_TRUE, ct);
1969 		error = VOP_SETSECATTR(VTOF(vp)->fn_realvp, vsap, flag,
1970 		    crp, ct);
1971 		VOP_RWUNLOCK(VTOF(vp)->fn_realvp, V_WRITELOCK_TRUE, ct);
1972 		return (error);
1973 	} else
1974 		return (fs_nosys());
1975 }
1976 
1977 /*
1978  * If shadowing a vnode, apply VOP_GETSECATTR to it. Otherwise, fabricate
1979  * an ACL from the permission bits that fifo_getattr() makes up.
1980  */
1981 int
1982 fifo_getsecattr(struct vnode *vp, vsecattr_t *vsap, int flag, struct cred *crp,
1983     caller_context_t *ct)
1984 {
1985 	if (VTOF(vp)->fn_realvp)
1986 		return (VOP_GETSECATTR(VTOF(vp)->fn_realvp, vsap, flag,
1987 		    crp, ct));
1988 	else
1989 		return (fs_fab_acl(vp, vsap, flag, crp, ct));
1990 }
1991 
1992 
1993 /*
1994  * Set the FIFOSTAYFAST flag so nobody can turn the fifo into stream mode.
1995  * If the flag is already set then wait until it is removed - releasing
1996  * the lock.
1997  * If the fifo switches into stream mode while we are waiting, return failure.
1998  */
1999 static boolean_t
2000 fifo_stayfast_enter(fifonode_t *fnp)
2001 {
2002 	ASSERT(MUTEX_HELD(&fnp->fn_lock->flk_lock));
2003 	while (fnp->fn_flag & FIFOSTAYFAST) {
2004 		fnp->fn_flag |= FIFOWAITMODE;
2005 		cv_wait(&fnp->fn_wait_cv, &fnp->fn_lock->flk_lock);
2006 		fnp->fn_flag &= ~FIFOWAITMODE;
2007 	}
2008 	if (!(fnp->fn_flag & FIFOFAST))
2009 		return (B_FALSE);
2010 
2011 	fnp->fn_flag |= FIFOSTAYFAST;
2012 	return (B_TRUE);
2013 }
2014 
2015 /*
2016  * Unset the FIFOSTAYFAST flag and notify anybody waiting for this flag
2017  * to be removed:
2018  *	- threads wanting to turn into stream mode waiting in fifo_fastoff(),
2019  *	- other writers threads waiting in fifo_stayfast_enter().
2020  */
2021 static void
2022 fifo_stayfast_exit(fifonode_t *fnp)
2023 {
2024 	fifonode_t *fn_dest = fnp->fn_dest;
2025 
2026 	ASSERT(MUTEX_HELD(&fnp->fn_lock->flk_lock));
2027 
2028 	fnp->fn_flag &= ~FIFOSTAYFAST;
2029 
2030 	if (fnp->fn_flag & FIFOWAITMODE)
2031 		cv_broadcast(&fnp->fn_wait_cv);
2032 
2033 	if ((fnp->fn_flag & ISPIPE) && (fn_dest->fn_flag & FIFOWAITMODE))
2034 		cv_broadcast(&fn_dest->fn_wait_cv);
2035 }
2036