Windows: Track Mixed RO Volume Release State
[openafs.git] / src / WINNT / afsd / cm_volume.h
index 9d21ac9..d843d87 100644 (file)
@@ -10,6 +10,8 @@
 #ifndef OPENAFS_WINNT_AFSD_CM_VOLUME_H
 #define OPENAFS_WINNT_AFSD_CM_VOLUME_H 1
 
+#include <opr/jhash.h>
+
 #define VL_MAXNAMELEN                   65
 
 #define CM_VOLUME_MAGIC    ('V' | 'O' <<8 | 'L'<<16 | 'M'<<24)
@@ -24,15 +26,18 @@ typedef struct cm_vol_state {
     struct cm_fid dotdotFid;           /* parent of volume root */
     cm_serverRef_t *serversp;           /* by cm_serverLock */
     enum volstatus  state;              /* by rw */
-    afs_uint16      flags;              /* by rw */
-    afs_uint16      qflags;             /* by cm_volumeLock */
+    afs_uint32      flags;              /* by rw */
+    afs_uint32      qflags;             /* by cm_volumeLock */
 } cm_vol_state_t;
 
 /* RWVOL, ROVOL, BACKVOL are defined in cm.h */
 #define NUM_VOL_TYPES 3
 
+#define CM_VOL_STATE_FLAG_REPLICATED    1
+
 typedef struct cm_volume {
     osi_queue_t q;                      /* LRU queue; cm_volumeLock */
+    afs_uint32 qflags;                  /* by cm_volumeLock */
     afs_uint32  magic;
     struct cm_volume *allNextp;                /* allVolumes; by cm_volumeLock */
     struct cm_volume *nameNextp;        /* volumeNameHashTable; by cm_volumeLock */
@@ -41,16 +46,17 @@ typedef struct cm_volume {
                                         /* by cm_volumeLock */
     struct cm_vol_state vol[NUM_VOL_TYPES]; /* by cm_volumeLock */
     osi_rwlock_t rw;
-    afs_uint16 flags;                  /* by rw */
-    afs_uint16 qflags;                  /* by cm_volumeLock */
+    afs_uint32 flags;                  /* by rw */
     afs_int32 refCount;                        /* by Interlocked operations */
     struct cm_server *cbServerpRO;      /* server granting RO callback; by cm_scacheLock */
     time_t cbExpiresRO;                 /* latest RO expiration time; by cm_scacheLock */
+    time_t cbIssuedRO;                  /* latest RO issue time; by cm_scacheLock */
     time_t creationDateRO;              /* latest volume creation date; 0 if unknown; by cm_scacheLock */
     time_t lastUpdateTime;              /* most recent volume location update cm_volumeLock */
 } cm_volume_t;
 
 #define CM_VOLUMEFLAG_RESET       1    /* reload this info on next use */
+#define CM_VOLUMEFLAG_RO_MIXED     2
 #define CM_VOLUMEFLAG_UPDATING_VL  8
 #define CM_VOLUMEFLAG_DFS_VOLUME  16
 #define CM_VOLUMEFLAG_NOEXIST     32
@@ -82,8 +88,9 @@ extern long cm_FindVolumeByID(struct cm_cell *cellp, afs_uint32 volumeID,
  * doesn't necessarily know the cell in the case of a multihomed server
  * contacting us from a mystery address.
  */
-#define CM_VOLUME_ID_HASH(volid)   ((unsigned long) volid \
-                                       % cm_data.volumeHashTableSize)
+
+#define CM_VOLUME_ID_HASH(volid) \
+    (opr_jhash_int((volid), 0) & (cm_data.volumeHashTableSize - 1))
 
 #define CM_VOLUME_NAME_HASH(name)  (SDBMHash(name) % cm_data.volumeHashTableSize)