2 * Copyright 2000, International Business Machines Corporation and others.
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
10 #ifndef __CM_VOLUME_H_ENV__
11 #define __CM_VOLUME_H_ENV__ 1
13 #define VL_MAXNAMELEN 65
15 #define CM_VOLUME_MAGIC ('V' | 'O' <<8 | 'L'<<16 | 'M'<<24)
17 enum volstatus {vl_online, vl_busy, vl_offline, vl_alldown, vl_unknown};
19 typedef struct cm_vol_state {
20 afs_uint32 ID; /* by mx */
21 struct cm_volume *nextp; /* volumeIDHashTable; by cm_volumeLock */
22 cm_serverRef_t *serversp; /* by mx */
23 enum volstatus state; /* by mx */
24 afs_uint32 flags; /* by mx */
27 typedef struct cm_volume {
28 osi_queue_t q; /* LRU queue; cm_volumeLock */
30 struct cm_volume *allNextp; /* allVolumes; by cm_volumeLock */
31 struct cm_volume *nameNextp; /* volumeNameHashTable; by cm_volumeLock */
32 cm_cell_t *cellp; /* never changes */
33 char namep[VL_MAXNAMELEN]; /* name of the normal volume - assigned during allocation; */
34 /* by cm_volumeLock */
35 struct cm_vol_state rw; /* by cm_volumeLock */
36 struct cm_vol_state ro; /* by cm_volumeLock */
37 struct cm_vol_state bk; /* by cm_volumeLock */
38 struct cm_fid dotdotFid; /* parent of volume root */
40 afs_uint32 flags; /* by mx */
41 afs_uint32 refCount; /* by cm_volumeLock */
42 time_t cbExpiresRO; /* latest RO expiration time; by cm_scacheLock */
45 #define CM_VOLUMEFLAG_RESET 1 /* reload this info on next use */
46 #define CM_VOLUMEFLAG_IN_HASH 2
47 #define CM_VOLUMEFLAG_IN_LRU_QUEUE 4
50 typedef struct cm_volumeRef {
51 struct cm_volumeRef * next;
55 extern void cm_InitVolume(int newFile, long maxVols);
57 extern long cm_GetVolumeByName(struct cm_cell *cellp, char *volNamep,
58 struct cm_user *userp, struct cm_req *reqp,
59 afs_uint32 flags, cm_volume_t **outVolpp);
61 extern long cm_GetVolumeByID(struct cm_cell *cellp, afs_uint32 volumeID,
62 cm_user_t *userp, cm_req_t *reqp,
63 afs_uint32 flags, cm_volume_t **outVolpp);
65 #define CM_GETVOL_FLAG_CREATE 1
66 #define CM_GETVOL_FLAG_NO_LRU_UPDATE 2
68 /* hash define. Must not include the cell, since the callback revocation code
69 * doesn't necessarily know the cell in the case of a multihomed server
70 * contacting us from a mystery address.
72 #define CM_VOLUME_ID_HASH(volid) ((unsigned long) volid \
73 % cm_data.volumeHashTableSize)
75 #define CM_VOLUME_NAME_HASH(name) (SDBMHash(name) % cm_data.volumeHashTableSize)
77 extern afs_uint32 SDBMHash(const char *);
79 extern void cm_GetVolume(cm_volume_t *volp);
81 extern void cm_PutVolume(cm_volume_t *volp);
83 extern long cm_GetROVolumeID(cm_volume_t *volp);
85 extern void cm_ForceUpdateVolume(struct cm_fid *fidp, cm_user_t *userp,
88 extern cm_serverRef_t **cm_GetVolServers(cm_volume_t *volp, afs_uint32 volume);
90 extern void cm_ChangeRankVolume(cm_server_t *tsp);
92 extern void cm_RefreshVolumes(void);
94 extern long cm_ValidateVolume(void);
96 extern long cm_ShutdownVolume(void);
98 extern int cm_DumpVolumes(FILE *outputFile, char *cookie, int lock);
100 extern int cm_VolNameIsID(char *aname);
102 extern void cm_RemoveVolumeFromNameHashTable(cm_volume_t * volp);
104 extern void cm_RemoveVolumeFromIDHashTable(cm_volume_t * volp, afs_uint32 volType);
106 extern void cm_AddVolumeToNameHashTable(cm_volume_t * volp);
108 extern void cm_AddVolumeToIDHashTable(cm_volume_t * volp, afs_uint32 volType);
110 extern void cm_AdjustVolumeLRU(cm_volume_t *volp);
112 extern void cm_RemoveVolumeFromLRU(cm_volume_t *volp);
114 extern void cm_CheckOfflineVolumes(void);
116 extern long cm_CheckOfflineVolume(cm_volume_t *volp, afs_uint32 volID);
118 extern void cm_UpdateVolumeStatus(cm_volume_t *volp, afs_uint32 volID);
120 extern void cm_VolumeStatusNotification(cm_volume_t * volp, afs_uint32 volID, enum volstatus old, enum volstatus new);
122 extern enum volstatus cm_GetVolumeStatus(cm_volume_t *volp, afs_uint32 volID);
124 extern void cm_VolumeRenewROCallbacks(void);
125 #endif /* __CM_VOLUME_H_ENV__ */