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
  39 extern "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  */
  58 typedef 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  */
  72 typedef 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  */
 173 struct proc;    /* forward reference for function prototype */
 174 struct vnodeops;
 175 struct vattr;
 176 
 177 extern file_t *getf(int);
 178 extern void releasef(int);
 179 extern void areleasef(int, uf_info_t *);
 180 #ifndef _BOOT
 181 extern void closeall(uf_info_t *);
 182 #endif
 183 extern void flist_fork(uf_info_t *, uf_info_t *);
 184 extern int closef(file_t *);
 185 extern int closeandsetf(int, file_t *);
 186 extern int ufalloc_file(int, file_t *);
 187 extern int ufalloc(int);
 188 extern int ufcanalloc(struct proc *, uint_t);
 189 extern int falloc(struct vnode *, int, file_t **, int *);
 190 extern void finit(void);
 191 extern void unfalloc(file_t *);
 192 extern void setf(int, file_t *);
 193 extern int f_getfd_error(int, int *);
 194 extern char f_getfd(int);
 195 extern int f_setfd_error(int, int);
 196 extern void f_setfd(int, char);
 197 extern int f_getfl(int, int *);
 198 extern int f_badfd(int, int *, int);
 199 extern int fassign(struct vnode **, int, int *);
 200 extern void fcnt_add(uf_info_t *, int);
 201 extern void close_exec(uf_info_t *);
 202 extern void clear_stale_fd(void);
 203 extern void clear_active_fd(int);
 204 extern void free_afd(afd_t *afd);
 205 extern int fgetstartvp(int, char *, struct vnode **);
 206 extern int fsetattrat(int, char *, int, struct vattr *);
 207 extern int fisopen(struct vnode *);
 208 extern void delfpollinfo(int);
 209 extern void addfpollinfo(int);
 210 extern int sock_getfasync(struct vnode *);
 211 extern int files_can_change_zones(void);
 212 #ifdef DEBUG
 213 /* The following functions are only used in ASSERT()s */
 214 extern void checkwfdlist(struct vnode *, fpollinfo_t *);
 215 extern void checkfpollinfo(void);
 216 extern int infpollinfo(int);
 217 #endif  /* DEBUG */
 218 
 219 #endif  /* defined(_KERNEL) */
 220 
 221 #ifdef  __cplusplus
 222 }
 223 #endif
 224 
 225 #endif  /* _SYS_FILE_H */