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