reindent-20030715
[openafs.git] / src / vol / vnode.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         System:         VICE-TWO
12         Module:         vnode.h
13         Institution:    The Information Technology Center, Carnegie-Mellon University
14
15  */
16
17 #define Date afs_uint32
18
19 typedef struct ViceLock {
20     int lockCount;
21     int lockTime;
22 } ViceLock;
23
24 #define ViceLockCheckLocked(vptr) ((vptr)->lockTime == 0)
25 #define ViceLockClear(vptr) ((vptr)->lockCount = (vptr)->lockTime = 0)
26
27 #define ROOTVNODE 1
28
29 /*typedef enum {vNull=0, vFile=1, vDirectory=2, vSymlink=3} VnodeType;*/
30 typedef unsigned int VnodeType;
31 #define vNull 0
32 #define vFile 1
33 #define vDirectory 2
34 #define vSymlink 3
35
36 /*typedef enum {vLarge=0,vSmall=1} VnodeClass;*/
37 #define vLarge  0
38 #define vSmall  1
39 typedef int VnodeClass;
40 #define VNODECLASSWIDTH 1
41 #define VNODECLASSMASK  ((1<<VNODECLASSWIDTH)-1)
42 #define nVNODECLASSES   (VNODECLASSMASK+1)
43
44 struct VnodeClassInfo {
45     struct Vnode *lruHead;      /* Head of list of vnodes of this class */
46     int diskSize;               /* size of vnode disk object, power of 2 */
47     int logSize;                /* log 2 diskSize */
48     int residentSize;           /* resident size of vnode */
49     int cacheSize;              /* Vnode cache size */
50     bit32 magic;                /* Magic number for this type of vnode,
51                                  * for as long as we're using vnode magic
52                                  * numbers */
53     int allocs;                 /* Total number of successful allocation
54                                  * requests; this is the same as the number
55                                  * of sanity checks on the vnode index */
56     int gets, reads;            /* Number of VGetVnodes and corresponding
57                                  * reads */
58     int writes;                 /* Number of vnode writes */
59 };
60
61 extern struct VnodeClassInfo VnodeClassInfo[nVNODECLASSES];
62
63 #define vnodeTypeToClass(type)  ((type) == vDirectory? vLarge: vSmall)
64 #define vnodeIdToClass(vnodeId) ((vnodeId-1)&VNODECLASSMASK)
65 #define vnodeIdToBitNumber(v) (((v)-1)>>VNODECLASSWIDTH)
66 /* The following calculation allows for a header record at the beginning
67    of the index.  The header record is the same size as a vnode */
68 #define vnodeIndexOffset(vcp,vnodeNumber) \
69     ((vnodeIdToBitNumber(vnodeNumber)+1)<<(vcp)->logSize)
70 #define bitNumberToVnodeNumber(b,class) ((VnodeId)(((b)<<VNODECLASSWIDTH)+(class)+1))
71 #define vnodeIsDirectory(vnodeNumber) (vnodeIdToClass(vnodeNumber) == vLarge)
72
73 typedef struct VnodeDiskObject {
74     unsigned int type:3;        /* Vnode is file, directory, symbolic link
75                                  * or not allocated */
76     unsigned int cloned:1;      /* This vnode was cloned--therefore the inode
77                                  * is copy-on-write; only set for directories */
78     unsigned int modeBits:12;   /* Unix mode bits */
79     signed int linkCount:16;    /* Number of directory references to vnode
80                                  * (from single directory only!) */
81     bit32 length;               /* Number of bytes in this file */
82     Unique uniquifier;          /* Uniquifier for the vnode; assigned
83                                  * from the volume uniquifier (actually
84                                  * from nextVnodeUnique in the Volume
85                                  * structure) */
86     FileVersion dataVersion;    /* version number of the data */
87     afs_int32 vn_ino_lo;        /* inode number of the data attached to
88                                  * this vnode - entire ino for standard */
89     Date unixModifyTime;        /* set by user */
90     UserId author;              /* Userid of the last user storing the file */
91     UserId owner;               /* Userid of the user who created the file */
92     VnodeId parent;             /* Parent directory vnode */
93     bit32 vnodeMagic;           /* Magic number--mainly for file server
94                                  * paranoia checks */
95 #   define        SMALLVNODEMAGIC       0xda8c041F
96 #   define        LARGEVNODEMAGIC       0xad8765fe
97     /* Vnode magic can be removed, someday, if we run need the room.  Simply
98      * have to be sure that the thing we replace can be VNODEMAGIC, rather
99      * than 0 (in an old file system).  Or go through and zero the fields,
100      * when we notice a version change (the index version number) */
101     ViceLock lock;              /* Advisory lock */
102     Date serverModifyTime;      /* Used only by the server; for incremental
103                                  * backup purposes */
104     afs_int32 group;            /* unix group */
105     afs_int32 vn_ino_hi;        /* high part of 64 bit inode. */
106     bit32 reserved6;
107     /* Missing:
108      * archiving/migration
109      * encryption key
110      */
111 } VnodeDiskObject;
112
113 #define SIZEOF_SMALLDISKVNODE   64
114 #define CHECKSIZE_SMALLVNODE\
115         (sizeof(VnodeDiskObject) == SIZEOF_SMALLDISKVNODE)
116 #define SIZEOF_LARGEDISKVNODE   256
117
118 typedef struct Vnode {
119     struct Vnode *hashNext;     /* Next vnode on hash conflict chain */
120     struct Vnode *lruNext;      /* Less recently used vnode than this one */
121     struct Vnode *lruPrev;      /* More recently used vnode than this one */
122     /* The lruNext, lruPrev fields are not
123      * meaningful if the vnode is in use */
124     bit16 hashIndex;            /* Hash table index */
125 #ifdef  AFS_AIX_ENV
126     unsigned changed_newTime:1; /* 1 if vnode changed, write time */
127     unsigned changed_oldTime:1; /* 1 changed, don't update time. */
128     unsigned delete:1;          /* 1 if the vnode should be deleted; in
129                                  * this case, changed must also be 1 */
130 #else
131     byte changed_newTime:1;     /* 1 if vnode changed, write time */
132     byte changed_oldTime:1;     /* 1 changed, don't update time. */
133     byte delete:1;              /* 1 if the vnode should be deleted; in
134                                  * this case, changed must also be 1 */
135 #endif
136     VnodeId vnodeNumber;
137     struct Volume
138      *volumePtr;                /* Pointer to the volume containing this file */
139     byte nUsers;                /* Number of lwp's who have done a VGetVnode */
140     bit32 cacheCheck;           /* Must equal the value in the volume Header
141                                  * for the cache entry to be valid */
142     struct Lock lock;           /* Internal lock */
143 #ifdef AFS_PTHREAD_ENV
144     pthread_t writer;           /* thread holding write lock */
145 #else                           /* AFS_PTHREAD_ENV */
146     PROCESS writer;             /* Process id having write lock */
147 #endif                          /* AFS_PTHREAD_ENV */
148     IHandle_t *handle;
149     VnodeDiskObject disk;       /* The actual disk data for the vnode */
150 } Vnode;
151
152 #define SIZEOF_LARGEVNODE \
153         (sizeof(struct Vnode) - sizeof(VnodeDiskObject) + SIZEOF_LARGEDISKVNODE)
154 #define SIZEOF_SMALLVNODE       (sizeof (struct Vnode))
155
156 #ifdef AFS_LARGEFILE_ENV
157 #define VN_GET_LEN(N, V) FillInt64(N, (V)->disk.reserved6, (V)->disk.length)
158 #define VNDISK_GET_LEN(N, V) FillInt64(N, (V)->reserved6, (V)->length)
159 #define VN_SET_LEN(V, N) SplitInt64(N, (V)->disk.reserved6, (V)->disk.length)
160 #define VNDISK_SET_LEN(V, N) SplitInt64(N, (V)->reserved6, (V)->length)
161 #else /* !AFS_LARGEFILE_ENV */
162 #define VN_GET_LEN(N, V) (N) = (V)->disk.length;
163 #define VNDISK_GET_LEN(N, V) (N) = (V)->length;
164 #define VN_SET_LEN(V, N) (V)->disk.length = (N);
165 #define VNDISK_SET_LEN(V, N) (V)->length = (N);
166 #endif /* !AFS_LARGEFILE_ENV */
167
168 #ifdef AFS_64BIT_IOPS_ENV
169 #define VN_GET_INO(V) ((Inode)((V)->disk.vn_ino_lo | \
170                                ((V)->disk.vn_ino_hi ? \
171                                 (((Inode)(V)->disk.vn_ino_hi)<<32) : 0)))
172
173 #define VN_SET_INO(V, I) ((V)->disk.vn_ino_lo = (int)((I)&0xffffffff), \
174                            ((V)->disk.vn_ino_hi = (I) ? \
175                             (int)(((I)>>32)&0xffffffff) : 0))
176
177 #define VNDISK_GET_INO(V) ((Inode)((V)->vn_ino_lo | \
178                                    ((V)->vn_ino_hi ? \
179                                     (((Inode)(V)->vn_ino_hi)<<32) : 0)))
180
181 #define VNDISK_SET_INO(V, I) ((V)->vn_ino_lo = (int)(I&0xffffffff), \
182                               ((V)->vn_ino_hi = (I) ? \
183                                (int)(((I)>>32)&0xffffffff) : 0))
184 #else
185 #define VN_GET_INO(V) ((V)->disk.vn_ino_lo)
186 #define VN_SET_INO(V, I) ((V)->disk.vn_ino_lo = (I))
187 #define VNDISK_GET_INO(V) ((V)->vn_ino_lo)
188 #define VNDISK_SET_INO(V, I) ((V)->vn_ino_lo = (I))
189 #endif
190
191 #define VVnodeDiskACL(v)     /* Only call this with large (dir) vnode!! */ \
192         ((AL_AccessList *) (((byte *)(v))+SIZEOF_SMALLDISKVNODE))
193 #define  VVnodeACL(vnp) (VVnodeDiskACL(&(vnp)->disk))
194 /* VAclSize is defined this way to allow information in the vnode header
195    to grow, in a POSSIBLY upward compatible manner.  SIZEOF_SMALLDISKVNODE
196    is the maximum size of the basic vnode.  The vnode header of either type
197    can actually grow to this size without conflicting with the ACL on larger
198    vnodes */
199 #define VAclSize(vnp)           (SIZEOF_LARGEDISKVNODE - SIZEOF_SMALLDISKVNODE)
200 #define VAclDiskSize(v)         (SIZEOF_LARGEDISKVNODE - SIZEOF_SMALLDISKVNODE)
201 extern int VolumeHashOffset();
202 extern int VolumeHashOffset_r();
203 extern VInitVnodes();
204 extern VInitVnodes_r();
205 extern Vnode *VGetVnode();
206 extern Vnode *VGetVnode_r();
207 extern void VPutVnode();
208 extern void VPutVnode_r();
209 extern VVnodeWriteToRead();
210 extern VVnodeWriteToRead_r();
211 extern Vnode *VAllocVnode();
212 extern Vnode *VAllocVnode_r();
213 extern VFreeVnode();
214 extern VFreeVnode_r();