afs: afs_CacheIsTooFull macro refs wrong constant
[openafs.git] / src / afs / afs.h
index 13614cb..8684f22 100644 (file)
@@ -53,7 +53,7 @@ extern int afs_shuttingdown;
 #if     defined(AFS_HPUX102_ENV)
 #define AFS_FLOCK       k_flock
 #else
-#if     defined(AFS_SUN56_ENV) || (defined(AFS_LINUX24_ENV) && !(defined(AFS_LINUX26_ENV) && defined(AFS_LINUX_64BIT_KERNEL)))
+#if     defined(AFS_SUN5_ENV) || (defined(AFS_LINUX24_ENV) && !(defined(AFS_LINUX26_ENV) && defined(AFS_LINUX_64BIT_KERNEL)))
 #define AFS_FLOCK       flock64
 #else
 #define AFS_FLOCK       flock
@@ -95,13 +95,15 @@ extern int afs_shuttingdown;
 #define        AFS_NRXPACKETS  80
 #define        AFS_RXDEADTIME  50
 #define AFS_HARDDEADTIME       120
-#define        AFS_IDLEDEADTIME        50
+#define        AFS_IDLEDEADTIME        1200
+#define AFS_IDLEDEADTIME_REP    180 /* more than fs's cb dead time */
 #define AFS_BLKBITS    12
 #define AFS_BLKSIZE    (1 << AFS_BLKBITS)
 
 extern afs_int32 afs_rx_deadtime;
 extern afs_int32 afs_rx_harddead;
 extern afs_int32 afs_rx_idledead;
