/* * Copyright 2000, International Business Machines Corporation and others. * All Rights Reserved. * * This software has been released under the terms of the IBM Public * License. For details, see the LICENSE file in the top-level source * directory or online at http://www.openafs.org/dl/license10.html * * Portions Copyright (c) 2007-2008 Sine Nomine Associates */ /* System: VICE-TWO Module: vnode.h Institution: The Information Technology Center, Carnegie-Mellon University */ #ifndef _AFS_VOL_VNODE_H #define _AFS_VOL_VNODE_H 1 #define Date afs_uint32 struct Volume; /* Potentially forward definition. */ typedef struct ViceLock { int lockCount; int lockTime; } ViceLock; #define ViceLockCheckLocked(vptr) ((vptr)->lockTime == 0) #define ViceLockClear(vptr) ((vptr)->lockCount = (vptr)->lockTime = 0) #define ROOTVNODE 1 /*typedef enum {vNull=0, vFile=1, vDirectory=2, vSymlink=3} VnodeType;*/ typedef unsigned int VnodeType; #define vNull 0 #define vFile 1 #define vDirectory 2 #define vSymlink 3 /*typedef enum {vLarge=0,vSmall=1} VnodeClass;*/ #define vLarge 0 #define vSmall 1 typedef int VnodeClass; #define VNODECLASSWIDTH 1 #define VNODECLASSMASK ((1<>VNODECLASSWIDTH) /* The following calculation allows for a header record at the beginning of the index. The header record is the same size as a vnode */ #define vnodeIndexOffset(vcp,vnodeNumber) \ ((vnodeIdToBitNumber(vnodeNumber)+1)<<(vcp)->logSize) #define bitNumberToVnodeNumber(b,class) ((VnodeId)(((b)<nUsers) #define Vn_state(vnp) ((vnp)->vn_state) #define Vn_stateFlags(vnp) ((vnp)->vn_state_flags) #define Vn_stateCV(vnp) ((vnp)->vn_state_cv) #define Vn_volume(vnp) ((vnp)->volumePtr) #define Vn_cacheCheck(vnp) ((vnp)->cacheCheck) #define Vn_class(vnp) ((vnp)->vcp) #define Vn_readers(vnp) ((vnp)->nReaders) #define Vn_id(vnp) ((vnp)->vnodeNumber) #define VN_GET_LEN(N, V) FillInt64(N, (V)->disk.vn_length_hi, (V)->disk.length) #define VNDISK_GET_LEN(N, V) FillInt64(N, (V)->vn_length_hi, (V)->length) #define VN_SET_LEN(V, N) SplitInt64(N, (V)->disk.vn_length_hi, (V)->disk.length) #define VNDISK_SET_LEN(V, N) SplitInt64(N, (V)->vn_length_hi, (V)->length) #ifdef AFS_64BIT_IOPS_ENV #define VN_GET_INO(V) ((Inode)((V)->disk.vn_ino_lo | \ ((V)->disk.vn_ino_hi ? \ (((Inode)(V)->disk.vn_ino_hi)<<32) : 0))) #define VN_SET_INO(V, I) ((V)->disk.vn_ino_lo = (int)((I)&0xffffffff), \ ((V)->disk.vn_ino_hi = (I) ? \ (int)(((I)>>32)&0xffffffff) : 0)) #define VNDISK_GET_INO(V) ((Inode)((V)->vn_ino_lo | \ ((V)->vn_ino_hi ? \ (((Inode)(V)->vn_ino_hi)<<32) : 0))) #define VNDISK_SET_INO(V, I) ((V)->vn_ino_lo = (int)(I&0xffffffff), \ ((V)->vn_ino_hi = (I) ? \ (int)(((I)>>32)&0xffffffff) : 0)) #else #define VN_GET_INO(V) ((V)->disk.vn_ino_lo) #define VN_SET_INO(V, I) ((V)->disk.vn_ino_lo = (I)) #define VNDISK_GET_INO(V) ((V)->vn_ino_lo) #define VNDISK_SET_INO(V, I) ((V)->vn_ino_lo = (I)) #endif #define VVnodeDiskACL(v) /* Only call this with large (dir) vnode!! */ \ ((AL_AccessList *) (((byte *)(v))+SIZEOF_SMALLDISKVNODE)) #define VVnodeACL(vnp) (VVnodeDiskACL(&(vnp)->disk)) /* VAclSize is defined this way to allow information in the vnode header to grow, in a POSSIBLY upward compatible manner. SIZEOF_SMALLDISKVNODE is the maximum size of the basic vnode. The vnode header of either type can actually grow to this size without conflicting with the ACL on larger vnodes */ #define VAclSize(vnp) (SIZEOF_LARGEDISKVNODE - SIZEOF_SMALLDISKVNODE) #define VAclDiskSize(v) (SIZEOF_LARGEDISKVNODE - SIZEOF_SMALLDISKVNODE) /*extern int VolumeHashOffset(); */ extern int VolumeHashOffset_r(void); extern int VInitVnodes(VnodeClass class, int nVnodes); /*extern VInitVnodes_r();*/ extern Vnode *VGetVnode(Error * ec, struct Volume *vp, VnodeId vnodeNumber, int locktype); extern Vnode *VGetVnode_r(Error * ec, struct Volume *vp, VnodeId vnodeNumber, int locktype); extern void VPutVnode(Error * ec, Vnode * vnp); extern void VPutVnode_r(Error * ec, Vnode * vnp); extern int VVnodeWriteToRead(Error * ec, Vnode * vnp); extern int VVnodeWriteToRead_r(Error * ec, Vnode * vnp); extern Vnode *VAllocVnode(Error * ec, struct Volume *vp, VnodeType type); extern Vnode *VAllocVnode_r(Error * ec, struct Volume *vp, VnodeType type); /*extern VFreeVnode();*/ extern Vnode *VGetFreeVnode_r(struct VnodeClassInfo *vcp); extern Vnode *VLookupVnode(struct Volume * vp, VnodeId vnodeId); extern void AddToVVnList(struct Volume * vp, Vnode * vnp); extern void DeleteFromVVnList(Vnode * vnp); extern void AddToVnLRU(struct VnodeClassInfo * vcp, Vnode * vnp); extern void DeleteFromVnLRU(struct VnodeClassInfo * vcp, Vnode * vnp); extern void AddToVnHash(Vnode * vnp); extern void DeleteFromVnHash(Vnode * vnp); #endif /* _AFS_VOL_VNODE_H */