dafs-vnode-locking-20080204
[openafs.git] / src / vol / fssync.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  * Portions Copyright (c) 2006-2008 Sine Nomine Associates
10  */
11
12 /*
13         System:         VICE-TWO
14         Module:         fssync.h
15         Institution:    The Information Technology Center, Carnegie-Mellon University
16
17  */
18
19 #ifndef __fssync_h_
20 #define __fssync_h_
21
22
23 #define FSYNC_PROTO_VERSION     2
24
25
26 /**
27  * FSYNC command codes.
28  */
29 enum FSYNCOpCode {
30     FSYNC_VOL_ON              = SYNC_COM_CODE_DECL(0),  /**< bring Volume online */
31     FSYNC_VOL_OFF             = SYNC_COM_CODE_DECL(1),  /**< take Volume offline */
32     FSYNC_VOL_LISTVOLUMES     = SYNC_COM_CODE_DECL(2),  /**< Update local volume list */
33     FSYNC_VOL_NEEDVOLUME      = SYNC_COM_CODE_DECL(3),  /**< Put volume in whatever mode (offline, or whatever)
34                                                          *   best fits the attachment mode provided in reason */
35     FSYNC_VOL_MOVE            = SYNC_COM_CODE_DECL(4),  /**< Generate temporary relocation information
36                                                          *   for this volume to another site, to be used
37                                                          *   if this volume disappears */
38     FSYNC_VOL_BREAKCBKS       = SYNC_COM_CODE_DECL(5),  /**< Break all the callbacks on this volume */
39     FSYNC_VOL_DONE            = SYNC_COM_CODE_DECL(6),  /**< Done with this volume (used after a delete).
40                                                          *   Don't put online, but remove from list */
41     FSYNC_VOL_QUERY           = SYNC_COM_CODE_DECL(7),  /**< query the volume state */
42     FSYNC_VOL_QUERY_HDR       = SYNC_COM_CODE_DECL(8),  /**< query the volume disk data structure */
43     FSYNC_VOL_QUERY_VOP       = SYNC_COM_CODE_DECL(9),  /**< query the volume for pending vol op info */
44     FSYNC_VOL_STATS_GENERAL   = SYNC_COM_CODE_DECL(10), /**< query the general volume package statistics */
45     FSYNC_VOL_STATS_VICEP     = SYNC_COM_CODE_DECL(11), /**< query the per-partition volume package stats */
46     FSYNC_VOL_STATS_HASH      = SYNC_COM_CODE_DECL(12), /**< query the per hash-chain volume package stats */
47     FSYNC_VOL_STATS_HDR       = SYNC_COM_CODE_DECL(13), /**< query the volume header cache statistics */
48     FSYNC_VOL_STATS_VLRU      = SYNC_COM_CODE_DECL(14), /**< query the VLRU statistics */
49     FSYNC_VOL_ATTACH          = SYNC_COM_CODE_DECL(15), /**< Force volume online */
50     FSYNC_VOL_FORCE_ERROR     = SYNC_COM_CODE_DECL(16), /**< force volume into error state */
51     FSYNC_VOL_LEAVE_OFF       = SYNC_COM_CODE_DECL(17), /**< end vol op, but leave volume offline */
52     FSYNC_VOL_QUERY_VNODE     = SYNC_COM_CODE_DECL(18), /**< query vnode state */
53 };
54
55 /**
56  * FSYNC reason codes. 
57  */
58 enum FSYNCReasonCode {
59     FSYNC_WHATEVER            = SYNC_REASON_CODE_DECL(0), /**< XXXX */
60     FSYNC_SALVAGE             = SYNC_REASON_CODE_DECL(1), /**< volume is being salvaged */
61     FSYNC_MOVE                = SYNC_REASON_CODE_DECL(2), /**< volume is being moved */
62     FSYNC_OPERATOR            = SYNC_REASON_CODE_DECL(3), /**< operator forced volume offline */
63     FSYNC_EXCLUSIVE           = SYNC_REASON_CODE_DECL(4), /**< somebody else has the volume offline */
64     FSYNC_UNKNOWN_VOLID       = SYNC_REASON_CODE_DECL(5), /**< volume id not known by fileserver */
65     FSYNC_HDR_NOT_ATTACHED    = SYNC_REASON_CODE_DECL(6), /**< volume header not currently attached */
66     FSYNC_NO_PENDING_VOL_OP   = SYNC_REASON_CODE_DECL(7), /**< no volume operation pending */
67     FSYNC_VOL_PKG_ERROR       = SYNC_REASON_CODE_DECL(8), /**< error in the volume package */
68     FSYNC_UNKNOWN_VNID        = SYNC_REASON_CODE_DECL(9), /**< vnode id not known by fileserver */
69 };
70
71 /* FSYNC response codes */
72
73 /* FSYNC flag codes */
74
75 struct offlineInfo {
76     afs_uint32 volumeID;
77     char partName[16];
78 };
79
80 /**
81  * fssync protocol volume operation request message.
82  */
83 typedef struct FSSYNC_VolOp_hdr {
84     afs_uint32 volume;          /**< volume id associated with request */
85     char partName[16];          /**< partition name, e.g. /vicepa */
86 } FSSYNC_VolOp_hdr;
87
88 typedef struct FSSYNC_VolOp_command {
89     SYNC_command_hdr * hdr;
90     FSSYNC_VolOp_hdr * vop;
91     SYNC_command * com;
92     struct offlineInfo * v;
93     struct offlineInfo * volumes;
94 } FSSYNC_VolOp_command;
95
96 /**
97  * volume operation information node.
98  *
99  * @note this structure is attached to a struct Volume to signify that
100  *       a volume operation is in-progress.
101  *
102  * @see Volume
103  * @see VRegisterVolOp_r
104  * @see VDeregisterVolOp_r
105  */
106 typedef struct FSSYNC_VolOp_info {
107     SYNC_command_hdr com;
108     FSSYNC_VolOp_hdr vop;
109 } FSSYNC_VolOp_info;
110
111
112 /**
113  * fssync protocol volume package statistics request node.
114  */
115 typedef struct FSSYNC_StatsOp_hdr {
116     union {
117         afs_uint32 vlru_generation;     /**< vlru generation id */
118         afs_uint32 hash_bucket;         /**< volume hash bucket */
119         char partName[16];              /**< partition name */
120     } args;
121 } FSSYNC_StatsOp_hdr;
122
123 typedef struct FSSYNC_StatsOp_command {
124     SYNC_command_hdr * hdr;
125     FSSYNC_StatsOp_hdr * sop;
126     SYNC_command * com;
127 } FSSYNC_StatsOp_command;
128
129 /**
130  * fssync protocol vnode query request message.
131  */
132 typedef struct FSSYNC_VnQry_hdr {
133     afs_uint32 volume;          /**< volume id */
134     afs_uint32 vnode;           /**< vnode id */
135     afs_uint32 unique;          /**< uniqifier */
136     afs_uint32 spare;           /**< reserved for future use */
137     char partName[16];          /**< partition name */
138 } FSSYNC_VnQry_hdr;
139
140
141 #define FSSYNC_IN_PORT 2040
142 #define FSSYNC_UN_PATH "fssync.sock"
143 #define FSSYNC_ENDPOINT_DECL    SYNC_ENDPOINT_DECL(FSSYNC_IN_PORT, FSSYNC_UN_PATH)
144
145 /*
146  * common interfaces
147  */
148 extern void FSYNC_Init(void);
149
150 /* 
151  * fsync client interfaces 
152  */
153 extern void FSYNC_clientFinis(void);
154 extern int FSYNC_clientInit(void);
155 extern int FSYNC_clientChildProcReconnect(void);
156
157 /* generic low-level interface */
158 extern afs_int32 FSYNC_askfs(SYNC_command * com, SYNC_response * res);
159
160 /* generic higher-level interface */
161 extern afs_int32 FSYNC_GenericOp(void * ext_hdr, size_t ext_len,
162                                  int command, int reason,
163                                  SYNC_response * res);
164
165 /* volume operations interface */
166 extern afs_int32 FSYNC_VolOp(VolumeId volume, char *partName, int com, int reason, 
167                              SYNC_response * res);
168
169 /* statistics query interface */
170 extern afs_int32 FSYNC_StatsOp(FSSYNC_StatsOp_hdr * scom, int command, int reason,
171                                SYNC_response * res_in);
172
173 #endif /* __fssync_h_ */