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