xref: /illumos-gate/usr/src/uts/common/fs/fifofs/fifovnops.c (revision dc5e7685b131559c0b7c622baee25a9a0ae50ada)
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 int
1131 fifo_fastioctl(vnode_t *vp, int cmd, intptr_t arg, int mode, cred_t *cr,
1132     int *rvalp)
1133 {
1134 	fifonode_t	*fnp		= VTOF(vp);
1135 	fifonode_t	*fn_dest;
1136 	int		error		= 0;
1137 	fifolock_t	*fn_lock	= fnp->fn_lock;
1138 	int		cnt;
1139 
1140 	/*
1141 	 * tty operations not allowed
1142 	 */
1143 	if (((cmd & IOCTYPE) == LDIOC) ||
1144 	    ((cmd & IOCTYPE) == tIOC) ||
1145 	    ((cmd & IOCTYPE) == TIOC)) {
1146 		return (EINVAL);
1147 	}
1148 
1149 	mutex_enter(&fn_lock->flk_lock);
1150 
1151 	if (!(fnp->fn_flag & FIFOFAST)) {
1152 		goto stream_mode;
1153 	}
1154 
1155 	switch (cmd) {
1156 
1157 	/*
1158 	 * Things we can't handle
1159 	 * These will switch us to streams mode.
1160 	 */
1161 	default:
1162 	case I_STR:
1163 	case I_SRDOPT:
1164 	case I_PUSH:
1165 	case I_FDINSERT:
1166 	case I_SENDFD:
1167 	case I_RECVFD:
1168 	case I_E_RECVFD:
1169 	case I_ATMARK:
1170 	case I_CKBAND:
1171 	case I_GETBAND:
1172 	case I_SWROPT:
1173 		goto turn_fastoff;
1174 
1175 	/*
1176 	 * Things that don't do damage
1177 	 * These things don't adjust the state of the
1178 	 * stream head (i_setcltime does, but we don't care)
1179 	 */
1180 	case I_FIND:
1181 	case I_GETSIG:
1182 	case FIONBIO:
1183 	case FIOASYNC:
1184 	case I_GRDOPT:	/* probably should not get this, but no harm */
1185 	case I_GWROPT:
1186 	case I_LIST:
1187 	case I_SETCLTIME:
1188 	case I_GETCLTIME:
1189 		mutex_exit(&fn_lock->flk_lock);
1190 		return (strioctl(vp, cmd, arg, mode, U_TO_K, cr, rvalp));
1191 
1192 	case I_CANPUT:
1193 		/*
1194 		 * We can only handle normal band canputs.
1195 		 * XXX : We could just always go to stream mode; after all
1196 		 * canput is a streams semantics type thing
1197 		 */
1198 		if (arg != 0) {
1199 			goto turn_fastoff;
1200 		}
1201 		*rvalp = (fnp->fn_dest->fn_count < Fifohiwat) ? 1 : 0;
1202 		mutex_exit(&fn_lock->flk_lock);
1203 		return (0);
1204 
1205 	case I_NREAD:
1206 		/*
1207 		 * This may seem a bit silly for non-streams semantics,
1208 		 * (After all, if they really want a message, they'll
1209 		 * probably use getmsg() anyway). but it doesn't hurt
1210 		 */
1211 		error = copyout((caddr_t)&fnp->fn_count, (caddr_t)arg,
1212 		    sizeof (cnt));
1213 		if (error == 0) {
1214 			*rvalp = (fnp->fn_count == 0) ? 0 : 1;
1215 		}
1216 		break;
1217 
1218 	case FIORDCHK:
1219 		*rvalp = fnp->fn_count;
1220 		break;
1221 
1222 	case I_PEEK:
1223 	{
1224 		STRUCT_DECL(strpeek, strpeek);
1225 		struct uio	uio;
1226 		struct iovec	iov;
1227 		int		count;
1228 		mblk_t		*bp;
1229 		int		len;
1230 
1231 		STRUCT_INIT(strpeek, mode);
1232 
1233 		if (fnp->fn_count == 0) {
1234 			*rvalp = 0;
1235 			break;
1236 		}
1237 
1238 		error = copyin((caddr_t)arg, STRUCT_BUF(strpeek),
1239 		    STRUCT_SIZE(strpeek));
1240 		if (error)
1241 			break;
1242 
1243 		/*
1244 		 * can't have any high priority message when in fast mode
1245 		 */
1246 		if (STRUCT_FGET(strpeek, flags) & RS_HIPRI) {
1247 			*rvalp = 0;
1248 			break;
1249 		}
1250 
1251 		len = STRUCT_FGET(strpeek, databuf.maxlen);
1252 		if (len <= 0) {
1253 			STRUCT_FSET(strpeek, databuf.len, len);
1254 		} else {
1255 			iov.iov_base = STRUCT_FGETP(strpeek, databuf.buf);
1256 			iov.iov_len = len;
1257 			uio.uio_iov = &iov;
1258 			uio.uio_iovcnt = 1;
1259 			uio.uio_loffset = 0;
1260 			uio.uio_segflg = UIO_USERSPACE;
1261 			uio.uio_fmode = 0;
1262 			/* For pipes copy should not bypass cache */
1263 			uio.uio_extflg = UIO_COPY_CACHED;
1264 			uio.uio_resid = iov.iov_len;
1265 			count = fnp->fn_count;
1266 			bp = fnp->fn_mp;
1267 			while (count > 0 && uio.uio_resid) {
1268 				cnt = MIN(uio.uio_resid, MBLKL(bp));
1269 				if ((error = uiomove((char *)bp->b_rptr, cnt,
1270 				    UIO_READ, &uio)) != 0) {
1271 					break;
1272 				}
1273 				count -= cnt;
1274 				bp = bp->b_cont;
1275 			}
1276 			STRUCT_FSET(strpeek, databuf.len, len - uio.uio_resid);
1277 		}
1278 		STRUCT_FSET(strpeek, flags, 0);
1279 		STRUCT_FSET(strpeek, ctlbuf.len, -1);
1280 
1281 		error = copyout(STRUCT_BUF(strpeek), (caddr_t)arg,
1282 		    STRUCT_SIZE(strpeek));
1283 		if (error == 0 && len >= 0)
1284 			*rvalp = 1;
1285 		break;
1286 	}
1287 
1288 	case FIONREAD:
1289 		/*
1290 		 * let user know total number of bytes in message queue
1291 		 */
1292 		error = copyout((caddr_t)&fnp->fn_count, (caddr_t)arg,
1293 		    sizeof (fnp->fn_count));
1294 		if (error == 0)
1295 			*rvalp = 0;
1296 		break;
1297 
1298 	case I_SETSIG:
1299 		/*
1300 		 * let streams set up the signal masking for us
1301 		 * we just check to see if it's set
1302 		 * XXX : this interface should not be visible
1303 		 *  i.e. STREAM's framework is exposed.
1304 		 */
1305 		error = strioctl(vp, cmd, arg, mode, U_TO_K, cr, rvalp);
1306 		if (vp->v_stream->sd_sigflags & (S_INPUT|S_RDNORM|S_WRNORM))
1307 			fnp->fn_flag |= FIFOSETSIG;
1308 		else
1309 			fnp->fn_flag &= ~FIFOSETSIG;
1310 		break;
1311 
1312 	case I_FLUSH:
1313 		/*
1314 		 * flush them message queues
1315 		 */
1316 		if (arg & ~FLUSHRW) {
1317 			error = EINVAL;
1318 			break;
1319 		}
1320 		if (arg & FLUSHR) {
1321 			fifo_fastflush(fnp);
1322 		}
1323 		fn_dest = fnp->fn_dest;
1324 		if ((arg & FLUSHW)) {
1325 			fifo_fastflush(fn_dest);
1326 		}
1327 		/*
1328 		 * wake up any sleeping readers or writers
1329 		 * (waking readers probably doesn't make sense, but it
1330 		 *  doesn't hurt; i.e. we just got rid of all the data
1331 		 *  what's to read ?)
1332 		 */
1333 		if (fn_dest->fn_flag & (FIFOWANTW | FIFOWANTR)) {
1334 			fn_dest->fn_flag &= ~(FIFOWANTW | FIFOWANTR);
1335 			cv_broadcast(&fn_dest->fn_wait_cv);
1336 		}
1337 		*rvalp = 0;
1338 		break;
1339 
1340 	/*
1341 	 * Since no band data can ever get on a fifo in fast mode
1342 	 * just return 0.
1343 	 */
1344 	case I_FLUSHBAND:
1345 		error = 0;
1346 		*rvalp = 0;
1347 		break;
1348 
1349 	/*
1350 	 * invalid calls for stream head or fifos
1351 	 */
1352 
1353 	case I_POP:		/* shouldn't happen */
1354 	case I_LOOK:
1355 	case I_LINK:
1356 	case I_PLINK:
1357 	case I_UNLINK:
1358 	case I_PUNLINK:
1359 
1360 	/*
1361 	 * more invalid tty type of ioctls
1362 	 */
1363 
1364 	case SRIOCSREDIR:
1365 	case SRIOCISREDIR:
1366 		error = EINVAL;
1367 		break;
1368 
1369 	}
1370 	mutex_exit(&fn_lock->flk_lock);
1371 	return (error);
1372 
1373 turn_fastoff:
1374 	fifo_fastoff(fnp);
1375 
1376 stream_mode:
1377 	/*
1378 	 * streams mode
1379 	 */
1380 	mutex_exit(&fn_lock->flk_lock);
1381 	return (fifo_strioctl(vp, cmd, arg, mode, cr, rvalp));
1382 
1383 }
1384 
1385 /*
1386  * FIFO is in STREAMS mode; STREAMS framework does most of the work.
1387  */
1388 static int
1389 fifo_strioctl(vnode_t *vp, int cmd, intptr_t arg, int mode, cred_t *cr,
1390     int *rvalp)
1391 {
1392 	fifonode_t	*fnp = VTOF(vp);
1393 	int		error;
1394 	fifolock_t	*fn_lock;
1395 
1396 	if (cmd == _I_GETPEERCRED) {
1397 		if (mode == FKIOCTL && fnp->fn_pcredp != NULL) {
1398 			k_peercred_t *kp = (k_peercred_t *)arg;
1399 			crhold(fnp->fn_pcredp);
1400 			kp->pc_cr = fnp->fn_pcredp;
1401 			kp->pc_cpid = fnp->fn_cpid;
1402 			return (0);
1403 		} else {
1404 			return (ENOTSUP);
1405 		}
1406 	}
1407 
1408 	error = strioctl(vp, cmd, arg, mode, U_TO_K, cr, rvalp);
1409 
1410 	switch (cmd) {
1411 	/*
1412 	 * The FIFOSEND flag is set to inform other processes that a file
1413 	 * descriptor is pending at the stream head of this pipe.
1414 	 * The flag is cleared and the sending process is awoken when
1415 	 * this process has completed receiving the file descriptor.
1416 	 * XXX This could become out of sync if the process does I_SENDFDs
1417 	 * and opens on connld attached to the same pipe.
1418 	 */
1419 	case I_RECVFD:
1420 	case I_E_RECVFD:
1421 		if (error == 0) {
1422 			fn_lock = fnp->fn_lock;
1423 			mutex_enter(&fn_lock->flk_lock);
1424 			if (fnp->fn_flag & FIFOSEND) {
1425 				fnp->fn_flag &= ~FIFOSEND;
1426 				cv_broadcast(&fnp->fn_dest->fn_wait_cv);
1427 			}
1428 			mutex_exit(&fn_lock->flk_lock);
1429 		}
1430 		break;
1431 	default:
1432 		break;
1433 	}
1434 
1435 	return (error);
1436 }
1437 
1438 /*
1439  * If shadowing a vnode (FIFOs), apply the VOP_GETATTR to the shadowed
1440  * vnode to Obtain the node information. If not shadowing (pipes), obtain
1441  * the node information from the credentials structure.
1442  */
1443 int
1444 fifo_getattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *crp,
1445     caller_context_t *ct)
1446 {
1447 	int		error		= 0;
1448 	fifonode_t	*fnp		= VTOF(vp);
1449 	queue_t		*qp;
1450 	qband_t		*bandp;
1451 	fifolock_t	*fn_lock	= fnp->fn_lock;
1452 
1453 	if (fnp->fn_realvp) {
1454 		/*
1455 		 * for FIFOs or mounted pipes
1456 		 */
1457 		if (error = VOP_GETATTR(fnp->fn_realvp, vap, flags, crp, ct))
1458 			return (error);
1459 		mutex_enter(&fn_lock->flk_lock);
1460 		/* set current times from fnode, even if older than vnode */
1461 		vap->va_atime.tv_sec = fnp->fn_atime;
1462 		vap->va_atime.tv_nsec = 0;
1463 		vap->va_mtime.tv_sec = fnp->fn_mtime;
1464 		vap->va_mtime.tv_nsec = 0;
1465 		vap->va_ctime.tv_sec = fnp->fn_ctime;
1466 		vap->va_ctime.tv_nsec = 0;
1467 	} else {
1468 		/*
1469 		 * for non-attached/ordinary pipes
1470 		 */
1471 		vap->va_mode = 0;
1472 		mutex_enter(&fn_lock->flk_lock);
1473 		vap->va_atime.tv_sec = fnp->fn_atime;
1474 		vap->va_atime.tv_nsec = 0;
1475 		vap->va_mtime.tv_sec = fnp->fn_mtime;
1476 		vap->va_mtime.tv_nsec = 0;
1477 		vap->va_ctime.tv_sec = fnp->fn_ctime;
1478 		vap->va_ctime.tv_nsec = 0;
1479 		vap->va_uid = crgetuid(crp);
1480 		vap->va_gid = crgetgid(crp);
1481 		vap->va_nlink = 0;
1482 		vap->va_fsid = fifodev;
1483 		vap->va_nodeid = (ino64_t)fnp->fn_ino;
1484 		vap->va_rdev = 0;
1485 	}
1486 	vap->va_type = VFIFO;
1487 	vap->va_blksize = PIPE_BUF;
1488 	/*
1489 	 * Size is number of un-read bytes at the stream head and
1490 	 * nblocks is the unread bytes expressed in blocks.
1491 	 */
1492 	if (vp->v_stream && (fnp->fn_flag & FIFOISOPEN)) {
1493 		if ((fnp->fn_flag & FIFOFAST)) {
1494 			vap->va_size = (u_offset_t)fnp->fn_count;
1495 		} else {
1496 			qp = RD((strvp2wq(vp)));
1497 			vap->va_size = (u_offset_t)qp->q_count;
1498 			if (qp->q_nband != 0) {
1499 				mutex_enter(QLOCK(qp));
1500 				for (bandp = qp->q_bandp; bandp;
1501 				    bandp = bandp->qb_next)
1502 					vap->va_size += bandp->qb_count;
1503 				mutex_exit(QLOCK(qp));
1504 			}
1505 		}
1506 		vap->va_nblocks = (fsblkcnt64_t)btod(vap->va_size);
1507 	} else {
1508 		vap->va_size = (u_offset_t)0;
1509 		vap->va_nblocks = (fsblkcnt64_t)0;
1510 	}
1511 	mutex_exit(&fn_lock->flk_lock);
1512 	vap->va_seq = 0;
1513 	return (0);
1514 }
1515 
1516 /*
1517  * If shadowing a vnode, apply the VOP_SETATTR to it, and to the fnode.
1518  * Otherwise, set the time and return 0.
1519  */
1520 int
1521 fifo_setattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *crp,
1522     caller_context_t *ctp)
1523 {
1524 	fifonode_t	*fnp	= VTOF(vp);
1525 	int		error	= 0;
1526 	fifolock_t	*fn_lock;
1527 
1528 	if (fnp->fn_realvp)
1529 		error = VOP_SETATTR(fnp->fn_realvp, vap, flags, crp, ctp);
1530 	if (error == 0) {
1531 		fn_lock = fnp->fn_lock;
1532 		mutex_enter(&fn_lock->flk_lock);
1533 		if (vap->va_mask & AT_ATIME)
1534 			fnp->fn_atime = vap->va_atime.tv_sec;
1535 		if (vap->va_mask & AT_MTIME)
1536 			fnp->fn_mtime = vap->va_mtime.tv_sec;
1537 		fnp->fn_ctime = gethrestime_sec();
1538 		mutex_exit(&fn_lock->flk_lock);
1539 	}
1540 	return (error);
1541 }
1542 
1543 /*
1544  * If shadowing a vnode, apply VOP_ACCESS to it.
1545  * Otherwise, return 0 (allow all access).
1546  */
1547 int
1548 fifo_access(vnode_t *vp, int mode, int flags, cred_t *crp, caller_context_t *ct)
1549 {
1550 	if (VTOF(vp)->fn_realvp)
1551 		return (VOP_ACCESS(VTOF(vp)->fn_realvp, mode, flags, crp, ct));
1552 	else
1553 		return (0);
1554 }
1555 
1556 /*
1557  * This can be called if creat or an open with O_CREAT is done on the root
1558  * of a lofs mount where the mounted entity is a fifo.
1559  */
1560 /*ARGSUSED*/
1561 static int
1562 fifo_create(struct vnode *dvp, char *name, vattr_t *vap, enum vcexcl excl,
1563     int mode, struct vnode **vpp, struct cred *cr, int flag,
1564     caller_context_t *ct, vsecattr_t *vsecp)
1565 {
1566 	int error;
1567 
1568 	ASSERT(dvp && (dvp->v_flag & VROOT) && *name == '\0');
1569 	if (excl == NONEXCL) {
1570 		if (mode && (error = fifo_access(dvp, mode, 0, cr, ct)))
1571 			return (error);
1572 		VN_HOLD(dvp);
1573 		return (0);
1574 	}
1575 	return (EEXIST);
1576 }
1577 
1578 /*
1579  * If shadowing a vnode, apply the VOP_FSYNC to it.
1580  * Otherwise, return 0.
1581  */
1582 int
1583 fifo_fsync(vnode_t *vp, int syncflag, cred_t *crp, caller_context_t *ct)
1584 {
1585 	fifonode_t	*fnp	= VTOF(vp);
1586 	vattr_t		va;
1587 
1588 	if (fnp->fn_realvp == NULL)
1589 		return (0);
1590 
1591 	bzero((caddr_t)&va, sizeof (va));
1592 	va.va_mask = AT_MTIME | AT_ATIME;
1593 	if (VOP_GETATTR(fnp->fn_realvp, &va, 0, crp, ct) == 0) {
1594 		va.va_mask = 0;
1595 		if (fnp->fn_mtime > va.va_mtime.tv_sec) {
1596 			va.va_mtime.tv_sec = fnp->fn_mtime;
1597 			va.va_mask = AT_MTIME;
1598 		}
1599 		if (fnp->fn_atime > va.va_atime.tv_sec) {
1600 			va.va_atime.tv_sec = fnp->fn_atime;
1601 			va.va_mask |= AT_ATIME;
1602 		}
1603 		if (va.va_mask != 0)
1604 			(void) VOP_SETATTR(fnp->fn_realvp, &va, 0, crp, ct);
1605 	}
1606 	return (VOP_FSYNC(fnp->fn_realvp, syncflag, crp, ct));
1607 }
1608 
1609 /*
1610  * Called when the upper level no longer holds references to the
1611  * vnode. Sync the file system and free the fifonode.
1612  */
1613 void
1614 fifo_inactive(vnode_t *vp, cred_t *crp, caller_context_t *ct)
1615 {
1616 	fifonode_t	*fnp;
1617 	fifolock_t	*fn_lock;
1618 
1619 	mutex_enter(&ftable_lock);
1620 	mutex_enter(&vp->v_lock);
1621 	ASSERT(vp->v_count >= 1);
1622 	VN_RELE_LOCKED(vp);
1623 	if (vp->v_count != 0) {
1624 		/*
1625 		 * Somebody accessed the fifo before we got a chance to
1626 		 * remove it.  They will remove it when they do a vn_rele.
1627 		 */
1628 		mutex_exit(&vp->v_lock);
1629 		mutex_exit(&ftable_lock);
1630 		return;
1631 	}
1632 	mutex_exit(&vp->v_lock);
1633 
1634 	fnp = VTOF(vp);
1635 
1636 	/*
1637 	 * remove fifo from fifo list so that no other process
1638 	 * can grab it.
1639 	 * Drop the reference count on the fifo node's
1640 	 * underlying vfs.
1641 	 */
1642 	if (fnp->fn_realvp) {
1643 		(void) fiforemove(fnp);
1644 		mutex_exit(&ftable_lock);
1645 		(void) fifo_fsync(vp, FSYNC, crp, ct);
1646 		VN_RELE(fnp->fn_realvp);
1647 		VFS_RELE(vp->v_vfsp);
1648 		vp->v_vfsp = NULL;
1649 	} else
1650 		mutex_exit(&ftable_lock);
1651 
1652 	fn_lock = fnp->fn_lock;
1653 
1654 	mutex_enter(&fn_lock->flk_lock);
1655 	ASSERT(vp->v_stream == NULL);
1656 	ASSERT(vp->v_count == 0);
1657 	/*
1658 	 * if this is last reference to the lock, then we can
1659 	 * free everything up.
1660 	 */
1661 	if (--fn_lock->flk_ref == 0) {
1662 		mutex_exit(&fn_lock->flk_lock);
1663 		ASSERT(fnp->fn_open == 0);
1664 		ASSERT(fnp->fn_dest->fn_open == 0);
1665 		if (fnp->fn_mp) {
1666 			freemsg(fnp->fn_mp);
1667 			fnp->fn_mp = NULL;
1668 			fnp->fn_count = 0;
1669 		}
1670 		if (fnp->fn_pcredp != NULL) {
1671 			crfree(fnp->fn_pcredp);
1672 			fnp->fn_pcredp = NULL;
1673 		}
1674 		if (fnp->fn_flag & ISPIPE) {
1675 			fifonode_t *fn_dest = fnp->fn_dest;
1676 
1677 			vp = FTOV(fn_dest);
1678 			if (fn_dest->fn_mp) {
1679 				freemsg(fn_dest->fn_mp);
1680 				fn_dest->fn_mp = NULL;
1681 				fn_dest->fn_count = 0;
1682 			}
1683 			if (fn_dest->fn_pcredp != NULL) {
1684 				crfree(fn_dest->fn_pcredp);
1685 				fn_dest->fn_pcredp = NULL;
1686 			}
1687 			kmem_cache_free(pipe_cache, (fifodata_t *)fn_lock);
1688 		} else
1689 			kmem_cache_free(fnode_cache, (fifodata_t *)fn_lock);
1690 	} else {
1691 		mutex_exit(&fn_lock->flk_lock);
1692 	}
1693 }
1694 
1695 /*
1696  * If shadowing a vnode, apply the VOP_FID to it.
1697  * Otherwise, return EINVAL.
1698  */
1699 int
1700 fifo_fid(vnode_t *vp, fid_t *fidfnp, caller_context_t *ct)
1701 {
1702 	if (VTOF(vp)->fn_realvp)
1703 		return (VOP_FID(VTOF(vp)->fn_realvp, fidfnp, ct));
1704 	else
1705 		return (EINVAL);
1706 }
1707 
1708 /*
1709  * Lock a fifonode.
1710  */
1711 /* ARGSUSED */
1712 int
1713 fifo_rwlock(vnode_t *vp, int write_lock, caller_context_t *ctp)
1714 {
1715 	return (-1);
1716 }
1717 
1718 /*
1719  * Unlock a fifonode.
1720  */
1721 /* ARGSUSED */
1722 void
1723 fifo_rwunlock(vnode_t *vp, int write_lock, caller_context_t *ctp)
1724 {
1725 }
1726 
1727 /*
1728  * Return error since seeks are not allowed on pipes.
1729  */
1730 /*ARGSUSED*/
1731 int
1732 fifo_seek(vnode_t *vp, offset_t ooff, offset_t *noffp, caller_context_t *ct)
1733 {
1734 	return (ESPIPE);
1735 }
1736 
1737 /*
1738  * If there is a realvp associated with vp, return it.
1739  */
1740 int
1741 fifo_realvp(vnode_t *vp, vnode_t **vpp, caller_context_t *ct)
1742 {
1743 	vnode_t *rvp;
1744 
1745 	if ((rvp = VTOF(vp)->fn_realvp) != NULL) {
1746 		vp = rvp;
1747 		if (VOP_REALVP(vp, &rvp, ct) == 0)
1748 			vp = rvp;
1749 	}
1750 
1751 	*vpp = vp;
1752 	return (0);
1753 }
1754 
1755 /*
1756  * Poll for interesting events on a stream pipe
1757  */
1758 /* ARGSUSED */
1759 int
1760 fifo_poll(vnode_t *vp, short events, int anyyet, short *reventsp,
1761     pollhead_t **phpp, caller_context_t *ct)
1762 {
1763 	fifonode_t	*fnp, *fn_dest;
1764 	fifolock_t	*fn_lock;
1765 	int		retevents;
1766 	struct stdata	*stp;
1767 
1768 	ASSERT(vp->v_stream != NULL);
1769 
1770 	stp = vp->v_stream;
1771 	retevents	= 0;
1772 	fnp		= VTOF(vp);
1773 	fn_dest		= fnp->fn_dest;
1774 	fn_lock		= fnp->fn_lock;
1775 
1776 	if (polllock(&stp->sd_pollist, &fn_lock->flk_lock) != 0) {
1777 		*reventsp = POLLNVAL;
1778 		return (0);
1779 	}
1780 
1781 	/*
1782 	 * see if FIFO/pipe open
1783 	 */
1784 	if ((fnp->fn_flag & FIFOISOPEN) == 0) {
1785 		if (((events & (POLLIN | POLLRDNORM | POLLPRI | POLLRDBAND)) &&
1786 		    fnp->fn_rcnt == 0) ||
1787 		    ((events & (POLLWRNORM | POLLWRBAND)) &&
1788 		    fnp->fn_wcnt == 0)) {
1789 			mutex_exit(&fnp->fn_lock->flk_lock);
1790 			*reventsp = POLLERR;
1791 			return (0);
1792 		}
1793 	}
1794 
1795 	/*
1796 	 * if not in fast mode, let the stream head take care of it
1797 	 */
1798 	if (!(fnp->fn_flag & FIFOFAST)) {
1799 		mutex_exit(&fnp->fn_lock->flk_lock);
1800 		goto stream_mode;
1801 	}
1802 
1803 	/*
1804 	 * If this is a pipe.. check to see if the other
1805 	 * end is gone.  If we are a fifo, check to see
1806 	 * if write end is gone.
1807 	 */
1808 
1809 	if ((fnp->fn_flag & ISPIPE) && (fn_dest->fn_open == 0)) {
1810 		retevents = POLLHUP;
1811 	} else if ((fnp->fn_flag & (FIFOCLOSE | ISPIPE)) == FIFOCLOSE &&
1812 	    (fn_dest->fn_wcnt == 0)) {
1813 		/*
1814 		 * no writer at other end.
1815 		 * it was closed (versus yet to be opened)
1816 		 */
1817 			retevents = POLLHUP;
1818 	} else if (events & (POLLWRNORM | POLLWRBAND)) {
1819 		if (events & POLLWRNORM) {
1820 			if (fn_dest->fn_count < Fifohiwat)
1821 				retevents = POLLWRNORM;
1822 			else
1823 				fnp->fn_flag |= FIFOHIWATW;
1824 		}
1825 		/*
1826 		 * This is always true for fast pipes
1827 		 * (Note: will go to STREAMS mode if band data is written)
1828 		 */
1829 		if (events & POLLWRBAND)
1830 			retevents |= POLLWRBAND;
1831 	}
1832 	if (events & (POLLIN | POLLRDNORM)) {
1833 		if (fnp->fn_count)
1834 			retevents |= (events & (POLLIN | POLLRDNORM));
1835 	}
1836 
1837 	/*
1838 	 * if we happened to get something and we're not edge-triggered, return
1839 	 */
1840 	if ((*reventsp = (short)retevents) != 0 && !(events & POLLET)) {
1841 		mutex_exit(&fnp->fn_lock->flk_lock);
1842 		return (0);
1843 	}
1844 
1845 	/*
1846 	 * If poll() has not found any events yet or we're edge-triggered, set
1847 	 * up event cell to wake up the poll if a requested event occurs on this
1848 	 * pipe/fifo.
1849 	 */
1850 	if (!anyyet) {
1851 		if (events & POLLWRNORM)
1852 			fnp->fn_flag |= FIFOPOLLW;
1853 		if (events & (POLLIN | POLLRDNORM))
1854 			fnp->fn_flag |= FIFOPOLLR;
1855 		if (events & POLLRDBAND)
1856 			fnp->fn_flag |= FIFOPOLLRBAND;
1857 		/*
1858 		 * XXX Don't like exposing this from streams
1859 		 */
1860 		*phpp = &stp->sd_pollist;
1861 	}
1862 	mutex_exit(&fnp->fn_lock->flk_lock);
1863 	return (0);
1864 stream_mode:
1865 	return (strpoll(stp, events, anyyet, reventsp, phpp));
1866 }
1867 
1868 /*
1869  * POSIX pathconf() support.
1870  */
1871 /* ARGSUSED */
1872 int
1873 fifo_pathconf(vnode_t *vp, int cmd, ulong_t *valp, cred_t *cr,
1874     caller_context_t *ct)
1875 {
1876 	ulong_t val;
1877 	int error = 0;
1878 
1879 	switch (cmd) {
1880 
1881 	case _PC_LINK_MAX:
1882 		val = MAXLINK;
1883 		break;
1884 
1885 	case _PC_MAX_CANON:
1886 		val = MAX_CANON;
1887 		break;
1888 
1889 	case _PC_MAX_INPUT:
1890 		val = MAX_INPUT;
1891 		break;
1892 
1893 	case _PC_NAME_MAX:
1894 		error = EINVAL;
1895 		break;
1896 
1897 	case _PC_PATH_MAX:
1898 	case _PC_SYMLINK_MAX:
1899 		val = MAXPATHLEN;
1900 		break;
1901 
1902 	case _PC_PIPE_BUF:
1903 		val = PIPE_BUF;
1904 		break;
1905 
1906 	case _PC_NO_TRUNC:
1907 		if (vp->v_vfsp->vfs_flag & VFS_NOTRUNC)
1908 			val = 1;	/* NOTRUNC is enabled for vp */
1909 		else
1910 			val = (ulong_t)-1;
1911 		break;
1912 
1913 	case _PC_VDISABLE:
1914 		val = _POSIX_VDISABLE;
1915 		break;
1916 
1917 	case _PC_CHOWN_RESTRICTED:
1918 		if (rstchown)
1919 			val = rstchown;		/* chown restricted enabled */
1920 		else
1921 			val = (ulong_t)-1;
1922 		break;
1923 
1924 	case _PC_FILESIZEBITS:
1925 		val = (ulong_t)-1;
1926 		break;
1927 
1928 	default:
1929 		if (VTOF(vp)->fn_realvp)
1930 			error = VOP_PATHCONF(VTOF(vp)->fn_realvp, cmd,
1931 			    &val, cr, ct);
1932 		else
1933 			error = EINVAL;
1934 		break;
1935 	}
1936 
1937 	if (error == 0)
1938 		*valp = val;
1939 	return (error);
1940 }
1941 
1942 /*
1943  * If shadowing a vnode, apply VOP_SETSECATTR to it.
1944  * Otherwise, return NOSYS.
1945  */
1946 int
1947 fifo_setsecattr(struct vnode *vp, vsecattr_t *vsap, int flag, struct cred *crp,
1948     caller_context_t *ct)
1949 {
1950 	int error;
1951 
1952 	/*
1953 	 * The acl(2) system call tries to grab the write lock on the
1954 	 * file when setting an ACL, but fifofs does not implement
1955 	 * VOP_RWLOCK or VOP_RWUNLOCK, so we do it here instead.
1956 	 */
1957 	if (VTOF(vp)->fn_realvp) {
1958 		(void) VOP_RWLOCK(VTOF(vp)->fn_realvp, V_WRITELOCK_TRUE, ct);
1959 		error = VOP_SETSECATTR(VTOF(vp)->fn_realvp, vsap, flag,
1960 		    crp, ct);
1961 		VOP_RWUNLOCK(VTOF(vp)->fn_realvp, V_WRITELOCK_TRUE, ct);
1962 		return (error);
1963 	} else
1964 		return (fs_nosys());
1965 }
1966 
1967 /*
1968  * If shadowing a vnode, apply VOP_GETSECATTR to it. Otherwise, fabricate
1969  * an ACL from the permission bits that fifo_getattr() makes up.
1970  */
1971 int
1972 fifo_getsecattr(struct vnode *vp, vsecattr_t *vsap, int flag, struct cred *crp,
1973     caller_context_t *ct)
1974 {
1975 	if (VTOF(vp)->fn_realvp)
1976 		return (VOP_GETSECATTR(VTOF(vp)->fn_realvp, vsap, flag,
1977 		    crp, ct));
1978 	else
1979 		return (fs_fab_acl(vp, vsap, flag, crp, ct));
1980 }
1981 
1982 
1983 /*
1984  * Set the FIFOSTAYFAST flag so nobody can turn the fifo into stream mode.
1985  * If the flag is already set then wait until it is removed - releasing
1986  * the lock.
1987  * If the fifo switches into stream mode while we are waiting, return failure.
1988  */
1989 static boolean_t
1990 fifo_stayfast_enter(fifonode_t *fnp)
1991 {
1992 	ASSERT(MUTEX_HELD(&fnp->fn_lock->flk_lock));
1993 	while (fnp->fn_flag & FIFOSTAYFAST) {
1994 		fnp->fn_flag |= FIFOWAITMODE;
1995 		cv_wait(&fnp->fn_wait_cv, &fnp->fn_lock->flk_lock);
1996 		fnp->fn_flag &= ~FIFOWAITMODE;
1997 	}
1998 	if (!(fnp->fn_flag & FIFOFAST))
1999 		return (B_FALSE);
2000 
2001 	fnp->fn_flag |= FIFOSTAYFAST;
2002 	return (B_TRUE);
2003 }
2004 
2005 /*
2006  * Unset the FIFOSTAYFAST flag and notify anybody waiting for this flag
2007  * to be removed:
2008  *	- threads wanting to turn into stream mode waiting in fifo_fastoff(),
2009  *	- other writers threads waiting in fifo_stayfast_enter().
2010  */
2011 static void
2012 fifo_stayfast_exit(fifonode_t *fnp)
2013 {
2014 	fifonode_t *fn_dest = fnp->fn_dest;
2015 
2016 	ASSERT(MUTEX_HELD(&fnp->fn_lock->flk_lock));
2017 
2018 	fnp->fn_flag &= ~FIFOSTAYFAST;
2019 
2020 	if (fnp->fn_flag & FIFOWAITMODE)
2021 		cv_broadcast(&fnp->fn_wait_cv);
2022 
2023 	if ((fnp->fn_flag & ISPIPE) && (fn_dest->fn_flag & FIFOWAITMODE))
2024 		cv_broadcast(&fn_dest->fn_wait_cv);
2025 }
2026