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