+extern afs_int32 afs_rx_idledead_rep;
 
 struct sysname_info {
     char *name;
@@ -129,13 +131,11 @@ struct sysname_info {
 #define        BOP_FETCH       1       /* parm1 is chunk to get */
 #define        BOP_STORE       2       /* parm1 is chunk to store */
 #define        BOP_PATH        3       /* parm1 is path, parm2 is chunk to fetch */
-
-#if defined(AFS_CACHE_BYPASS)
 #define        BOP_FETCH_NOCACHE       4   /* parms are: vnode ptr, offset, segment ptr, addr, cred ptr */
-#endif
 #ifdef AFS_DARWIN_ENV
 #define        BOP_MOVE        5        /* ptr1 afs_uspc_param ptr2 sname ptr3 dname */
 #endif
+#define BOP_PARTIAL_STORE 6     /* parm1 is chunk to store */
 
 #define        B_DONTWAIT      1       /* On failure return; don't wait */
 
@@ -245,6 +245,7 @@ struct vrequest {
     char tokenError;            /* a token error other than expired. */
     char idleError;             /* the server idled too long */
     char skipserver[AFS_MAXHOSTS];
+    afs_int32 lasterror[AFS_MAXHOSTS];
 };
 #define VOLMISSING 1
 #define VOLBUSY 2
@@ -260,7 +261,6 @@ struct afs_cbr {
     struct afs_cbr *hash_next;
 
     struct AFSFid fid;
-    unsigned int dynalloc:1;
 };
 
 #ifdef AFS_LINUX22_ENV
@@ -376,6 +376,7 @@ struct unixuser {
     struct tokenJar *tokens;
     struct afs_exporter *exporter;     /* more info about the exporter for the remote user */
     void *cellinfo;             /* pointer to cell info (PAG manager only) */
+    afs_rwlock_t lock;
 };
 
 #define CVEC_LEN 3 /* per-user connection pool */
@@ -383,6 +384,8 @@ struct unixuser {
 struct sa_conn_vector;
 typedef struct sa_conn_vector * p_sa_conn_vector; /* forward decl */
 
+#define CONN_REPLICATED 0x1
+
 struct afs_conn {
     int refCount;
     int activated;
@@ -406,6 +409,7 @@ struct sa_conn_vector {
     struct srvAddr *srvr;      /* server associated with this conn */
     short refCount;            /* reference count for allocation */
     unsigned short port;       /* port associated with this connection */
+    int flags;
 
     /* next connection to return when all in cvec are fully utilized */
     int select_index; 
@@ -438,6 +442,7 @@ struct srvAddr {
     struct srvAddr *next_sa;   /* another interface on same host */
     struct server *server;     /* back to parent */
     struct sa_conn_vector *conns;   /* All user connections to this server */
+    struct afs_conn *natping;
     afs_int32 sa_ip;           /* Host addr in network byte order */
     u_short sa_iprank;         /* indiv ip address priority */
     u_short sa_portal;         /* port addr in network byte order */
@@ -562,12 +567,10 @@ struct chservinfo {
 /* state bits for volume */
 #define VRO                    1       /* volume is readonly */
 #define VRecheck               2       /* recheck volume info with server */
-#define        VBackup                 4       /* is this a backup volume? */
-#define        VForeign                8       /* this is a non-afs volume */
-#define VResort         16     /* server order was rearranged, sort when able */
-#define VMoreReps       32     /* This volume has more replicas than we are   */
-                            /* keeping track of now -- check with VLDB     */
-#define VPartVisible   64      /* Volume's partition is visible on the client */
+#define VBackup                        4       /* is this a backup volume? */
+#define VForeign               8       /* this is a non-afs volume */
+#define VPartVisible           16      /* Volume's partition is visible on the client */
+#define VHardMount             32      /* we are hard-mount waiting for the vol */
 
 enum repstate { not_busy, end_not_busy = 6, rd_busy, rdwr_busy, offline };
 
@@ -654,6 +657,7 @@ struct SimpleLocks {
 #endif
 #define CCreating      0x00400000      /* avoid needless store after open truncate */
 #define CPageHog       0x00800000      /* AIX - dumping large cores is a page hog. */
+#define CCorrupt       0x01000000      /* corrupt dir already reported */
 #define CDCLock                0x02000000      /* Vnode lock held over call to GetDownD */
 #define CBulkFetching  0x04000000      /* stats are being fetched by bulk stat */
 #define CExtendedFile  0x08000000      /* extended file via ftruncate call. */
@@ -684,7 +688,6 @@ struct SimpleLocks {
 
 /*... to be continued ...  */
 
-#if defined(AFS_CACHE_BYPASS)
 /* vcache (file) cachingStates bits */
 #define FCSDesireBypass   0x1  /* This file should bypass the cache */
 #define FCSBypass         0x2  /* This file is currently NOT being cached */
@@ -698,7 +701,6 @@ struct SimpleLocks {
                                                                                 * lock vcache (it's already locked) */
 #define TRANSSetManualBit              0x4     /* The Transition routine should set FCSManuallySet so that
                                                                         * filename checking does not override pioctl requests */
-#endif /* AFS_CACHE_BYPASS */
 
 #define        CPSIZE      2
 #if defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV)
@@ -724,9 +726,9 @@ struct SimpleLocks {
 #else
 #define VREFCOUNT(v)           ((v)->vrefCount)
 #define VREFCOUNT_GT(v,y)     ((v)->vrefCount > (y))
-#define VREFCOUNT_SET(v, c)    (v)->vrefCount = c;
-#define VREFCOUNT_DEC(v)       (v)->vrefCount--;
-#define VREFCOUNT_INC(v)       (v)->vrefCount++;
+#define VREFCOUNT_SET(v, c)    (v)->vrefCount = c
+#define VREFCOUNT_DEC(v)       (v)->vrefCount--
+#define VREFCOUNT_INC(v)       (v)->vrefCount++
 #define d_unhash(d) list_empty(&(d)->d_hash)
 #define dget_locked(d) dget(d)
 #endif
@@ -743,6 +745,13 @@ 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_NBSD40_ENV)
+struct nbvdata {
+    struct genfs_node gfsn;
+    struct vcache *afsvc;
+};
+#define VTOAFS(v) ((((struct nbvdata *)((v)->v_data)))->afsvc)
+#define AFSTOV(vc) ((vc)->v)
 #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)
@@ -792,6 +801,21 @@ struct fvcache {
     struct afs_vnuniq oldParent;
 };
 
+#ifdef AFS_SUN5_ENV
+/*
+ * This is for the multiPage field in struct vcache. Each one of these
+ * represents an outstanding getpage request that is larger than a single page.
+ * Recording these is necessary to prevent afs_GetOnePage from trying to evict
+ * a dcache entry that an earlier afs_GetOnePage call got in the same getpage
+ * request. See osi_VM_MultiPageConflict and afs_getpage.
+ */
+struct multiPage_range {
+    struct afs_q q;
+    offset_t off;    /**< offset of getpage request */
+    u_int len;       /**< length of getpage request */
+};
+#endif
+
 /* INVARIANTs: (vlruq.next != NULL) == (vlruq.prev != NULL)
  *             nextfree => !vlruq.next && ! vlruq.prev
  * !(avc->nextfree) && !avc->vlruq.next => (FreeVCList == avc->nextfree)
@@ -849,9 +873,7 @@ struct vcache {
     struct lock__bsd__ rwlock;
 #endif
 #ifdef AFS_XBSD_ENV
-# if defined(AFS_NBSD50_ENV)
-  struct krwlock rwlock;
-# elif !defined(AFS_DFBSD_ENV)
+#if !defined(AFS_DFBSD_ENV) && !defined(AFS_NBSD_ENV)
     struct lock rwlock;
 #endif
 #endif
@@ -875,14 +897,13 @@ struct vcache {
     short flockCount;          /* count of flock readers, or -1 if writer */
     char mvstat;               /* 0->normal, 1->mt pt, 2->root. */
 
-#if defined(AFS_CACHE_BYPASS)
-       char cachingStates;                     /* Caching policies for this file */
-       afs_uint32 cachingTransitions;          /* # of times file has flopped between caching and not */
+    char cachingStates;                        /* Caching policies for this file */
+    afs_uint32 cachingTransitions;             /* # of times file has flopped between caching and not */
+
 #if defined(AFS_LINUX24_ENV)
-       off_t next_seq_offset;  /* Next sequential offset (used by prefetch/readahead) */
-#else
-       off_t next_seq_blk_offset; /* accounted in blocks for Solaris & IRIX */
-#endif
+    off_t next_seq_offset;     /* Next sequential offset (used by prefetch/readahead) */
+#elif defined(AFS_SUN5_ENV) || defined(AFS_SGI65_ENV)
+    off_t next_seq_blk_offset; /* accounted in blocks for Solaris & IRIX */
 #endif
 
 #if    defined(AFS_SUN5_ENV)
@@ -909,12 +930,19 @@ struct vcache {
 #if defined(AFS_LINUX26_ENV)
     cred_t *cred;              /* last writer's cred */
 #endif
+#ifdef AFS_LINUX24_ENV
+    struct dentry *target_link; /* dentry we prefer, when we are redirecting
+                                 * all requests due to duplicate dentry aliases.
+                                 * See LINUX/osi_vnodeops.c. Note that this is
+                                 * NOT an actual reference to a dentry, so this
+                                 * pointer MUST NOT be dereferenced on its own. */
+#endif
     afs_int32 vc_error;                /* stash write error for this vnode. */
     int xlatordv;              /* Used by nfs xlator */
     afs_ucred_t *uncred;
     int asynchrony;            /* num kbytes to store behind */
 #ifdef AFS_SUN5_ENV
-    short multiPage;           /* count of multi-page getpages in progress */
+    struct afs_q multiPage;    /* list of multiPage_range structs */
 #endif
     int protocol;              /* RX_FILESERVER, RX_OSD, ... defined in afsint.xg */
 #if !defined(UKERNEL)
@@ -1115,7 +1143,7 @@ struct afs_fheader {
 
 #if defined(AFS_CACHE_VNODE_PATH)
 typedef char *afs_ufs_dcache_id_t;
-#elif defined(AFS_SGI61_ENV) || defined(AFS_SUN57_64BIT_ENV)
+#elif defined(AFS_SGI61_ENV) || defined(AFS_SUN5_64BIT_ENV)
 /* Using ino64_t here so that user level debugging programs compile
  * the size correctly.
  */
@@ -1340,8 +1368,6 @@ extern struct brequest afs_brs[NBRS];     /* request structures */
 #define DO_VLRU 2
 #define IS_SLOCK 4
 #define IS_WLOCK 8
-#define FIND_CDEAD 16
-#define FIND_BULKDEAD 32
 
 /* values for adown value of afs_LoopServers */
 #define AFS_LS_UP 0
@@ -1387,7 +1413,7 @@ extern struct brequest afs_brs[NBRS];     /* request structures */
 
 #define afs_CacheIsTooFull() \
     (afs_blocksUsed - afs_blocksDiscarded > \
-       PERCENT(CM_DCACHECOUNTFREEPCT, afs_cacheBlocks) || \
+       PERCENT(CM_DCACHESPACEFREEPCT, afs_cacheBlocks) || \
      afs_freeDCCount - afs_discardDCCount < \
        PERCENT(100 - CM_DCACHECOUNTFREEPCT, afs_cacheFiles))
 
@@ -1477,12 +1503,8 @@ struct afs_fakestat_state {
 };
 
 extern int afs_fakestat_enable;
-
-#ifdef AFS_MAXVCOUNT_ENV
+extern int afs_rmtsys_enable;
 extern int afsd_dynamic_vcaches;
-#else
-#define afsd_dynamic_vcaches 0
-#endif
 
 /*
  * Wrappers for access to credentials structure members
@@ -1491,6 +1513,9 @@ extern int afsd_dynamic_vcaches;
  */
 #if defined(AFS_NBSD40_ENV)
 /* in osi_machdep.h as expected */
+#elif defined (AFS_DARWIN110_ENV)
+#define afs_cr_uid(cred) kauth_cred_getuid((kauth_cred_t)(cred))
+#define afs_cr_gid(cred) kauth_cred_getgid((kauth_cred_t)(cred))
 #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)
@@ -1499,6 +1524,7 @@ extern int afsd_dynamic_vcaches;
 #define afs_cr_rgid(cred) ((cred)->cr_rgid)
 #endif
 
+#if !defined(AFS_DARWIN110_ENV)
 static_inline void
 afs_set_cr_uid(afs_ucred_t *cred, uid_t uid) {
     cred->cr_uid = uid;
@@ -1516,7 +1542,8 @@ static_inline void
 afs_set_cr_rgid(afs_ucred_t *cred, gid_t gid) {
     cred->cr_rgid = gid;
 }
-#endif
+#endif /* ! AFS_OBSD_ENV */
+#endif /* ! AFS_DARWIN110_ENV */
 #endif
 
 #ifdef AFS_SUN5_ENV
@@ -1526,7 +1553,6 @@ afs_set_cr_rgid(afs_ucred_t *cred, gid_t gid) {
  * to accomodate both, *long* is used instead of afs_int32
  */
 
-# ifdef AFS_SUN57_ENV
 struct afssysa {
     long syscall;
     long parm1;
@@ -1536,18 +1562,39 @@ struct afssysa {
     long parm5;
     long parm6;
 };
-# else
-struct afssysa {
-    afs_int32 syscall;
-    afs_int32 parm1;
-    afs_int32 parm2;
-    afs_int32 parm3;
-    afs_int32 parm4;
-    afs_int32 parm5;
-    afs_int32 parm6;
-};
-# endif
 extern int Afs_syscall(struct afssysa *uap, rval_t *rvp);
 #endif /* AFS_SUN5_ENV */
 
+/*
+ * Various definitions for osi_sleep and its event hash table
+ * DFBSD and SUNOS have no osi_sleep, and HPUX has its own hack for this stuff
+ */
+#define AFS_EVHASHSIZE 128     /* size of afs_evhasht, must be power of 2 */
+
+typedef struct afs_event {
+    struct afs_event *next;    /* next in hash chain */
+    char *event;               /* lwp event: an address */
+    int refcount;              /* Is it in use? */
+    int seq;                   /* Sequence number: this is incremented
+                                * by wakeup calls; wait will not return until
+                                * it changes */
+#if defined(AFS_AIX_ENV)
+    tid_t cond;
+#elif defined(AFS_DARWIN_ENV)
+# ifdef AFS_DARWIN80_ENV
+    lck_mtx_t *lck;
+    thread_t owner;
+# endif
+    /* no cond member */
+#elif defined(AFS_FBSD_ENV) || defined(AFS_OBSD_ENV)
+    int cond;                  /* "all this gluck should probably be replaced by CVs" */
+#elif defined(AFS_LINUX24_ENV)
+    wait_queue_head_t cond;
+#elif defined(AFS_NBSD_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV)
+    kcondvar_t cond;           /* Currently associated condition variable */
+#endif
+} afs_event_t;
+
+extern afs_event_t *afs_evhasht[AFS_EVHASHSIZE];       /* Hash table for events */
+
 #endif /* _AFS_H_ */