linux24-another-new-inode-field-sigh-20011001
[openafs.git] / src / afs / LINUX / osi_vfs.h
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /*
11  * Linux interpretations of vnode and vfs structs.
12  *
13  * The Linux "inode" has been abstracted to the fs independent part to avoid
14  * wasting 100+bytes per vnode.
15  */
16
17 #ifndef OSI_VFS_H_
18 #define OSI_VFS_H_
19
20 /* The vnode should match the current implementation of the fs independent
21  * part of the Linux inode.
22  */
23 /* The first cut is to continue to use a separate vnode pool. */
24 typedef struct vnode {
25         struct list_head        i_hash;
26         struct list_head        i_list;
27         struct list_head        i_dentry;
28 #if defined(AFS_LINUX24_ENV)
29         struct list_head        i_dirty_buffers;
30 #endif
31 #if defined(STRUCT_INODE_HAS_I_DIRTY_DATA_BUFFERS)
32         struct list_head        i_dirty_data_buffers;
33 #endif
34         unsigned long           i_ino;
35         unsigned int            i_count;
36         kdev_t                  i_dev;
37         umode_t                 i_mode;
38         nlink_t                 i_nlink;
39         uid_t                   i_uid;
40         gid_t                   i_gid;
41         kdev_t                  i_rdev;
42 #if defined(AFS_LINUX24_ENV) || defined(pgoff2loff) 
43         loff_t                  i_size;
44 #else
45         off_t                   i_size;
46 #endif
47         time_t                  i_atime;
48         time_t                  i_mtime;
49         time_t                  i_ctime;
50         unsigned long           i_blksize;
51         unsigned long           i_blocks;
52         unsigned long           i_version;
53 #if !defined(AFS_LINUX24_ENV)
54         unsigned long           i_nrpages;
55 #endif
56 #ifdef STRUCT_INODE_HAS_I_BYTES
57         unsigned short          i_bytes;
58 #endif
59         struct semaphore        i_sem;
60 #ifdef STRUCT_INODE_HAS_I_TRUNCATE_SEM
61         struct rw_semaphore     i_truncate_sem;
62 #endif
63 #if defined(AFS_LINUX24_ENV)
64         struct semaphore        i_zombie;
65 #else
66         struct semaphore        i_atomic_write;
67 #endif
68         struct inode_operations *i_op;
69 #if defined(AFS_LINUX24_ENV)
70         struct file_operations  *i_fop;
71 #endif
72         struct super_block      *i_sb;
73 #if defined(AFS_LINUX24_ENV)
74         wait_queue_head_t       i_wait;
75 #else
76         struct wait_queue       *i_wait;
77 #endif
78         struct file_lock        *i_flock;
79 #if defined(AFS_LINUX24_ENV)
80         struct address_space    *i_mapping;
81         struct address_space    i_data;
82 #else
83         struct vm_area_struct   *i_mmap;
84 #if defined(STRUCT_INODE_HAS_I_MMAP_SHARED)
85         struct vm_area_struct   *i_mmap_shared;
86 #endif
87         struct page             *i_pages;
88 #endif
89 #if defined(STRUCT_INODE_HAS_I_MAPPING_OVERLOAD)
90         int                     i_mapping_overload;
91 #endif
92         struct dquot            *i_dquot[MAXQUOTAS];
93 #if defined(AFS_LINUX24_ENV)
94 #if defined(STRUCT_INODE_HAS_I_DEVICES)
95         struct list_head        i_devices;
96 #endif
97         struct pipe_inode_info  *i_pipe;
98         struct block_device     *i_bdev;
99 #if defined(STRUCT_INODE_HAS_I_CDEV)
100         struct char_device      *i_cdev;
101 #endif
102         unsigned long           i_dnotify_mask;
103         struct dnotify_struct   *i_dnotify;
104 #endif
105
106         unsigned long           i_state;
107
108         unsigned int            i_flags;
109 #if !defined(AFS_LINUX24_ENV)
110         unsigned char           i_pipe;
111 #endif
112         unsigned char           i_sock;
113
114 #if defined(AFS_LINUX24_ENV)
115         atomic_t                i_writecount;
116 #else
117         int                     i_writecount;
118 #endif
119         unsigned int            i_attr_flags;
120 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,10)
121         __u32                   i_generation;
122 #endif
123 #ifdef notdef
124         union {
125                 struct pipe_inode_info          pipe_i;
126                 struct minix_inode_info         minix_i;
127                 struct ext2_inode_info          ext2_i;
128                 struct hpfs_inode_info          hpfs_i;
129                 struct ntfs_inode_info          ntfs_i;
130                 struct msdos_inode_info         msdos_i;
131                 struct umsdos_inode_info        umsdos_i;
132                 struct iso_inode_info           isofs_i;
133                 struct nfs_inode_info           nfs_i;
134                 struct sysv_inode_info          sysv_i;
135                 struct affs_inode_info          affs_i;
136                 struct ufs_inode_info           ufs_i;
137                 struct romfs_inode_info         romfs_i;
138                 struct coda_inode_info          coda_i;
139                 struct smb_inode_info           smbfs_i;
140                 struct hfs_inode_info           hfs_i;
141                 struct adfs_inode_info          adfs_i;
142                 struct qnx4_inode_info          qnx4_i;    
143                 struct socket                   socket_i;
144                 void                            *generic_ip;
145         } u;
146 #endif
147 } vnode_t;
148
149 /* Map vnode fields to inode fields. */
150 #define i_number        i_ino
151 #define v_count         i_count
152 #define v_op            i_op
153 #if defined(AFS_LINUX24_ENV)
154 #define v_fop           i_fop
155 #endif
156 #define v_type          i_mode
157 #define v_vfsp          i_sb
158 #define vfs_vnodecovered s_covered
159
160 /* v_type bits map to mode bits: */
161 #define VNON 0
162 #define VREG S_IFREG
163 #define VDIR S_IFDIR
164 #define VBLK S_IFBLK
165 #define VCHR S_IFCHR
166 #define VLNK S_IFLNK
167 #define VSOCK S_IFSOCK
168
169 /* vcexcl - used only by afs_create */
170 enum vcexcl { EXCL, NONEXCL } ;
171
172 /* afs_open and afs_close needs to distinguish these cases */
173 #define FWRITE  O_WRONLY|O_RDWR|O_APPEND
174 #define FTRUNC  O_TRUNC
175
176
177 #define IO_APPEND O_APPEND
178 #define FSYNC O_SYNC
179
180 #define VTOI(V)  ((struct inode*)V)
181 #define VN_HOLD(V) ((vnode_t*)V)->i_count++;
182 #define VN_RELE(V) osi_iput((struct inode *)V);
183 #define VFS_STATFS(V, S) ((V)->s_op->statfs)((V), (S), sizeof(*(S)))
184
185
186
187 /* Various mode bits */
188 #define VWRITE  S_IWUSR
189 #define VREAD   S_IRUSR
190 #define VEXEC   S_IXUSR
191 #define VSUID   S_ISUID
192 #define VSGID   S_ISGID
193
194
195 #define vfs super_block
196
197 typedef struct vattr {
198     int         va_type;        /* One of v_types above. */
199     size_t      va_size;
200     unsigned long va_blocks;
201     unsigned long va_blocksize;
202     int         va_mask;        /* AT_xxx operation to perform. */
203     umode_t     va_mode;        /* mode bits. */
204     uid_t       va_uid;
205     gid_t       va_gid;
206     int         va_fsid;        /* Not used? */
207     dev_t       va_rdev;
208     ino_t       va_nodeid;      /* Inode number */
209     nlink_t     va_nlink;       /* link count for file. */
210     struct timeval va_atime;
211     struct timeval va_mtime;
212     struct timeval va_ctime;
213 } vattr_t;
214
215 #define VATTR_NULL(A) memset(A, 0, sizeof(struct vattr))
216
217
218 /* va_masks - these should match their respective ATTR_xxx #defines in fs.h.
219  * afs_notify_change has to use the attr bits in both the Linux and AFS
220  * meanings. The glue layer code uses the ATTR_xxx style names.
221  */
222 #define AT_SIZE         ATTR_SIZE
223 #define AT_MODE         ATTR_MODE
224 #define AT_UID          ATTR_UID
225 #define AT_GID          ATTR_GID
226 #define AT_MTIME        ATTR_MTIME
227
228
229 #define vnodeops inode_operations
230
231 #endif /* OSI_VFS_H_ */