* License. For details, see the LICENSE file in the top-level source
* directory or online at http://www.openafs.org/dl/license10.html
*
- * Portions Copyright (c) 2006 Sine Nomine Associates
+ * Portions Copyright (c) 2006-2008 Sine Nomine Associates
*/
/*
#define __fssync_h_
-#define FSYNC_PROTO_VERSION 2
-
-
-/* FSYNC command codes */
-#define FSYNC_VOL_ON SYNC_COM_CODE_DECL(0) /* Volume online */
-#define FSYNC_VOL_OFF SYNC_COM_CODE_DECL(1) /* Volume offline */
-#define FSYNC_VOL_LISTVOLUMES SYNC_COM_CODE_DECL(2) /* Update local volume list */
-#define FSYNC_VOL_NEEDVOLUME SYNC_COM_CODE_DECL(3) /* Put volume in whatever mode (offline, or whatever)
- * best fits the attachment mode provided in reason */
-#define FSYNC_VOL_MOVE SYNC_COM_CODE_DECL(4) /* Generate temporary relocation information
- * for this volume to another site, to be used
- * if this volume disappears */
-#define FSYNC_VOL_BREAKCBKS SYNC_COM_CODE_DECL(5) /* Break all the callbacks on this volume */
-#define FSYNC_VOL_DONE SYNC_COM_CODE_DECL(6) /* Done with this volume (used after a delete).
- * Don't put online, but remove from list */
-#define FSYNC_VOL_QUERY SYNC_COM_CODE_DECL(7) /* query the volume state */
-#define FSYNC_VOL_QUERY_HDR SYNC_COM_CODE_DECL(8) /* query the volume disk data structure */
-#define FSYNC_VOL_QUERY_VOP SYNC_COM_CODE_DECL(9) /* query the volume for pending vol op info */
-#define FSYNC_VOL_STATS_GENERAL SYNC_COM_CODE_DECL(10) /* query the general volume package statistics */
-#define FSYNC_VOL_STATS_VICEP SYNC_COM_CODE_DECL(11) /* query the per-partition volume package stats */
-#define FSYNC_VOL_STATS_HASH SYNC_COM_CODE_DECL(12) /* query the per hash-chain volume package stats */
-#define FSYNC_VOL_STATS_HDR SYNC_COM_CODE_DECL(13) /* query the volume header cache statistics */
-#define FSYNC_VOL_STATS_VLRU SYNC_COM_CODE_DECL(14) /* query the VLRU statistics */
-
-/* FSYNC reason codes */
-#define FSYNC_WHATEVER SYNC_REASON_CODE_DECL(0) /* XXXX */
-#define FSYNC_SALVAGE SYNC_REASON_CODE_DECL(1) /* volume is being salvaged */
-#define FSYNC_MOVE SYNC_REASON_CODE_DECL(2) /* volume is being moved */
-#define FSYNC_OPERATOR SYNC_REASON_CODE_DECL(3) /* operator forced volume offline */
-#define FSYNC_EXCLUSIVE SYNC_REASON_CODE_DECL(4) /* somebody else has the volume offline */
-#define FSYNC_UNKNOWN_VOLID SYNC_REASON_CODE_DECL(5) /* volume id not known by fileserver */
-#define FSYNC_HDR_NOT_ATTACHED SYNC_REASON_CODE_DECL(6) /* volume header not currently attached */
-#define FSYNC_NO_PENDING_VOL_OP SYNC_REASON_CODE_DECL(7) /* no volume operation pending */
-#define FSYNC_VOL_PKG_ERROR SYNC_REASON_CODE_DECL(8) /* error in the volume package */
+#define FSYNC_PROTO_VERSION 3
-/* FSYNC response codes */
-/* FSYNC flag codes */
+/**
+ * FSYNC command codes.
+ *
+ * If you add more command codes here, be sure to add some documentation
+ * in doc/arch/fssync.txt.
+ */
+enum FSYNCOpCode {
+ FSYNC_VOL_ON = SYNC_COM_CODE_DECL(0), /**< bring Volume online */
+ FSYNC_VOL_OFF = SYNC_COM_CODE_DECL(1), /**< take Volume offline */
+ FSYNC_VOL_LISTVOLUMES = SYNC_COM_CODE_DECL(2), /**< Update local volume list */
+ FSYNC_VOL_NEEDVOLUME = SYNC_COM_CODE_DECL(3), /**< Put volume in whatever mode (offline, or whatever)
+ * best fits the attachment mode provided in reason */
+ FSYNC_VOL_MOVE = SYNC_COM_CODE_DECL(4), /**< Generate temporary relocation information
+ * for this volume to another site, to be used
+ * if this volume disappears */
+ FSYNC_VOL_BREAKCBKS = SYNC_COM_CODE_DECL(5), /**< Break all the callbacks on this volume */
+ FSYNC_VOL_DONE = SYNC_COM_CODE_DECL(6), /**< Done with this volume (used after a delete).
+ * Don't put online, but remove from list */
+ FSYNC_VOL_QUERY = SYNC_COM_CODE_DECL(7), /**< query the volume state */
+ FSYNC_VOL_QUERY_HDR = SYNC_COM_CODE_DECL(8), /**< query the volume disk data structure */
+ FSYNC_VOL_QUERY_VOP = SYNC_COM_CODE_DECL(9), /**< query the volume for pending vol op info */
+ FSYNC_VOL_STATS_GENERAL = SYNC_COM_CODE_DECL(10), /**< query the general volume package statistics */
+ FSYNC_VOL_STATS_VICEP = SYNC_COM_CODE_DECL(11), /**< query the per-partition volume package stats */
+ FSYNC_VOL_STATS_HASH = SYNC_COM_CODE_DECL(12), /**< query the per hash-chain volume package stats */
+ FSYNC_VOL_STATS_HDR = SYNC_COM_CODE_DECL(13), /**< query the volume header cache statistics */
+ FSYNC_VOL_STATS_VLRU = SYNC_COM_CODE_DECL(14), /**< query the VLRU statistics */
+ FSYNC_VOL_ATTACH = SYNC_COM_CODE_DECL(15), /**< Force volume online */
+ FSYNC_VOL_FORCE_ERROR = SYNC_COM_CODE_DECL(16), /**< force volume into error state */
+ FSYNC_VOL_LEAVE_OFF = SYNC_COM_CODE_DECL(17), /**< end vol op, but leave volume offline */
+ FSYNC_VOL_QUERY_VNODE = SYNC_COM_CODE_DECL(18), /**< query vnode state */
+ FSYNC_OP_CODE_END
+};
+/**
+ * FSYNC reason codes.
+ */
+enum FSYNCReasonCode {
+ FSYNC_WHATEVER = SYNC_REASON_CODE_DECL(0), /**< XXXX */
+ FSYNC_SALVAGE = SYNC_REASON_CODE_DECL(1), /**< volume is being salvaged */
+ FSYNC_MOVE = SYNC_REASON_CODE_DECL(2), /**< volume is being moved */
+ FSYNC_OPERATOR = SYNC_REASON_CODE_DECL(3), /**< operator forced volume offline */
+ FSYNC_EXCLUSIVE = SYNC_REASON_CODE_DECL(4), /**< somebody else has the volume offline */
+ FSYNC_UNKNOWN_VOLID = SYNC_REASON_CODE_DECL(5), /**< volume id not known by fileserver */
+ FSYNC_HDR_NOT_ATTACHED = SYNC_REASON_CODE_DECL(6), /**< volume header not currently attached */
+ FSYNC_NO_PENDING_VOL_OP = SYNC_REASON_CODE_DECL(7), /**< no volume operation pending */
+ FSYNC_VOL_PKG_ERROR = SYNC_REASON_CODE_DECL(8), /**< error in the volume package */
+ FSYNC_UNKNOWN_VNID = SYNC_REASON_CODE_DECL(9), /**< vnode id not known by fileserver */
+ FSYNC_WRONG_PART = SYNC_REASON_CODE_DECL(10),/**< volume attached on different partition */
+ FSYNC_BAD_STATE = SYNC_REASON_CODE_DECL(11),/**< current volume state does not allow this operation */
+ FSYNC_REASON_CODE_END
+};
+/* FSYNC response codes */
+
+/* FSYNC flag codes */
struct offlineInfo {
afs_uint32 volumeID;
char partName[16];
};
+/**
+ * fssync protocol volume operation request message.
+ */
typedef struct FSSYNC_VolOp_hdr {
- afs_uint32 volume; /* volume id associated with request */
- char partName[16]; /* partition name, e.g. /vicepa */
+ afs_uint32 volume; /**< volume id associated with request */
+ char partName[16]; /**< partition name, e.g. /vicepa */
} FSSYNC_VolOp_hdr;
typedef struct FSSYNC_VolOp_command {
struct offlineInfo * volumes;
} FSSYNC_VolOp_command;
+
+/**
+ * volume operation processing state.
+ */
+enum FSSYNC_VolOpState {
+ FSSYNC_VolOpPending = 0, /**< volume operation request received */
+ FSSYNC_VolOpDenied = 1, /**< volume operation request denied */
+ FSSYNC_VolOpRunningOnline = 2, /**< volume operation is running while volume is online */
+ FSSYNC_VolOpRunningOffline = 3, /**< volume operation is running while volume is offline */
+ FSSYNC_VolOpRunningUnknown = 4 /**< volume operation is running; VVolOpLeaveOnline_r resolution unknown */
+};
+
+/**
+ * volume operation information node.
+ *
+ * @note this structure is attached to a struct Volume to signify that
+ * a volume operation is in-progress.
+ *
+ * @see Volume
+ * @see VRegisterVolOp_r
+ * @see VDeregisterVolOp_r
+ */
typedef struct FSSYNC_VolOp_info {
SYNC_command_hdr com;
FSSYNC_VolOp_hdr vop;
+ enum FSSYNC_VolOpState vol_op_state;
} FSSYNC_VolOp_info;
+/**
+ * fssync protocol volume package statistics request node.
+ */
typedef struct FSSYNC_StatsOp_hdr {
union {
- afs_uint32 vlru_generation;
- afs_uint32 hash_bucket;
- char partName[16];
+ afs_uint32 vlru_generation; /**< vlru generation id */
+ afs_uint32 hash_bucket; /**< volume hash bucket */
+ char partName[16]; /**< partition name */
} args;
} FSSYNC_StatsOp_hdr;
SYNC_command * com;
} FSSYNC_StatsOp_command;
+/**
+ * fssync protocol vnode query request message.
+ */
+typedef struct FSSYNC_VnQry_hdr {
+ afs_uint32 volume; /**< volume id */
+ afs_uint32 vnode; /**< vnode id */
+ afs_uint32 unique; /**< uniqifier */
+ afs_uint32 spare; /**< reserved for future use */
+ char partName[16]; /**< partition name */
+} FSSYNC_VnQry_hdr;
+#define FSSYNC_IN_PORT 2040
+#define FSSYNC_UN_PATH "fssync.sock"
+#define FSSYNC_ENDPOINT_DECL SYNC_ENDPOINT_DECL(FSSYNC_IN_PORT, FSSYNC_UN_PATH)
+
/*
* common interfaces
*/
extern afs_int32 FSYNC_StatsOp(FSSYNC_StatsOp_hdr * scom, int command, int reason,
SYNC_response * res_in);
+extern void FSYNC_fsInit(void);
+
#endif /* __fssync_h_ */