Windows: AFSVolSync creationDate based readonly volume versioning
[openafs.git] / src / WINNT / afsd / cm_volume.h
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #ifndef __CM_VOLUME_H_ENV__
11 #define __CM_VOLUME_H_ENV__ 1
12
13 #define VL_MAXNAMELEN                   65
14
15 #define CM_VOLUME_MAGIC    ('V' | 'O' <<8 | 'L'<<16 | 'M'<<24)
16
17 /* 
18  *
19  */
20
21 typedef struct cm_vol_state {
22     struct cm_volume *nextp;            /* volumeIDHashTable; by cm_volumeLock */
23     afs_uint32      ID;                 /* by rw */
24     struct cm_fid dotdotFid;            /* parent of volume root */
25     cm_serverRef_t *serversp;           /* by cm_serverLock */
26     enum volstatus  state;              /* by rw */
27     afs_uint32      flags;              /* by rw */
28 } cm_vol_state_t;
29
30 /* RWVOL, ROVOL, BACKVOL are defined in cm.h */
31 #define NUM_VOL_TYPES 3
32
33 typedef struct cm_volume {
34     osi_queue_t q;                      /* LRU queue; cm_volumeLock */
35     afs_uint32  magic;
36     struct cm_volume *allNextp;         /* allVolumes; by cm_volumeLock */
37     struct cm_volume *nameNextp;        /* volumeNameHashTable; by cm_volumeLock */
38     cm_cell_t *cellp;                   /* never changes */
39     char namep[VL_MAXNAMELEN];          /* name of the normal volume - assigned during allocation; */
40                                         /* by cm_volumeLock */
41     struct cm_vol_state vol[NUM_VOL_TYPES]; /* by cm_volumeLock */
42     osi_rwlock_t rw;
43     afs_uint32 flags;                   /* by rw */
44     afs_int32 refCount;                 /* by Interlocked operations */
45     struct cm_server *cbServerpRO;      /* server granting RO callback; by cm_scacheLock */
46     time_t cbExpiresRO;                 /* latest RO expiration time; by cm_scacheLock */
47     time_t creationDateRO;              /* latest volume creation date; 0 if unknown; by cm_scacheLock */
48 } cm_volume_t;
49
50 #define CM_VOLUMEFLAG_RESET        1    /* reload this info on next use */
51 #define CM_VOLUMEFLAG_IN_HASH      2
52 #define CM_VOLUMEFLAG_IN_LRU_QUEUE 4
53 #define CM_VOLUMEFLAG_UPDATING_VL  8
54 #define CM_VOLUMEFLAG_DFS_VOLUME  16
55
56 typedef struct cm_volumeRef {
57     struct cm_volumeRef * next;
58     afs_uint32  volID;
59 } cm_volumeRef_t;
60
61 extern void cm_InitVolume(int newFile, long maxVols);
62
63 extern long cm_FindVolumeByName(struct cm_cell *cellp, char *volNamep, 
64                                struct cm_user *userp, struct cm_req *reqp, 
65                                afs_uint32 flags, cm_volume_t **outVolpp);
66
67 extern long cm_FindVolumeByID(struct cm_cell *cellp, afs_uint32 volumeID,
68                              cm_user_t *userp, cm_req_t *reqp, 
69                              afs_uint32 flags, cm_volume_t **outVolpp);
70
71 #define CM_GETVOL_FLAG_CREATE               1
72 #define CM_GETVOL_FLAG_NO_LRU_UPDATE        2
73 #define CM_GETVOL_FLAG_NO_RESET             4
74 #define CM_GETVOL_FLAG_IGNORE_LINKED_CELL   8
75
76 /* hash define.  Must not include the cell, since the callback revocation code
77  * doesn't necessarily know the cell in the case of a multihomed server
78  * contacting us from a mystery address.
79  */
80 #define CM_VOLUME_ID_HASH(volid)   ((unsigned long) volid \
81                                         % cm_data.volumeHashTableSize)
82
83 #define CM_VOLUME_NAME_HASH(name)  (SDBMHash(name) % cm_data.volumeHashTableSize)
84
85 extern afs_uint32 SDBMHash(const char *);
86
87 extern void cm_GetVolume(cm_volume_t *volp);
88
89 extern cm_volume_t *cm_GetVolumeByFID(cm_fid_t *);
90
91 extern void cm_PutVolume(cm_volume_t *volp);
92
93 extern long cm_GetROVolumeID(cm_volume_t *volp);
94
95 extern long cm_ForceUpdateVolume(struct cm_fid *fidp, cm_user_t *userp,
96         cm_req_t *reqp);
97
98 extern cm_serverRef_t **cm_GetVolServers(cm_volume_t *volp, afs_uint32 volume, 
99                                          cm_user_t *userp, cm_req_t *reqp);
100
101 extern void cm_ChangeRankVolume(cm_server_t *tsp);
102
103 extern void cm_RefreshVolumes(void);
104
105 extern long cm_ValidateVolume(void);
106
107 extern long cm_ShutdownVolume(void);
108
109 extern int cm_DumpVolumes(FILE *outputFile, char *cookie, int lock);
110
111 extern int cm_VolNameIsID(char *aname);
112
113 extern void cm_RemoveVolumeFromNameHashTable(cm_volume_t * volp);
114
115 extern void cm_RemoveVolumeFromIDHashTable(cm_volume_t * volp, afs_uint32 volType);
116
117 extern void cm_AddVolumeToNameHashTable(cm_volume_t * volp);
118
119 extern void cm_AddVolumeToIDHashTable(cm_volume_t * volp, afs_uint32 volType);
120
121 extern void cm_AdjustVolumeLRU(cm_volume_t *volp);
122
123 extern void cm_MoveVolumeToLRULast(cm_volume_t *volp);
124
125 extern void cm_RemoveVolumeFromLRU(cm_volume_t *volp);
126
127 extern void cm_CheckOfflineVolumes(void);
128
129 extern long cm_CheckOfflineVolume(cm_volume_t *volp, afs_uint32 volID);
130
131 extern void cm_CheckOfflineVolumeState(cm_volume_t *volp, cm_vol_state_t *statep, 
132                                        afs_uint32 volID,  afs_uint32 *onlinep, 
133                                        afs_uint32 *volumeUpdatedp);
134
135 extern void cm_UpdateVolumeStatus(cm_volume_t *volp, afs_uint32 volID);
136
137 extern void cm_VolumeStatusNotification(cm_volume_t * volp, afs_uint32 volID, enum volstatus oldState, enum volstatus newState);
138
139 extern enum volstatus cm_GetVolumeStatus(cm_volume_t *volp, afs_uint32 volID);
140
141 extern void cm_VolumeRenewROCallbacks(void);
142
143 extern cm_vol_state_t * cm_VolumeStateByType(cm_volume_t *volp, afs_uint32 type);
144
145 extern cm_vol_state_t * cm_VolumeStateByID(cm_volume_t *volp, afs_uint32 id);
146
147 extern cm_vol_state_t * cm_VolumeStateByName(cm_volume_t *volp, char *volname);
148
149 extern afs_int32 cm_VolumeType(cm_volume_t *volp, afs_uint32 id);
150
151 extern osi_rwlock_t cm_volumeLock;
152 #endif /*  __CM_VOLUME_H_ENV__ */