Fixes for signed char architectures
[openafs.git] / src / afs / afs.h
index aba83d8..a54a317 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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
@@ -85,8 +85,8 @@ extern int afs_shuttingdown;
 #define MAXNUMSYSNAMES 32      /* max that current constants allow */
 #define        NOTOKTIMEOUT    (2*3600)        /* time after which to timeout conns sans tokens */
 #define        NOPAG           0xffffffff
-#define AFS_NCBRS      300     /* max # of call back return entries */
-#define AFS_MAXCBRSCALL        16      /* max to return in a given call */
+#define AFS_NCBRS      1024    /* max # of call back return entries */
+#define AFS_MAXCBRSCALL        32      /* max to return in a given call (must be <= AFSCBMAX) */
 #define        AFS_SALLOC_LOW_WATER    250     /* Min free blocks before allocating more */
 #define        AFS_LRALLOCSIZ  4096    /* "Large" allocated size */
 #define        VCACHE_FREE     5
@@ -104,7 +104,7 @@ extern afs_int32 afs_rx_idledead;
 struct sysname_info {
     char *name;
     short offset;
-    char index, allocked;
+    signed char index, allocked;
 };
 
 /* flags to use with AFSOP_CACHEINIT */
@@ -118,7 +118,7 @@ struct sysname_info {
 #define AFS_SYNC       1
 #define AFS_VMSYNC_INVAL 2     /* sync and invalidate pages */
 #define AFS_LASTSTORE   4
-
+#define AFS_VMSYNC      8       /* sync pages but do not invalidate */
 
 /* background request structure */
 #define        BPARMS          4
@@ -184,7 +184,7 @@ struct SmallFid {
 /* The actual number of bytes in the SmallFid, not the sizeof struct. */
 #define SIZEOF_SMALLFID 10
 
-/* Queues 
+/* Queues
  * ------
  *
  *  Circular queues, implemented with pointers. Structures may contain as many
@@ -258,6 +258,7 @@ struct afs_cbr {
     struct afs_cbr *hash_next;
 
     struct AFSFid fid;
+    unsigned int dynalloc:1;
 };
 
 /* cellinfo file magic number */
@@ -269,6 +270,7 @@ struct afs_cbr {
 #define CNoAFSDB               0x08    /* never bother trying AFSDB */
 #define CHasVolRef             0x10    /* volumes were referenced */
 #define CLinkedCell            0x20    /* has a linked cell in lcellp */
+#define CHush                   0x40    /* don't display until referenced */
 
 struct cell {
     struct afs_q lruq;         /* lru q next and prev */
@@ -316,6 +318,10 @@ struct cell_alias {
  */
 #define TMP_UPAGNotReferenced  128
 
+/* unixuser notify events */
+#define UTokensObtained 1
+#define UTokensDropped  2
+
 /* values for afs_gcpags */
 enum { AFS_GCPAGS_NOTCOMPILED = 0, AFS_GCPAGS_OK =
        1, AFS_GCPAGS_USERDISABLED, AFS_GCPAGS_EPROC0, AFS_GCPAGS_EPROCN,
@@ -402,6 +408,10 @@ struct srvAddr {
 #define        SRVR_ISGONE                     0x80
 #define        SNO_INLINEBULK                  0x100
 #define SNO_64BIT                       0x200
+#define SCAPS_KNOWN                    0x400
+
+#define SRV_CAPABILITIES(ts) \
+{ if ( !(ts->flags & SCAPS_KNOWN)) afs_GetCapabilities(ts); ts->capabilities; }
 
 #define afs_serverSetNo64Bit(s) ((s)->srvr->server->flags |= SNO_64BIT)
 #define afs_serverHasNo64Bit(s) ((s)->srvr->server->flags & SNO_64BIT)
@@ -433,11 +443,12 @@ struct server {
     afs_int32 sumOfDowntimes;  /* Total downtime experienced, in seconds */
     struct srvAddr *addr;
     afs_uint32 flags;          /* Misc flags */
+    afs_int32 capabilities;
 };
 
 #define        afs_PutServer(servp, locktype)
 
-/* structs for some pioctls  - these are (or should be) 
+/* structs for some pioctls  - these are (or should be)
  * also in venus.h
  */
 struct spref {
@@ -584,8 +595,10 @@ struct SimpleLocks {
 #define CVFlushed      0x00080000
 #ifdef AFS_LINUX22_ENV
 #define CPageWrite      0x00200000      /* to detect vm deadlock - linux */
-#else
+#elif defined(AFS_SGI_ENV)
 #define CWritingUFS    0x00200000      /* to detect vm deadlock - used by sgi */
+#elif defined(AFS_DARWIN80_ENV)
+#define CEvent          0x00200000      /* to preclude deadlock when sending events */
 #endif
 #define CCreating      0x00400000      /* avoid needless store after open truncate */
 #define CPageHog       0x00800000      /* AIX - dumping large cores is a page hog. */
@@ -599,8 +612,6 @@ struct SimpleLocks {
 #define VRevokeWait   0x1
 #define VPageCleaning 0x2      /* Solaris - Cache Trunc Daemon sez keep out */
 
-#if defined(AFS_DISCON_ENV)
-
 /* Dirty disconnected vcache flags. */
 #define VDisconSetTime         0x00000001      /* set time. */
 #define VDisconSetMode         0x00000002      /* set mode. */
@@ -619,7 +630,6 @@ struct SimpleLocks {
 #define VDisconRenameSameDir   0x00020000      /* Rename in same dir. */
 
 /*... to be continued ...  */
-#endif
 
 #if defined(AFS_CACHE_BYPASS)
 /* vcache (file) cachingStates bits */
@@ -629,12 +639,12 @@ struct SimpleLocks {
                                                                   and should not be overridden by the file's name */
 
 /* Flag values used by the Transition routines */
-#define TRANSChangeDesiredBit          0x1     /* The Transition routine should set or 
+#define TRANSChangeDesiredBit          0x1     /* The Transition routine should set or
                                                                                 * reset the FCSDesireBypass bit */
 #define TRANSVcacheIsLocked                    0x2     /* The Transition routine does not need to
                                                                                 * lock vcache (it's already locked) */
 #define TRANSSetManualBit              0x4     /* The Transition routine should set FCSManuallySet so that
-                                                                        * filename checking does not override pioctl requests */       
+                                                                        * filename checking does not override pioctl requests */
 #endif /* AFS_CACHE_BYPASS */
 
 #define        CPSIZE      2
@@ -677,7 +687,7 @@ extern afs_int32 vmPageHog; /* counter for # of vnodes which are page hogs. */
 #if defined(AFS_DARWIN80_ENV)
 #define VTOAFS(v) ((struct vcache *)vnode_fsnode((v)))
 #define AFSTOV(vc) ((vc)->v)
-#elif defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV) || (defined(AFS_LINUX22_ENV) && !defined(STRUCT_SUPER_HAS_ALLOC_INODE))
+#elif defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV) || (defined(AFS_LINUX22_ENV) && !defined(STRUCT_SUPER_OPERATIONS_HAS_ALLOC_INODE))
 #define VTOAFS(v) ((struct vcache *)(v)->v_data)
 #define AFSTOV(vc) ((vc)->v)
 #else
@@ -718,22 +728,20 @@ struct fvcache {
     /*! state bits */
     afs_uint32 states;
 
-#if defined(AFS_DISCON_ENV)
     /*! Disconnected flags for this vcache element. */
     afs_uint32 ddirty_flags;
     /*! Shadow vnode + unique keep the shadow dir location. */
     struct afs_vnuniq shadow;
     /*! The old parent FID for renamed vnodes */
     struct afs_vnuniq oldParent;
-#endif
 };
-    
+
 /* INVARIANTs: (vlruq.next != NULL) == (vlruq.prev != NULL)
  *             nextfree => !vlruq.next && ! vlruq.prev
  * !(avc->nextfree) && !avc->vlruq.next => (FreeVCList == avc->nextfree)
  */
 struct vcache {
-#if defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV) || (defined(AFS_LINUX22_ENV) && !defined(STRUCT_SUPER_HAS_ALLOC_INODE))
+#if defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV) || (defined(AFS_LINUX22_ENV) && !defined(STRUCT_SUPER_OPERATIONS_HAS_ALLOC_INODE))
     struct vnode *v;
 #else
     struct vnode v;            /* Has reference count in v.v_count */
@@ -744,7 +752,6 @@ struct vcache {
 #endif
     struct vcache *hnext;      /* Hash next */
     struct afs_q vhashq;       /* Hashed per-volume list */
-#if defined(AFS_DISCON_ENV)
     /*! Queue of dirty vcaches. Lock with afs_disconDirtyLock */
     struct afs_q dirtyq;
     /*! Queue of vcaches with shadow entries. Lock with afs_disconDirtyLock */
@@ -753,7 +760,6 @@ struct vcache {
     struct afs_q metadirty;
     /*! Vcaches slot number in the disk backup. Protected by tvc->lock */
     afs_uint32 diskSlot;
-#endif
     struct fvcache f;
     afs_rwlock_t lock;         /* The lock on the vcache contents. */
 #if    defined(AFS_SUN5_ENV)
@@ -820,7 +826,7 @@ struct vcache {
        off_t next_seq_blk_offset; /* accounted in blocks for Solaris & IRIX */
 #endif
 #endif
-       
+
 #if    defined(AFS_SUN5_ENV)
     afs_uint32 vstates;                /* vstate bits */
 #endif                         /* defined(AFS_SUN5_ENV) */
@@ -986,7 +992,7 @@ struct cm_initparams {
 #define        IFFree          2       /* index entry in freeDCList */
 #define        IFDataMod       4       /* file needs to be written out */
 #define        IFFlag          8       /* utility flag */
-#define        IFDirtyPages    16
+#define        IFDirtyPages    16      /* Solaris-only. contains dirty pages */
 #define        IFAnyPages      32
 #define        IFDiscarded     64      /* index entry in discardDCList */
 
@@ -1002,6 +1008,16 @@ typedef long iparmtype;
 #endif
 #endif
 
+#if SIZEOF_VOID_P == SIZEOF_UNSIGNED_INT
+# define uintptrsz unsigned int
+#elif SIZEOF_VOID_P == SIZEOF_UNSIGNED_LONG
+# define uintptrsz unsigned long
+#elif SIZEOF_VOID_P == SIZEOF_UNSIGNED_LONG_LONG
+# define uintptrsz unsigned long long
+#else
+# error "Unable to determine casting for pointers"
+#endif
+
 struct afs_ioctl {
     uparmtype in;              /* input buffer */
     uparmtype out;             /* output buffer */
@@ -1025,36 +1041,33 @@ struct afs_ioctl32 {
 /* CacheItems file has a header of type struct afs_fheader
  * (keep aligned properly). Since we already have sgi_62 clients running
  * with a 32 bit inode, a change is required to the header so that
- * they can distinguish the old 32 bit inode CacheItems file and zap it 
+ * they can distinguish the old 32 bit inode CacheItems file and zap it
  * instead of using it.
  */
 struct afs_fheader {
 #define AFS_FHMAGIC        0x7635abaf  /* uses version number */
     afs_int32 magic;
-#if defined(AFS_SUN57_64BIT_ENV)
-#define AFS_CI_VERSION 3
-#else
-#define AFS_CI_VERSION 2
-#endif
+#define AFS_CI_VERSION 4
     afs_int32 version;
+    afs_uint32 dataSize;
     afs_int32 firstCSize;
     afs_int32 otherCSize;
 };
 
 #if defined(AFS_CACHE_VNODE_PATH)
 typedef char *afs_ufs_dcache_id_t;
-#elif defined(UKERNEL)
-typedef afs_int32 afs_ufs_dcache_id_t;
 #elif defined(AFS_SGI61_ENV) || defined(AFS_SUN57_64BIT_ENV)
 /* Using ino64_t here so that user level debugging programs compile
  * the size correctly.
  */
 typedef ino64_t afs_ufs_dcache_id_t;
-#elif defined(LINUX_USE_FH)
+#elif defined(AFS_LINUX26_ENV)
 #define MAX_FH_LEN 10
 typedef union {
-     struct fid fh;
-     __u32 raw[MAX_FH_LEN];
+#if defined(NEW_EXPORT_OPS)
+    struct fid fh;
+#endif
+    __u32 raw[MAX_FH_LEN];
 } afs_ufs_dcache_id_t;
 extern int cache_fh_type;
 extern int cache_fh_len;
@@ -1171,11 +1184,11 @@ struct afs_FetchOutput {
     } while(0)
 
 /* FakeOpen and Fake Close used to be real subroutines.  They're only used in
- * sun_subr and afs_vnodeops, and they're very frequently called, so I made 
+ * sun_subr and afs_vnodeops, and they're very frequently called, so I made
  * them into macros.  They do:
  * FakeOpen:  fake the file being open for writing.  avc->lock must be held
  * in write mode.  Having the file open for writing is like having a DFS
- * write-token: you're known to have the best version of the data around, 
+ * write-token: you're known to have the best version of the data around,
  * and so the CM won't let it be overwritten by random server info.
  * FakeClose:  undo the effects of FakeOpen, noting that we want to ensure
  * that a real close eventually gets done.  We use CCore to achieve this if
@@ -1194,7 +1207,7 @@ struct afs_FetchOutput {
        avc->f.states |= CCore; /* causes close to be called later */ \
                                                                       \
        /* The cred and vnode holds will be released in afs_FlushActiveVcaches */  \
-       VN_HOLD(AFSTOV(avc));   /* So it won't disappear */           \
+       AFS_FAST_HOLD(avc);     /* So it won't disappear */           \
        CRKEEP(avc, acred); /* Should use a better place for the creds */ \
     }                                                                         \
     else {                                                                    \
@@ -1252,7 +1265,7 @@ extern struct brequest afs_brs[NBRS];     /* request structures */
 #define        FVHash(acell,avol)  (((avol)+(acell)) & (NFENTRIES-1))
 
 /* Performance hack - we could replace VerifyVCache2 with the appropriate
- * GetVCache incantation, and could eliminate even this code from afs_UFSRead 
+ * GetVCache incantation, and could eliminate even this code from afs_UFSRead
  * by making intentionally invalidating quick.stamp in the various callbacks
  * expiration/breaking code */
 #ifdef AFS_DARWIN_ENV
@@ -1268,6 +1281,7 @@ extern struct brequest afs_brs[NBRS];     /* request structures */
 #define DO_VLRU 2
 #define IS_SLOCK 4
 #define IS_WLOCK 8
+#define FIND_CDEAD 16
 
 /* values for flag param of afs_CheckVolumeNames */
 #define AFS_VOLCHECK_EXPIRED   0x1     /* volumes whose callbacks have expired */
@@ -1322,7 +1336,7 @@ extern struct brequest afs_brs[NBRS];     /* request structures */
 #define refpanic(foo) if (afs_norefpanic) \
         { printf( foo ); afs_norefpanic++;} else osi_Panic( foo )
 
-/* 
+/*
 ** these are defined in the AIX source code sys/fs_locks.h but are not
 ** defined anywhere in the /usr/include directory
 */
@@ -1344,13 +1358,15 @@ extern struct brequest afs_brs[NBRS];   /* request structures */
 #ifndef afs_vnodeToDev
 #if defined(AFS_SGI62_ENV) || defined(AFS_HAVE_VXFS) || defined(AFS_DARWIN_ENV)
 #define afs_vnodeToDev(V) VnodeToDev(V)
+#elif defined(UKERNEL)
+#define afs_vnodeToDev(V) (VTOI(V) ? (VTOI(V)->i_dev) : (-1))
 #else
 #define afs_vnodeToDev(V) (VTOI(V)->i_dev)
 #endif
 #endif
 
 /* declare something so that prototypes don't flip out */
-/* appears struct buf stuff is only actually passed around as a pointer, 
+/* appears struct buf stuff is only actually passed around as a pointer,
    except with libuafs, in which case it is actually defined */
 
 struct buf;
@@ -1412,7 +1428,9 @@ extern int afsd_dynamic_vcaches;
  * Linux uses the kernel cred structure if available, with the
  * wrappers defined in LINUX/osi_machdep.h
  */
-#if !(defined(AFS_LINUX26_ENV) && defined(STRUCT_TASK_HAS_CRED))
+#if defined(AFS_NBSD40_ENV)
+/* in osi_machdep.h as expected */
+#elif !(defined(AFS_LINUX26_ENV) && defined(STRUCT_TASK_STRUCT_HAS_CRED))
 #define afs_cr_uid(cred) ((cred)->cr_uid)
 #define afs_cr_gid(cred) ((cred)->cr_gid)
 #define afs_cr_ruid(cred) ((cred)->cr_ruid)