/*
* Copyright 2000, International Business Machines Corporation and others.
* All Rights Reserved.
- *
+ *
* This software has been released under the terms of the IBM Public
* 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-2010 Sine Nomine Associates
*/
/*
*/
+#ifndef __fssync_h_
+#define __fssync_h_
-/* FSYNC commands */
+#define FSYNC_PROTO_VERSION 3
-#define FSYNC_ON 1 /* Volume online */
-#define FSYNC_OFF 2 /* Volume offline */
-#define FSYNC_LISTVOLUMES 3 /* Update local volume list */
-#define FSYNC_NEEDVOLUME 4 /* Put volume in whatever mode (offline, or whatever)
- best fits the attachment mode provided in reason */
-#define FSYNC_MOVEVOLUME 5 /* Generate temporary relocation information
- for this volume to another site, to be used
- if this volume disappears */
-#define FSYNC_RESTOREVOLUME 6 /* Break all the callbacks on this volume since it is being restored */
-#define FSYNC_DONE 7 /* Done with this volume (used after a delete).
- Don't put online, but remove from list */
+#include "voldefs.h"
+/**
+ * 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_VG_QUERY = SYNC_COM_CODE_DECL(19), /**< Query volume group membership for a given volume id */
+ FSYNC_VG_ADD = SYNC_COM_CODE_DECL(20), /**< add a volume id to a vg */
+ FSYNC_VG_DEL = SYNC_COM_CODE_DECL(21), /**< delete a volume id from a vg */
+ FSYNC_VG_SCAN = SYNC_COM_CODE_DECL(22), /**< force a re-scan of a given partition */
+ FSYNC_VG_SCAN_ALL = SYNC_COM_CODE_DECL(23), /**< force a re-scan of all vice partitions */
+ 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_BAD_PART = SYNC_REASON_CODE_DECL(12),/**< invalid disk partition */
+ FSYNC_PART_SCANNING = SYNC_REASON_CODE_DECL(13),/**< partition is busy scanning VGs */
+ 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 */
+} FSSYNC_VolOp_hdr;
+
+typedef struct FSSYNC_VolOp_command {
+ SYNC_command_hdr * hdr;
+ FSSYNC_VolOp_hdr * vop;
+ SYNC_command * com;
+ struct offlineInfo * v;
+ 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;
-/* Reasons (these could be communicated to venus or converted to messages) */
-#define FSYNC_WHATEVER 0 /* XXXX */
-#define FSYNC_SALVAGE 1 /* volume is being salvaged */
-#define FSYNC_MOVE 2 /* volume is being moved */
-#define FSYNC_OPERATOR 3 /* operator forced volume offline */
+/**
+ * fssync protocol volume package statistics request node.
+ */
+typedef struct FSSYNC_StatsOp_hdr {
+ union {
+ afs_uint32 vlru_generation; /**< vlru generation id */
+ afs_uint32 hash_bucket; /**< volume hash bucket */
+ char partName[16]; /**< partition name */
+ } args;
+} FSSYNC_StatsOp_hdr;
+
+typedef struct FSSYNC_StatsOp_command {
+ SYNC_command_hdr * hdr;
+ FSSYNC_StatsOp_hdr * sop;
+ 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;
+
+/**
+ * fssync protocol volume group query response message.
+ */
+typedef struct FSSYNC_VGQry_response {
+ afs_uint32 rw; /**< rw volume id */
+ afs_uint32 children[VOL_VG_MAX_VOLS]; /**< vector of children */
+} FSSYNC_VGQry_response_t;
+/**
+ * fssync protocol volume group update command message.
+ */
+typedef struct FSSYNC_VGUpdate_command {
+ afs_uint32 parent; /**< rw volume id */
+ afs_uint32 child; /**< volume id to associate with parent
+ * (can legally be the parent itself) */
+ char partName[16]; /**< name of vice partition on which this
+ * volume group resides */
+} FSSYNC_VGUpdate_command_t;
+
+#define FSSYNC_IN_PORT 2040
+#define FSSYNC_UN_PATH "fssync.sock"
+#define FSSYNC_ENDPOINT_DECL SYNC_ENDPOINT_DECL(FSSYNC_IN_PORT, FSSYNC_UN_PATH)
-/* Replies (1 byte) */
+/*
+ * common interfaces
+ */
+extern void FSYNC_Init(void);
+
+/*
+ * fsync client interfaces
+ */
+extern void FSYNC_clientFinis(void);
+extern int FSYNC_clientInit(void);
+extern int FSYNC_clientChildProcReconnect(void);
+
+/* generic low-level interface */
+extern afs_int32 FSYNC_askfs(SYNC_command * com, SYNC_response * res);
-#define FSYNC_DENIED 0
-#define FSYNC_OK 1
+/* generic higher-level interface */
+extern afs_int32 FSYNC_GenericOp(void * ext_hdr, size_t ext_len,
+ int command, int reason,
+ SYNC_response * res);
+/*
+ * volume operations control interface
+ *
+ * FSYNC_VolOp must be called with the partition name and not the partition path.
+ */
+extern afs_int32 FSYNC_VolOp(VolumeId volume, char *partName, int com, int reason,
+ SYNC_response * res);
-/* Prototypes from fssync.c */
-void FSYNC_clientFinis(void);
-int FSYNC_clientInit(void);
-void FSYNC_fsInit(void);
-int FSYNC_askfs(VolumeId volume, char *partName, int com, int reason);
+/* statistics query interface */
+extern afs_int32 FSYNC_StatsOp(FSSYNC_StatsOp_hdr * scom, int command, int reason,
+ SYNC_response * res_in);
+extern void FSYNC_fsInit(void);
+/* volume group cache coherence interfaces */
+extern afs_int32 FSYNC_VGCQuery(char * part, VolumeId parent,
+ FSSYNC_VGQry_response_t *, SYNC_response *res);
+extern afs_int32 FSYNC_VGCAdd(char *part, VolumeId parent, VolumeId child,
+ int reason, SYNC_response *res);
+extern afs_int32 FSYNC_VGCDel(char *part, VolumeId parent, VolumeId child,
+ int reason, SYNC_response *res);
+extern afs_int32 FSYNC_VGCScan(char *part, int reason);
+extern afs_int32 FSYNC_VerifyCheckout(VolumeId volume, char *partition,
+ afs_int32 command, afs_int32 reason);
+#endif /* __fssync_h_ */