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