xref: /freebsd/sys/fs/fifofs/fifo_vnops.c (revision 29363fb446372cb3f10bc98664e9767c53fbb457)
1d167cf6fSWarner Losh /*-
251369649SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
351369649SPedro F. Giffuni  *
4996c772fSJohn Dyson  * Copyright (c) 1990, 1993, 1995
5447bbaa2SRobert Watson  *	The Regents of the University of California.
6447bbaa2SRobert Watson  * Copyright (c) 2005 Robert N. M. Watson
711ac7ec0SKip Macy  * Copyright (c) 2012 Giovanni Trematerra
8447bbaa2SRobert Watson  * All rights reserved.
9df8bae1dSRodney W. Grimes  *
10df8bae1dSRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
11df8bae1dSRodney W. Grimes  * modification, are permitted provided that the following conditions
12df8bae1dSRodney W. Grimes  * are met:
13df8bae1dSRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
14df8bae1dSRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
15df8bae1dSRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
16df8bae1dSRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
17df8bae1dSRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
18fbbd9655SWarner Losh  * 3. Neither the name of the University nor the names of its contributors
19df8bae1dSRodney W. Grimes  *    may be used to endorse or promote products derived from this software
20df8bae1dSRodney W. Grimes  *    without specific prior written permission.
21df8bae1dSRodney W. Grimes  *
22df8bae1dSRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23df8bae1dSRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24df8bae1dSRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25df8bae1dSRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26df8bae1dSRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27df8bae1dSRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28df8bae1dSRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29df8bae1dSRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30df8bae1dSRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31df8bae1dSRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32df8bae1dSRodney W. Grimes  * SUCH DAMAGE.
33df8bae1dSRodney W. Grimes  */
34df8bae1dSRodney W. Grimes 
35df8bae1dSRodney W. Grimes #include <sys/param.h>
36960ed29cSSeigo Tanimura #include <sys/event.h>
37d6d64f0fSPoul-Henning Kamp #include <sys/file.h>
38d6d64f0fSPoul-Henning Kamp #include <sys/filedesc.h>
39960ed29cSSeigo Tanimura #include <sys/filio.h>
40960ed29cSSeigo Tanimura #include <sys/fcntl.h>
4110546e21SMike Pritchard #include <sys/kernel.h>
421cd52ec3SBruce Evans #include <sys/lock.h>
439e209b12SAlfred Perlstein #include <sys/mutex.h>
44a1c995b6SPoul-Henning Kamp #include <sys/malloc.h>
4511ac7ec0SKip Macy #include <sys/selinfo.h>
4611ac7ec0SKip Macy #include <sys/pipe.h>
476617724cSJeff Roberson #include <sys/proc.h>
48960ed29cSSeigo Tanimura #include <sys/signalvar.h>
49960ed29cSSeigo Tanimura #include <sys/sx.h>
50960ed29cSSeigo Tanimura #include <sys/systm.h>
51b5e8ce9fSBruce Evans #include <sys/un.h>
52960ed29cSSeigo Tanimura #include <sys/unistd.h>
53960ed29cSSeigo Tanimura #include <sys/vnode.h>
54df8bae1dSRodney W. Grimes 
55df8bae1dSRodney W. Grimes /*
56a0e81bceSRobert Watson  * This structure is associated with the FIFO vnode and stores
57a0e81bceSRobert Watson  * the state associated with the FIFO.
589c766408SAttilio Rao  * Notes about locking:
5911ac7ec0SKip Macy  *   - fi_pipe is invariant since init time.
6011ac7ec0SKip Macy  *   - fi_readers and fi_writers are protected by the vnode lock.
61df8bae1dSRodney W. Grimes  */
62df8bae1dSRodney W. Grimes struct fifoinfo {
6311ac7ec0SKip Macy 	struct pipe *fi_pipe;
64df8bae1dSRodney W. Grimes 	long	fi_readers;
65df8bae1dSRodney W. Grimes 	long	fi_writers;
661d48f121SKonstantin Belousov 	u_int	fi_rgen;
671d48f121SKonstantin Belousov 	u_int	fi_wgen;
68df8bae1dSRodney W. Grimes };
69df8bae1dSRodney W. Grimes 
706fde64c7SPoul-Henning Kamp static vop_print_t	fifo_print;
716fde64c7SPoul-Henning Kamp static vop_open_t	fifo_open;
726fde64c7SPoul-Henning Kamp static vop_close_t	fifo_close;
736fde64c7SPoul-Henning Kamp static vop_advlock_t	fifo_advlock;
74138ec1f7SPoul-Henning Kamp 
75aec0fb7bSPoul-Henning Kamp struct vop_vector fifo_specops = {
76aec0fb7bSPoul-Henning Kamp 	.vop_default =		&default_vnodeops,
7783c64397SPoul-Henning Kamp 
78aec0fb7bSPoul-Henning Kamp 	.vop_advlock =		fifo_advlock,
79aec0fb7bSPoul-Henning Kamp 	.vop_close =		fifo_close,
80aec0fb7bSPoul-Henning Kamp 	.vop_create =		VOP_PANIC,
81aec0fb7bSPoul-Henning Kamp 	.vop_getattr =		VOP_EBADF,
82c4702e66SKonstantin Belousov 	.vop_ioctl =		VOP_PANIC,
83aec0fb7bSPoul-Henning Kamp 	.vop_link =		VOP_PANIC,
84aec0fb7bSPoul-Henning Kamp 	.vop_mkdir =		VOP_PANIC,
85aec0fb7bSPoul-Henning Kamp 	.vop_mknod =		VOP_PANIC,
86aec0fb7bSPoul-Henning Kamp 	.vop_open =		fifo_open,
87b501cc5dSJohn Baldwin 	.vop_pathconf =		VOP_PANIC,
88aec0fb7bSPoul-Henning Kamp 	.vop_print =		fifo_print,
89dce357b1SPoul-Henning Kamp 	.vop_read =		VOP_PANIC,
90aec0fb7bSPoul-Henning Kamp 	.vop_readdir =		VOP_PANIC,
91aec0fb7bSPoul-Henning Kamp 	.vop_readlink =		VOP_PANIC,
92aec0fb7bSPoul-Henning Kamp 	.vop_reallocblks =	VOP_PANIC,
93aec0fb7bSPoul-Henning Kamp 	.vop_reclaim =		VOP_NULL,
94aec0fb7bSPoul-Henning Kamp 	.vop_remove =		VOP_PANIC,
95aec0fb7bSPoul-Henning Kamp 	.vop_rename =		VOP_PANIC,
96aec0fb7bSPoul-Henning Kamp 	.vop_rmdir =		VOP_PANIC,
97aec0fb7bSPoul-Henning Kamp 	.vop_setattr =		VOP_EBADF,
98aec0fb7bSPoul-Henning Kamp 	.vop_symlink =		VOP_PANIC,
99dce357b1SPoul-Henning Kamp 	.vop_write =		VOP_PANIC,
100df8bae1dSRodney W. Grimes };
1016fa079fcSMateusz Guzik VFS_VOP_VECTOR_REGISTER(fifo_specops);
102c901836cSGarrett Wollman 
103df8bae1dSRodney W. Grimes /*
1048d0c2475SDon Lewis  * Dispose of fifo resources.
1058d0c2475SDon Lewis  */
1068d0c2475SDon Lewis static void
fifo_cleanup(struct vnode * vp)1078d0c2475SDon Lewis fifo_cleanup(struct vnode *vp)
1088d0c2475SDon Lewis {
10911ac7ec0SKip Macy 	struct fifoinfo *fip;
1108d0c2475SDon Lewis 
111be09858aSJohn Baldwin 	ASSERT_VOP_ELOCKED(vp, "fifo_cleanup");
11211ac7ec0SKip Macy 	fip = vp->v_fifoinfo;
11395c6cd2fSDon Lewis 	if (fip->fi_readers == 0 && fip->fi_writers == 0) {
1148d0c2475SDon Lewis 		vp->v_fifoinfo = NULL;
11511ac7ec0SKip Macy 		pipe_dtor(fip->fi_pipe);
1161ede983cSDag-Erling Smørgrav 		free(fip, M_VNODE);
11795c6cd2fSDon Lewis 	}
1188d0c2475SDon Lewis }
1198d0c2475SDon Lewis 
1208d0c2475SDon Lewis /*
121df8bae1dSRodney W. Grimes  * Open called to set up a new instance of a fifo or
122df8bae1dSRodney W. Grimes  * to find an active instance of a fifo.
123df8bae1dSRodney W. Grimes  */
124df8bae1dSRodney W. Grimes /* ARGSUSED */
125138ec1f7SPoul-Henning Kamp static int
fifo_open(struct vop_open_args * ap)126*ed40bc50SMateusz Guzik fifo_open(struct vop_open_args *ap)
127df8bae1dSRodney W. Grimes {
12811ac7ec0SKip Macy 	struct vnode *vp;
12911ac7ec0SKip Macy 	struct file *fp;
13011ac7ec0SKip Macy 	struct thread *td;
131996c772fSJohn Dyson 	struct fifoinfo *fip;
13211ac7ec0SKip Macy 	struct pipe *fpipe;
1331d48f121SKonstantin Belousov 	u_int gen;
134e3612a4cSKonstantin Belousov 	int error, stops_deferred;
135df8bae1dSRodney W. Grimes 
13611ac7ec0SKip Macy 	vp = ap->a_vp;
13711ac7ec0SKip Macy 	fp = ap->a_fp;
13811ac7ec0SKip Macy 	td = ap->a_td;
13957fd3d55SPawel Jakub Dawidek 	ASSERT_VOP_ELOCKED(vp, "fifo_open");
140f26ca5ecSKonstantin Belousov 	if (fp == NULL || (ap->a_mode & FEXEC) != 0)
141945a519aSRobert Watson 		return (EINVAL);
142df8bae1dSRodney W. Grimes 	if ((fip = vp->v_fifoinfo) == NULL) {
143c6d3d601SKonstantin Belousov 		error = pipe_named_ctor(&fpipe, td);
144c6d3d601SKonstantin Belousov 		if (error != 0)
145c6d3d601SKonstantin Belousov 			return (error);
146b9ca419aSMark Johnston 		fip = malloc(sizeof(*fip), M_VNODE, M_WAITOK | M_ZERO);
14711ac7ec0SKip Macy 		fip->fi_pipe = fpipe;
148b9ca419aSMark Johnston 		fpipe->pipe_wgen = 0;
14911ac7ec0SKip Macy  		KASSERT(vp->v_fifoinfo == NULL, ("fifo_open: v_fifoinfo race"));
150b1562816SDon Lewis 		vp->v_fifoinfo = fip;
151df8bae1dSRodney W. Grimes 	}
15211ac7ec0SKip Macy 	fpipe = fip->fi_pipe;
15311ac7ec0SKip Macy  	KASSERT(fpipe != NULL, ("fifo_open: pipe is NULL"));
1543a140162SDon Lewis 
1553a140162SDon Lewis 	/*
15611ac7ec0SKip Macy 	 * Use the pipe mutex here, in addition to the vnode lock,
1579c766408SAttilio Rao 	 * in order to allow vnode lock dropping before msleep() calls
1589c766408SAttilio Rao 	 * and still avoiding missed wakeups.
1593a140162SDon Lewis 	 */
16011ac7ec0SKip Macy 	PIPE_LOCK(fpipe);
161996c772fSJohn Dyson 	if (ap->a_mode & FREAD) {
162df8bae1dSRodney W. Grimes 		fip->fi_readers++;
1631d48f121SKonstantin Belousov 		fip->fi_rgen++;
164df8bae1dSRodney W. Grimes 		if (fip->fi_readers == 1) {
16511ac7ec0SKip Macy 			fpipe->pipe_state &= ~PIPE_EOF;
1669b227224SMark Johnston 			if (fip->fi_writers > 0) {
167521f364bSDag-Erling Smørgrav 				wakeup(&fip->fi_writers);
1689b227224SMark Johnston 				pipeselwakeup(fpipe);
1699b227224SMark Johnston 			}
170df8bae1dSRodney W. Grimes 		}
17138b06f8aSAlan Somers 		fp->f_pipegen = fpipe->pipe_wgen - fip->fi_writers;
172df8bae1dSRodney W. Grimes 	}
173996c772fSJohn Dyson 	if (ap->a_mode & FWRITE) {
174b1562816SDon Lewis 		if ((ap->a_mode & O_NONBLOCK) && fip->fi_readers == 0) {
17511ac7ec0SKip Macy 			PIPE_UNLOCK(fpipe);
1769c766408SAttilio Rao 			if (fip->fi_writers == 0)
1779c766408SAttilio Rao 				fifo_cleanup(vp);
178b1562816SDon Lewis 			return (ENXIO);
179b1562816SDon Lewis 		}
180df8bae1dSRodney W. Grimes 		fip->fi_writers++;
1811d48f121SKonstantin Belousov 		fip->fi_wgen++;
182df8bae1dSRodney W. Grimes 		if (fip->fi_writers == 1) {
18311ac7ec0SKip Macy 			fpipe->pipe_state &= ~PIPE_EOF;
1849b227224SMark Johnston 			if (fip->fi_readers > 0) {
185521f364bSDag-Erling Smørgrav 				wakeup(&fip->fi_readers);
1869b227224SMark Johnston 				pipeselwakeup(fpipe);
1879b227224SMark Johnston 			}
188df8bae1dSRodney W. Grimes 		}
189996c772fSJohn Dyson 	}
190b1562816SDon Lewis 	if ((ap->a_mode & O_NONBLOCK) == 0) {
191b1562816SDon Lewis 		if ((ap->a_mode & FREAD) && fip->fi_writers == 0) {
1921d48f121SKonstantin Belousov 			gen = fip->fi_wgen;
193b249ce48SMateusz Guzik 			VOP_UNLOCK(vp);
1943a1e5dd8SKonstantin Belousov 			stops_deferred = sigdeferstop(SIGDEFERSTOP_OFF);
19511ac7ec0SKip Macy 			error = msleep(&fip->fi_readers, PIPE_MTX(fpipe),
1962526dc2bSDon Lewis 			    PDROP | PCATCH | PSOCK, "fifoor", 0);
1973a1e5dd8SKonstantin Belousov 			sigallowstop(stops_deferred);
198cb05b60aSAttilio Rao 			vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
1991d48f121SKonstantin Belousov 			if (error != 0 && gen == fip->fi_wgen) {
2003a140162SDon Lewis 				fip->fi_readers--;
2012526dc2bSDon Lewis 				if (fip->fi_readers == 0) {
20211ac7ec0SKip Macy 					PIPE_LOCK(fpipe);
20311ac7ec0SKip Macy 					fpipe->pipe_state |= PIPE_EOF;
20411ac7ec0SKip Macy 					if (fpipe->pipe_state & PIPE_WANTW)
20511ac7ec0SKip Macy 						wakeup(fpipe);
2069b227224SMark Johnston 					pipeselwakeup(fpipe);
20711ac7ec0SKip Macy 					PIPE_UNLOCK(fpipe);
2088d0c2475SDon Lewis 					fifo_cleanup(vp);
2092526dc2bSDon Lewis 				}
2103a140162SDon Lewis 				return (error);
2113a140162SDon Lewis 			}
21211ac7ec0SKip Macy 			PIPE_LOCK(fpipe);
213520cab0aSBruce Evans 			/*
214520cab0aSBruce Evans 			 * We must have got woken up because we had a writer.
215520cab0aSBruce Evans 			 * That (and not still having one) is the condition
216520cab0aSBruce Evans 			 * that we must wait for.
217520cab0aSBruce Evans 			 */
218996c772fSJohn Dyson 		}
219b1562816SDon Lewis 		if ((ap->a_mode & FWRITE) && fip->fi_readers == 0) {
2201d48f121SKonstantin Belousov 			gen = fip->fi_rgen;
221b249ce48SMateusz Guzik 			VOP_UNLOCK(vp);
2223a1e5dd8SKonstantin Belousov 			stops_deferred = sigdeferstop(SIGDEFERSTOP_OFF);
22311ac7ec0SKip Macy 			error = msleep(&fip->fi_writers, PIPE_MTX(fpipe),
2242526dc2bSDon Lewis 			    PDROP | PCATCH | PSOCK, "fifoow", 0);
2253a1e5dd8SKonstantin Belousov 			sigallowstop(stops_deferred);
226cb05b60aSAttilio Rao 			vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
2271d48f121SKonstantin Belousov 			if (error != 0 && gen == fip->fi_rgen) {
2283a140162SDon Lewis 				fip->fi_writers--;
2292526dc2bSDon Lewis 				if (fip->fi_writers == 0) {
23011ac7ec0SKip Macy 					PIPE_LOCK(fpipe);
23111ac7ec0SKip Macy 					fpipe->pipe_state |= PIPE_EOF;
23211ac7ec0SKip Macy 					if (fpipe->pipe_state & PIPE_WANTR)
23311ac7ec0SKip Macy 						wakeup(fpipe);
2345ff2bb52SDavid Xu 					fpipe->pipe_wgen++;
2359b227224SMark Johnston 					pipeselwakeup(fpipe);
23611ac7ec0SKip Macy 					PIPE_UNLOCK(fpipe);
2378d0c2475SDon Lewis 					fifo_cleanup(vp);
2382526dc2bSDon Lewis 				}
2393a140162SDon Lewis 				return (error);
2403a140162SDon Lewis 			}
241520cab0aSBruce Evans 			/*
242520cab0aSBruce Evans 			 * We must have got woken up because we had
243520cab0aSBruce Evans 			 * a reader.  That (and not still having one)
244520cab0aSBruce Evans 			 * is the condition that we must wait for.
245520cab0aSBruce Evans 			 */
24611ac7ec0SKip Macy 			PIPE_LOCK(fpipe);
2473a140162SDon Lewis 		}
2483a140162SDon Lewis 	}
24911ac7ec0SKip Macy 	PIPE_UNLOCK(fpipe);
2509e223287SKonstantin Belousov 	KASSERT(fp != NULL, ("can't fifo/vnode bypass"));
2515cb471d0SPoul-Henning Kamp 	KASSERT(fp->f_ops == &badfileops, ("not badfileops in fifo_open"));
25211ac7ec0SKip Macy 	finit(fp, fp->f_flag, DTYPE_FIFO, fpipe, &pipeops);
25388f39e8eSRobert Watson 	return (0);
25488f39e8eSRobert Watson }
25588f39e8eSRobert Watson 
256df8bae1dSRodney W. Grimes /*
257df8bae1dSRodney W. Grimes  * Device close routine
258df8bae1dSRodney W. Grimes  */
259df8bae1dSRodney W. Grimes /* ARGSUSED */
260138ec1f7SPoul-Henning Kamp static int
fifo_close(struct vop_close_args * ap)261*ed40bc50SMateusz Guzik fifo_close(struct vop_close_args *ap)
262df8bae1dSRodney W. Grimes {
26311ac7ec0SKip Macy 	struct vnode *vp;
26411ac7ec0SKip Macy 	struct fifoinfo *fip;
26511ac7ec0SKip Macy 	struct pipe *cpipe;
2663a140162SDon Lewis 
26711ac7ec0SKip Macy 	vp = ap->a_vp;
268be09858aSJohn Baldwin 	ASSERT_VOP_ELOCKED(vp, "fifo_close");
26910db1896SKonstantin Belousov 	fip = vp->v_fifoinfo;
27010db1896SKonstantin Belousov 
27110db1896SKonstantin Belousov 	/*
27210db1896SKonstantin Belousov 	 * During open, it is possible that the fifo vnode is relocked
27310db1896SKonstantin Belousov 	 * after the vnode is instantiated but before VOP_OPEN() is
27410db1896SKonstantin Belousov 	 * done.  For instance, vn_open_vnode() might need to upgrade
27510db1896SKonstantin Belousov 	 * vnode lock, or ffs_vput_pair() needs to unlock vp to sync
27610db1896SKonstantin Belousov 	 * dvp.  In this case, reclaim can observe us with v_fifoinfo
27710db1896SKonstantin Belousov 	 * equal to NULL.
27810db1896SKonstantin Belousov 	 */
27910db1896SKonstantin Belousov 	if (fip == NULL)
28010db1896SKonstantin Belousov 		return (0);
28110db1896SKonstantin Belousov 
28210db1896SKonstantin Belousov 	cpipe = fip->fi_pipe;
28378f1a844SJordan K. Hubbard 	if (ap->a_fflag & FREAD) {
284df8bae1dSRodney W. Grimes 		fip->fi_readers--;
28511ac7ec0SKip Macy 		if (fip->fi_readers == 0) {
28611ac7ec0SKip Macy 			PIPE_LOCK(cpipe);
28711ac7ec0SKip Macy 			cpipe->pipe_state |= PIPE_EOF;
28812a480faSDavid Xu 			if ((cpipe->pipe_state & PIPE_WANTW)) {
28912a480faSDavid Xu 				cpipe->pipe_state &= ~PIPE_WANTW;
29011ac7ec0SKip Macy 				wakeup(cpipe);
29112a480faSDavid Xu 			}
29212a480faSDavid Xu 			pipeselwakeup(cpipe);
29311ac7ec0SKip Macy 			PIPE_UNLOCK(cpipe);
29411ac7ec0SKip Macy 		}
295df8bae1dSRodney W. Grimes 	}
296996c772fSJohn Dyson 	if (ap->a_fflag & FWRITE) {
297996c772fSJohn Dyson 		fip->fi_writers--;
2987f5dff50SKonstantin Belousov 		if (fip->fi_writers == 0) {
29911ac7ec0SKip Macy 			PIPE_LOCK(cpipe);
30011ac7ec0SKip Macy 			cpipe->pipe_state |= PIPE_EOF;
30112a480faSDavid Xu 			if ((cpipe->pipe_state & PIPE_WANTR)) {
30212a480faSDavid Xu 				cpipe->pipe_state &= ~PIPE_WANTR;
30311ac7ec0SKip Macy 				wakeup(cpipe);
30412a480faSDavid Xu 			}
3055ff2bb52SDavid Xu 			cpipe->pipe_wgen++;
30612a480faSDavid Xu 			pipeselwakeup(cpipe);
30711ac7ec0SKip Macy 			PIPE_UNLOCK(cpipe);
3087f5dff50SKonstantin Belousov 		}
309996c772fSJohn Dyson 	}
3108d0c2475SDon Lewis 	fifo_cleanup(vp);
3113a140162SDon Lewis 	return (0);
312df8bae1dSRodney W. Grimes }
313df8bae1dSRodney W. Grimes 
314623ae52eSPoul-Henning Kamp /*
315623ae52eSPoul-Henning Kamp  * Print out internal contents of a fifo vnode.
316623ae52eSPoul-Henning Kamp  */
317623ae52eSPoul-Henning Kamp int
fifo_printinfo(struct vnode * vp)318*ed40bc50SMateusz Guzik fifo_printinfo(struct vnode *vp)
319623ae52eSPoul-Henning Kamp {
3203e85b721SEd Maste 	struct fifoinfo *fip = vp->v_fifoinfo;
321623ae52eSPoul-Henning Kamp 
32245cdcb7aSMike Pritchard 	if (fip == NULL){
32345cdcb7aSMike Pritchard 		printf(", NULL v_fifoinfo");
32445cdcb7aSMike Pritchard 		return (0);
32545cdcb7aSMike Pritchard 	}
326623ae52eSPoul-Henning Kamp 	printf(", fifo with %ld readers and %ld writers",
327623ae52eSPoul-Henning Kamp 		fip->fi_readers, fip->fi_writers);
328623ae52eSPoul-Henning Kamp 	return (0);
329623ae52eSPoul-Henning Kamp }
330623ae52eSPoul-Henning Kamp 
331df8bae1dSRodney W. Grimes /*
332df8bae1dSRodney W. Grimes  * Print out the contents of a fifo vnode.
333df8bae1dSRodney W. Grimes  */
334f708ef1bSPoul-Henning Kamp static int
fifo_print(struct vop_print_args * ap)335*ed40bc50SMateusz Guzik fifo_print(struct vop_print_args *ap)
336df8bae1dSRodney W. Grimes {
3378941aad1SJohn Baldwin 	printf("    ");
338df8bae1dSRodney W. Grimes 	fifo_printinfo(ap->a_vp);
339df8bae1dSRodney W. Grimes 	printf("\n");
34026f9a767SRodney W. Grimes 	return (0);
341df8bae1dSRodney W. Grimes }
342df8bae1dSRodney W. Grimes 
343df8bae1dSRodney W. Grimes /*
344df8bae1dSRodney W. Grimes  * Fifo advisory byte-level locks.
345df8bae1dSRodney W. Grimes  */
346df8bae1dSRodney W. Grimes /* ARGSUSED */
347138ec1f7SPoul-Henning Kamp static int
fifo_advlock(struct vop_advlock_args * ap)348*ed40bc50SMateusz Guzik fifo_advlock(struct vop_advlock_args *ap)
349df8bae1dSRodney W. Grimes {
350df8bae1dSRodney W. Grimes 
351d71e1a88SMateusz Guzik 	if ((ap->a_flags & F_FLOCK) == 0)
352d71e1a88SMateusz Guzik 		return (EINVAL);
353d71e1a88SMateusz Guzik 	return (vop_stdadvlock(ap));
354df8bae1dSRodney W. Grimes }
355