#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 {
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 {
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 */
/* 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 */
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 */
#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 */
* 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"
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 *);