1f89ddeab37b5c404944c18a505cc552747a961f
[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 enum volstatus {vl_online, vl_busy, vl_offline, vl_alldown, vl_unknown};
18
19 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 */
25 };
26
27 typedef struct cm_volume {
28     osi_queue_t q;                      /* LRU queue; cm_volumeLock */
29     afs_uint32  magic;
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 */
39     osi_mutex_t mx;
40     afs_uint32 flags;                   /* by mx */
41     afs_uint32 refCount;                /* by cm_volumeLock */
42 } cm_volume_t;
43
44 #define CM_VOLUMEFLAG_RESET        1    /* reload this info on next use */
45 #define CM_VOLUMEFLAG_IN_HASH      2
46 #define CM_VOLUMEFLAG_IN_LRU_QUEUE 4
47
48
49 typedef struct cm_volumeRef {
50     struct cm_volumeRef * next;
51     afs_uint32  volID;
52 } cm_volumeRef_t;
53
54 extern void cm_InitVolume(int newFile, long maxVols);
55
56 extern long cm_GetVolumeByName(struct cm_cell *cellp, char *volNamep, 
57                                struct cm_user *userp, struct cm_req *reqp, 
58                                afs_uint32 flags, cm_volume_t **outVolpp);
59
60 extern long cm_GetVolumeByID(struct cm_cell *cellp, afs_uint32 volumeID,
61                              cm_user_t *userp, cm_req_t *reqp, 
62                              afs_uint32 flags, cm_volume_t **outVolpp);
63
64 #define CM_GETVOL_FLAG_CREATE               1
65 #define CM_GETVOL_FLAG_NO_LRU_UPDATE        2
66
67 /* hash define.  Must not include the cell, since the callback revocation code
68  * doesn't necessarily know the cell in the case of a multihomed server
69  * contacting us from a mystery address.
70  */
71 #define CM_VOLUME_ID_HASH(volid)   ((unsigned long) volid \
72                                         % cm_data.volumeHashTableSize)
73
74 #define CM_VOLUME_NAME_HASH(name)  (SDBMHash(name) % cm_data.volumeHashTableSize)
75
76 extern afs_uint32 SDBMHash(const char *);
77
78 extern void cm_GetVolume(cm_volume_t *volp);
79
80 extern void cm_PutVolume(cm_volume_t *volp);
81
82 extern long cm_GetROVolumeID(cm_volume_t *volp);
83
84 extern void cm_ForceUpdateVolume(struct cm_fid *fidp, cm_user_t *userp,
85         cm_req_t *reqp);
86
87 extern cm_serverRef_t **cm_GetVolServers(cm_volume_t *volp, afs_uint32 volume);
88
89 extern void cm_ChangeRankVolume(cm_server_t *tsp);
90
91 extern void cm_RefreshVolumes(void);
92
93 extern long cm_ValidateVolume(void);
94
95 extern long cm_ShutdownVolume(void);
96
97 extern int cm_DumpVolumes(FILE *outputFile, char *cookie, int lock);
98
99 extern int cm_VolNameIsID(char *aname);
100
101 extern void cm_RemoveVolumeFromNameHashTable(cm_volume_t * volp);
102
103 extern void cm_RemoveVolumeFromIDHashTable(cm_volume_t * volp, afs_uint32 volType);
104
105 extern void cm_AddVolumeToNameHashTable(cm_volume_t * volp);
106
107 extern void cm_AddVolumeToIDHashTable(cm_volume_t * volp, afs_uint32 volType);
108
109 extern void cm_AdjustVolumeLRU(cm_volume_t *volp);
110
111 extern void cm_RemoveVolumeFromLRU(cm_volume_t *volp);
112
113 extern void cm_CheckBusyVolumes(void);
114
115 extern void cm_UpdateVolumeStatus(cm_volume_t *volp, afs_uint32 volID);
116
117 extern void cm_VolumeStatusNotification(cm_volume_t * volp, afs_uint32 volID, enum volstatus old, enum volstatus new);
118
119 #endif /*  __CM_VOLUME_H_ENV__ */