Home | History | Annotate | Download | only in fs
      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 /*
     22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
     27 /*	  All Rights Reserved  	*/
     28 
     29 
     30 #ifndef	_SYS_FS_FIFONODE_H
     31 #define	_SYS_FS_FIFONODE_H
     32 
     33 #if defined(_KERNEL)
     34 #include <sys/vfs_opreg.h>
     35 #endif
     36 
     37 #ifdef	__cplusplus
     38 extern "C" {
     39 #endif
     40 
     41 
     42 /*
     43  * Each FIFOFS object is identified by a struct fifonode/vnode pair.
     44  * This is also the hierarchy
     45  * flk_lock protects:
     46  *		fn_mp
     47  *		fn_tail
     48  *		fn_count
     49  *		fn_flag
     50  *		fn_wcnt
     51  *		fn_rcnt
     52  *		fn_open
     53  *		fn_rsynccnt
     54  *		fn_wsynccnt
     55  *		fn_wwaitcnt
     56  *		fn_atime
     57  *		fn_mtime
     58  *		fn_ctime
     59  *		fn_insync
     60  *		flk_ref
     61  *		flk_ocsync
     62  * ftable lock protects		- actually this is independent
     63  *		fifoalloc[]
     64  *		fn_nextp
     65  *		fn_backp
     66  */
     67 typedef struct fifolock {
     68 	kmutex_t	flk_lock;	/* fifo lock */
     69 	int		flk_ref;	/* number of fifonodes using this */
     70 	short		flk_ocsync;	/* sync open/close */
     71 	kcondvar_t	flk_wait_cv;	/* conditional for flk_ocsync */
     72 	uint_t		flk_fill[4];	/* cache align lock structure */
     73 } fifolock_t;
     74 
     75 typedef struct fifonode fifonode_t;
     76 
     77 struct fifonode {
     78 	struct vnode	*fn_vnode;	/* represents the fifo/pipe */
     79 	struct vnode	*fn_realvp;	/* node being shadowed by fifo */
     80 	ino_t		fn_ino;		/* node id for pipes */
     81 	fifonode_t	*fn_dest;	/* the other end of a pipe */
     82 	struct msgb	*fn_mp;		/* message waiting to be read */
     83 	struct msgb	*fn_tail;	/* last message to read */
     84 	fifolock_t	*fn_lock;	/* pointer to per fifo lock */
     85 	uint_t		fn_count;	/* Number of bytes on fn_mp */
     86 	kcondvar_t	fn_wait_cv;	/* fifo conditional variable */
     87 	ushort_t	fn_wcnt;	/* number of writers */
     88 	ushort_t	fn_rcnt;	/* number of readers */
     89 	ushort_t	fn_open;	/* open count of node */
     90 	ushort_t	fn_wsynccnt;	/* fifos waiting for open write sync */
     91 	ushort_t	fn_rsynccnt;	/* fifos waiting for open read sync */
     92 	ushort_t	fn_wwaitcnt;	/* threads waiting to write data */
     93 	time_t		fn_atime;	/* access times */
     94 	time_t		fn_mtime;	/* modification time */
     95 	time_t		fn_ctime;	/* change time */
     96 	fifonode_t	*fn_nextp;	/* next link in the linked list */
     97 	fifonode_t	*fn_backp;	/* back link in linked list */
     98 	struct cred	*fn_pcredp;	/* credential associated with peer */
     99 	pid_t		fn_cpid;	/* original peer pid */
    100 	int		fn_insync;
    101 	uint_t		fn_flag;	/* flags as defined below */
    102 };
    103 
    104 
    105 typedef struct fifodata {
    106 	fifolock_t	fifo_lock;
    107 	fifonode_t	fifo_fnode[2];
    108 } fifodata_t;
    109 
    110 /*
    111  * Valid flags for fifonodes.
    112  */
    113 #define	ISPIPE		0x0001	/* fifonode is that of a pipe */
    114 #define	FIFOSEND	0x0002	/* file descriptor at stream head of pipe */
    115 #define	FIFOOPEN	0x0004	/* fifo is opening */
    116 #define	FIFOCLOSE	0x0008	/* fifo is closing */
    117 #define	FIFOCONNLD	0x0010	/* connld pushed on pipe */
    118 #define	FIFOFAST	0x0020	/* FIFO in fast mode */
    119 #define	FIFOWANTR	0x0040	/* reader waiting for data */
    120 #define	FIFOWANTW	0x0080	/* writer waiting to write */
    121 #define	FIFOSETSIG	0x0100	/* I_SETSIG ioctl was issued */
    122 #define	FIFOHIWATW	0x0200	/* We have gone over hi water mark */
    123 #define	FIFORWBUSY	0x0400	/* Fifo is busy in read or write */
    124 #define	FIFOPOLLW	0x0800	/* process waiting on poll write */
    125 #define	FIFOPOLLR	0x1000	/* process waiting on poll read */
    126 #define	FIFOISOPEN	0x2000	/* pipe is open */
    127 #define	FIFOSYNC	0x4000	/* FIFO is waiting for open sync */
    128 #define	FIFOWOCR	0x8000	/* Write open occurred */
    129 #define	FIFOROCR	0x10000	/* Read open occurred */
    130 /*
    131  * process waiting on poll read on band data
    132  * this can only occur if we go to streams
    133  * mode
    134  */
    135 #define	FIFOPOLLRBAND	0x20000
    136 #define	FIFOSTAYFAST	0x40000	/* don't turn into stream mode */
    137 #define	FIFOWAITMODE	0x80000	/* waiting for the possibility to change mode */
    138 
    139 #define	FIFOHIWAT	(16 * 1024)
    140 #define	FIFOLOWAT	(0)
    141 
    142 /*
    143  * Macros to convert a vnode to a fifnode, and vice versa.
    144  */
    145 #define	VTOF(vp) ((struct fifonode *)((vp)->v_data))
    146 #define	FTOV(fp) ((fp)->fn_vnode)
    147 
    148 #if defined(_KERNEL)
    149 
    150 /*
    151  * Fifohiwat defined as a variable is to allow tuning of the high
    152  * water mark if needed. It is not meant to be released.
    153  */
    154 #if FIFODEBUG
    155 extern int Fifohiwat;
    156 #else /* FIFODEBUG */
    157 #define	Fifohiwat	FIFOHIWAT
    158 #endif /* FIFODEBUG */
    159 
    160 extern struct vnodeops *fifo_vnodeops;
    161 extern const struct fs_operation_def fifo_vnodeops_template[];
    162 extern struct kmem_cache *fnode_cache;
    163 extern struct kmem_cache *pipe_cache;
    164 
    165 struct vfssw;
    166 struct queue;
    167 
    168 extern int	fifoinit(int, char *);
    169 extern int	fifo_stropen(vnode_t **, int, cred_t *, int, int);
    170 extern int	fifo_open(vnode_t **, int, cred_t *, caller_context_t *);
    171 extern int	fifo_close(vnode_t *, int, int, offset_t, cred_t *,
    172 			caller_context_t *);
    173 extern void	fifo_cleanup(vnode_t *, int);
    174 extern void	fiforemove(fifonode_t *);
    175 extern ino_t	fifogetid(void);
    176 extern vnode_t	*fifovp(vnode_t *, cred_t *);
    177 extern void	makepipe(vnode_t **, vnode_t **);
    178 extern void	fifo_fastflush(fifonode_t *);
    179 extern void	fifo_vfastoff(vnode_t *);
    180 extern void	fifo_fastoff(fifonode_t *);
    181 extern struct streamtab *fifo_getinfo();
    182 extern void	fifo_wakereader(fifonode_t *, fifolock_t *);
    183 extern void	fifo_wakewriter(fifonode_t *, fifolock_t *);
    184 
    185 #endif /* _KERNEL */
    186 
    187 #ifdef	__cplusplus
    188 }
    189 #endif
    190 
    191 #endif	/* _SYS_FS_FIFONODE_H */
    192