2 * Copyright 2000, International Business Machines Corporation and others.
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
11 * Linux interpretations of vnode and vfs structs.
13 * The Linux "inode" has been abstracted to the fs independent part to avoid
14 * wasting 100+bytes per vnode.
20 /* The vnode should match the current implementation of the fs independent
21 * part of the Linux inode.
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;
31 #if defined(STRUCT_INODE_HAS_I_DIRTY_DATA_BUFFERS)
32 struct list_head i_dirty_data_buffers;
42 #if defined(AFS_LINUX24_ENV) || defined(pgoff2loff)
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;
56 #ifdef STRUCT_INODE_HAS_I_BYTES
57 unsigned short i_bytes;
59 struct semaphore i_sem;
60 #ifdef STRUCT_INODE_HAS_I_TRUNCATE_SEM
61 struct rw_semaphore i_truncate_sem;
63 #if defined(AFS_LINUX24_ENV)
64 struct semaphore i_zombie;
66 struct semaphore i_atomic_write;
68 struct inode_operations *i_op;
69 #if defined(AFS_LINUX24_ENV)
70 struct file_operations *i_fop;
72 struct super_block *i_sb;
73 #if defined(AFS_LINUX24_ENV)
74 wait_queue_head_t i_wait;
76 struct wait_queue *i_wait;
78 struct file_lock *i_flock;
79 #if defined(AFS_LINUX24_ENV)
80 struct address_space *i_mapping;
81 struct address_space i_data;
83 struct vm_area_struct *i_mmap;
84 #if defined(STRUCT_INODE_HAS_I_MMAP_SHARED)
85 struct vm_area_struct *i_mmap_shared;
89 #if defined(STRUCT_INODE_HAS_I_MAPPING_OVERLOAD)
90 int i_mapping_overload;
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;
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;
102 unsigned long i_dnotify_mask;
103 struct dnotify_struct *i_dnotify;
106 unsigned long i_state;
108 unsigned int i_flags;
109 #if !defined(AFS_LINUX24_ENV)
110 unsigned char i_pipe;
112 unsigned char i_sock;
114 #if defined(AFS_LINUX24_ENV)
115 atomic_t i_writecount;
119 unsigned int i_attr_flags;
120 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,10)
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;
149 /* Map vnode fields to inode fields. */
150 #define i_number i_ino
151 #define v_count i_count
153 #if defined(AFS_LINUX24_ENV)
156 #define v_type i_mode
158 #define vfs_vnodecovered s_covered
160 /* v_type bits map to mode bits: */
167 #define VSOCK S_IFSOCK
169 /* vcexcl - used only by afs_create */
170 enum vcexcl { EXCL, NONEXCL } ;
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
177 #define IO_APPEND O_APPEND
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)))
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
195 #define vfs super_block
197 typedef struct vattr {
198 int va_type; /* One of v_types above. */
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. */
206 int va_fsid; /* Not used? */
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;
215 #define VATTR_NULL(A) memset(A, 0, sizeof(struct vattr))
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.
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
229 #define vnodeops inode_operations
231 #endif /* OSI_VFS_H_ */