xref: /illumos-gate/usr/src/uts/common/sys/file.h (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
23 /*	  All Rights Reserved  	*/
24 
25 
26 /*
27  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
28  * Use is subject to license terms.
29  */
30 
31 #ifndef _SYS_FILE_H
32 #define	_SYS_FILE_H
33 
34 #pragma ident	"%Z%%M%	%I%	%E% SMI"	/* SVr4.0 11.28 */
35 
36 #include <sys/t_lock.h>
37 #ifdef _KERNEL
38 #include <sys/model.h>
39 #include <sys/user.h>
40 #endif
41 
42 #ifdef	__cplusplus
43 extern "C" {
44 #endif
45 
46 /*
47  * fio locking:
48  *   f_rwlock	protects f_vnode and f_cred
49  *   f_tlock	protects the rest
50  *
51  *   The purpose of locking in this layer is to keep the kernel
52  *   from panicing if, for example, a thread calls close() while
53  *   another thread is doing a read().  It is up to higher levels
54  *   to make sure 2 threads doing I/O to the same file don't
55  *   screw each other up.
56  */
57 /*
58  * One file structure is allocated for each open/creat/pipe call.
59  * Main use is to hold the read/write pointer associated with
60  * each open file.
61  */
62 typedef struct file {
63 	kmutex_t	f_tlock;	/* short term lock */
64 	ushort_t	f_flag;
65 	ushort_t	f_pad;		/* Explicit pad to 4 byte boundary */
66 	struct vnode	*f_vnode;	/* pointer to vnode structure */
67 	offset_t	f_offset;	/* read/write character pointer */
68 	struct cred	*f_cred;	/* credentials of user who opened it */
69 	struct f_audit_data	*f_audit_data;	/* file audit data */
70 	int		f_count;	/* reference count */
71 } file_t;
72 
73 /*
74  * fpollinfo struct - used by poll caching to track who has polled the fd
75  */
76 typedef struct fpollinfo {
77 	struct _kthread		*fp_thread;	/* thread caching poll info */
78 	struct fpollinfo	*fp_next;
79 } fpollinfo_t;
80 
81 /* flags */
82 
83 #define	FOPEN		0xffffffff
84 #define	FREAD		0x01	/* <sys/aiocb.h> LIO_READ must be identical */
85 #define	FWRITE		0x02	/* <sys/aiocb.h> LIO_WRITE must be identical */
86 #define	FNDELAY		0x04
87 #define	FAPPEND		0x08
88 #define	FSYNC		0x10	/* file (data+inode) integrity while writing */
89 #ifdef C2_AUDIT
90 #define	FREVOKED	0x20	/* C2 Security - Revoke Subsystem */
91 #endif
92 #define	FDSYNC		0x40	/* file data only integrity while writing */
93 #define	FRSYNC		0x8000	/* sync read operations at same level of */
94 				/* integrity as specified for writes by */
95 				/* FSYNC and FDSYNC flags */
96 #define	FOFFMAX		0x2000	/* large file */
97 #define	FNONBLOCK	0x80
98 
99 #define	FMASK		0xa0ff	/* all flags that can be changed by F_SETFL */
100 
101 /* open-only modes */
102 
103 #define	FCREAT		0x0100
104 #define	FTRUNC		0x0200
105 #define	FEXCL		0x0400
106 #define	FNOCTTY		0x0800
107 #define	FXATTR		0x4000	/* open as extended attribute */
108 
109 #define	FASYNC		0x1000	/* asyncio in progress pseudo flag */
110 #define	FNODSYNC	0x10000 /* fsync pseudo flag */
111 
112 #define	FNOFOLLOW	0x20000	/* don't follow symlinks */
113 #define	FNOLINKS	0x40000	/* don't allow multiple hard links */
114 
115 #ifdef _KERNEL
116 
117 /*
118  * Fake flags for driver ioctl calls to inform them of the originating
119  * process' model.  See <sys/model.h>
120  *
121  * Part of the Solaris 2.6+ DDI/DKI
122  */
123 #define	FMODELS	DATAMODEL_MASK	/* Note: 0x0ff00000 */
124 #define	FILP32	DATAMODEL_ILP32
125 #define	FLP64	DATAMODEL_LP64
126 #define	FNATIVE	DATAMODEL_NATIVE
127 
128 /*
129  * Large Files: The macro gets the offset maximum (refer to LFS API doc)
130  * corresponding to a file descriptor. We had the choice of storing
131  * this value in file descriptor. Right now we only have two
132  * offset maximums one if MAXOFF_T and other is MAXOFFSET_T. It is
133  * inefficient to store these two values in a separate member in
134  * file descriptor. To avoid wasting spaces we define this macro.
135  * The day there are more than two offset maximum we may want to
136  * rewrite this macro.
137  */
138 
139 #define	OFFSET_MAX(fd)	((fd->f_flag & FOFFMAX) ? MAXOFFSET_T : MAXOFF32_T)
140 
141 /*
142  * Fake flag => internal ioctl call for layered drivers.
143  * Note that this flag deliberately *won't* fit into
144  * the f_flag field of a file_t.
145  *
146  * Part of the Solaris 2.x DDI/DKI.
147  */
148 #define	FKIOCTL		0x80000000	/* ioctl addresses are from kernel */
149 
150 /*
151  * Fake flag => this time to specify that the open(9E)
152  * comes from another part of the kernel, not userland.
153  *
154  * Part of the Solaris 2.x DDI/DKI.
155  */
156 #define	FKLYR		0x40000000	/* layered driver call */
157 
158 #endif	/* _KERNEL */
159 
160 /* miscellaneous defines */
161 
162 #ifndef L_SET
163 #define	L_SET	0	/* for lseek */
164 #endif /* L_SET */
165 
166 #if defined(_KERNEL)
167 
168 /*
169  * Routines dealing with user per-open file flags and
170  * user open files.
171  */
172 struct proc;	/* forward reference for function prototype */
173 struct vnodeops;
174 
175 extern file_t *getf(int);
176 extern void releasef(int);
177 extern void areleasef(int, uf_info_t *);
178 #ifndef	_BOOT
179 extern void closeall(uf_info_t *);
180 #endif
181 extern void flist_fork(uf_info_t *, uf_info_t *);
182 extern int closef(file_t *);
183 extern int closeandsetf(int, file_t *);
184 extern int ufalloc_file(int, file_t *);
185 extern int ufalloc(int);
186 extern int ufcanalloc(proc_t *, uint_t);
187 extern int falloc(struct vnode *, int, file_t **, int *);
188 extern void finit(void);
189 extern void unfalloc(file_t *);
190 extern void setf(int, file_t *);
191 extern int f_getfd_error(int, int *);
192 extern char f_getfd(int);
193 extern int f_setfd_error(int, int);
194 extern void f_setfd(int, char);
195 extern int f_getfl(int, int *);
196 extern int fassign(struct vnode **, int, int *);
197 extern void fcnt_add(uf_info_t *, int);
198 extern void close_exec(uf_info_t *);
199 extern void clear_stale_fd(void);
200 extern void clear_active_fd(int);
201 extern void free_afd(afd_t *afd);
202 extern int fisopen(struct vnode *);
203 extern void delfpollinfo(int);
204 extern void addfpollinfo(int);
205 extern int sock_getfasync(struct vnode *);
206 extern int files_can_change_zones(void);
207 #ifdef DEBUG
208 /* The following functions are only used in ASSERT()s */
209 extern void checkwfdlist(struct vnode *, fpollinfo_t *);
210 extern void checkfpollinfo(void);
211 extern int infpollinfo(int);
212 #endif	/* DEBUG */
213 
214 #endif	/* defined(_KERNEL) */
215 
216 #ifdef	__cplusplus
217 }
218 #endif
219 
220 #endif	/* _SYS_FILE_H */
221