Windows: fix build with DEBUG_REFCOUNT
[openafs.git] / src / WINNT / afsd / cm_scache.h
index f0ab19a..c01dfc8 100644 (file)
@@ -10,6 +10,8 @@
 #ifndef OPENAFS_WINNT_AFSD_CM_SCACHE_H
 #define OPENAFS_WINNT_AFSD_CM_SCACHE_H 1
 
+#include <opr/jhash.h>
+
 #define MOUNTPOINTLEN   1024    /* max path length for symlink; same as AFSPATHMAX */
 
 typedef struct cm_fid {
@@ -26,7 +28,7 @@ typedef struct cm_fid {
 typedef struct cm_key {
     afs_offs_t process_id;      /* process IDs can be 64bit on 64bit environments */
     afs_uint16 session_id;
-    afs_uint16 file_id;
+    afs_uint64 file_id;         /* afs redir uses File Object pointers as file id */
 } cm_key_t;
 
 typedef struct cm_range {
@@ -125,7 +127,8 @@ typedef struct cm_scache {
     afs_uint32 unixModeBits;           /* unix protection mode bits */
     afs_uint32 linkCount;              /* link count */
     afs_uint64 dataVersion;            /* data version */
-    afs_uint64 bufDataVersionLow;       /* range of valid cm_buf_t dataVersions */
+    afs_uint64 bufDataVersionLow;       /* range of valid cm_buf_t dataVersions;
+                                           does not apply to directory buffers */
     afs_uint32 owner;                  /* file owner */
     afs_uint32 group;                  /* file owning group */
     cm_user_t *creator;                        /* user, if new file */
@@ -153,6 +156,7 @@ typedef struct cm_scache {
     /* callback info */
     struct cm_server *cbServerp;       /* server granting callback */
     time_t cbExpires;                  /* time callback expires */
+    time_t cbIssued;                    /* time callback was issued */
 
     /* access cache */
     long anyAccess;                    /* anonymous user's access */
@@ -228,13 +232,16 @@ typedef struct cm_scache {
                                        cm_scacheLock. */
     osi_queue_t * waitQueueT;       /* locked by cm_scacheLock */
 
-    /* redirector state - protected by scp->rw */
+    /* redirector state - protected by scp->redirMx */
     osi_queue_t * redirQueueH;      /* LRU queue of buffers for this
                                        file that are assigned to the
                                        afsredir kernel module. */
     osi_queue_t * redirQueueT;
     afs_uint32    redirBufCount;    /* Number of buffers held by the redirector */
     time_t        redirLastAccess;  /* last time redir accessed the vnode */
+    osi_mutex_t   redirMx;
+
+    afs_uint32 activeRPCs;              /* atomic */
 } cm_scache_t;
 
 /* dataVersion */
@@ -284,7 +291,6 @@ typedef struct cm_scache {
 #define CM_SCACHEFLAG_ANYWATCH \
                        (CM_SCACHEFLAG_WATCHED | CM_SCACHEFLAG_WATCHEDSUBTREE)
 
-#define CM_SCACHEFLAG_EACCESS           0x200000 /* Bulk Stat returned EACCES */
 #define CM_SCACHEFLAG_SMB_FID          0x400000
 #define CM_SCACHEFLAG_LOCAL             0x800000 /* Locally modified */
 #define CM_SCACHEFLAG_BULKREADING       0x1000000/* Bulk read in progress */
@@ -344,11 +350,12 @@ typedef struct cm_scache {
  * doesn't necessarily know the cell in the case of a multihomed server
  * contacting us from a mystery address.
  */
-#define CM_SCACHE_HASH(fidp)   (((unsigned long)       \
-                                  ((fidp)->volume +    \
-                                   (fidp)->vnode +     \
-                                   (fidp)->unique))    \
-                                       % cm_data.scacheHashTableSize)
+
+#define CM_FID_GEN_HASH(fidp) do { \
+    (fidp)->hash = opr_jhash(&(fidp)->volume, 3, 0); \
+} while(0)
+
+#define CM_SCACHE_HASH(fidp) ((fidp)->hash & (cm_data.scacheHashTableSize - 1))
 
 #include "cm_conn.h"
 #include "cm_buf.h"
@@ -365,16 +372,16 @@ typedef struct cm_scache_waiter {
 extern void cm_InitSCache(int, long);
 
 #ifdef DEBUG_REFCOUNT
-extern long cm_GetSCacheDbg(cm_fid_t *, cm_scache_t **, struct cm_user *,
+extern long cm_GetSCacheDbg(cm_fid_t *, cm_fid_t *, cm_scache_t **, struct cm_user *,
        struct cm_req *, char *, long);
 
-#define cm_GetSCache(a,b,c,d)  cm_GetSCacheDbg(a,b,c,d,__FILE__,__LINE__)
+#define cm_GetSCache(a,b,c,d,e)  cm_GetSCacheDbg(a,b,c,d,e,__FILE__,__LINE__)
 #else
-extern long cm_GetSCache(cm_fid_t *, cm_scache_t **, struct cm_user *,
+extern long cm_GetSCache(cm_fid_t *, cm_fid_t *, cm_scache_t **, struct cm_user *,
        struct cm_req *);
 #endif
 
-extern cm_scache_t *cm_GetNewSCache(void);
+extern cm_scache_t *cm_GetNewSCache(afs_uint32 locked);
 
 extern __inline int cm_FidCmp(cm_fid_t *, cm_fid_t *);