Initial import of binutils 2.22 on the new vendor branch
[dragonfly.git] / contrib / lvm2 / dist / daemons / clvmd / clvmd.h
1 /*      $NetBSD: clvmd.h,v 1.1.1.1 2008/12/22 00:18:51 haad Exp $       */
2
3 /*
4  * Copyright (C) 2002-2004 Sistina Software, Inc. All rights reserved.
5  * Copyright (C) 2004 Red Hat, Inc. All rights reserved.
6  *
7  * This file is part of LVM2.
8  *
9  * This copyrighted material is made available to anyone wishing to use,
10  * modify, copy, or redistribute it subject to the terms and conditions
11  * of the GNU General Public License v.2.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software Foundation,
15  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16  */
17
18 #ifndef _CLVMD_H
19 #define _CLVMD_H
20
21 #define CLVMD_MAJOR_VERSION 0
22 #define CLVMD_MINOR_VERSION 2
23 #define CLVMD_PATCH_VERSION 1
24
25 /* Name of the cluster LVM admin lock */
26 #define ADMIN_LOCK_NAME "CLVMD_ADMIN"
27
28 /* Default time (in seconds) we will wait for all remote commands to execute
29    before declaring them dead */
30 #define DEFAULT_CMD_TIMEOUT 60
31
32 /* One of these for each reply we get from command execution on a node */
33 struct node_reply {
34         char node[MAX_CLUSTER_MEMBER_NAME_LEN];
35         char *replymsg;
36         int status;
37         struct node_reply *next;
38 };
39
40 typedef enum {DEBUG_OFF, DEBUG_STDERR, DEBUG_SYSLOG} debug_t;
41
42 /*
43  * These exist for the use of local sockets only when we are
44  * collecting responses from all cluster nodes
45  */
46 struct localsock_bits {
47         struct node_reply *replies;
48         int num_replies;
49         int expected_replies;
50         time_t sent_time;       /* So we can check for timeouts */
51         int in_progress;        /* Only execute one cmd at a time per client */
52         int sent_out;           /* Flag to indicate that a command was sent
53                                    to remote nodes */
54         void *private;          /* Private area for command processor use */
55         void *cmd;              /* Whole command as passed down local socket */
56         int cmd_len;            /* Length of above */
57         int pipe;               /* Pipe to send PRE completion status down */
58         int finished;           /* Flag to tell subthread to exit */
59         int all_success;        /* Set to 0 if any node (or the pre_command)
60                                    failed */
61         struct local_client *pipe_client;
62         pthread_t threadid;
63         enum { PRE_COMMAND, POST_COMMAND, QUIT } state;
64         pthread_mutex_t mutex;  /* Main thread and worker synchronisation */
65         pthread_cond_t cond;
66
67         pthread_mutex_t reply_mutex;    /* Protect reply structure */
68 };
69
70 /* Entries for PIPE clients */
71 struct pipe_bits {
72         struct local_client *client;    /* Actual (localsock) client */
73         pthread_t threadid;             /* Our own copy of the thread id */
74 };
75
76 /* Entries for Network socket clients */
77 struct netsock_bits {
78         void *private;
79         int flags;
80 };
81
82 typedef int (*fd_callback_t) (struct local_client * fd, char *buf, int len,
83                               const char *csid,
84                               struct local_client ** new_client);
85
86 /* One of these for each fd we are listening on */
87 struct local_client {
88         int fd;
89         enum { CLUSTER_MAIN_SOCK, CLUSTER_DATA_SOCK, LOCAL_RENDEZVOUS,
90                     LOCAL_SOCK, THREAD_PIPE, CLUSTER_INTERNAL } type;
91         struct local_client *next;
92         unsigned short xid;
93         fd_callback_t callback;
94         uint8_t removeme;
95
96         union {
97                 struct localsock_bits localsock;
98                 struct pipe_bits pipe;
99                 struct netsock_bits net;
100         } bits;
101 };
102
103 #define DEBUGLOG(fmt, args...) debuglog(fmt, ## args);
104
105 #ifndef max
106 #define max(a,b) ((a)>(b)?(a):(b))
107 #endif
108
109 /* The real command processor is in clvmd-command.c */
110 extern int do_command(struct local_client *client, struct clvm_header *msg,
111                       int msglen, char **buf, int buflen, int *retlen);
112
113 /* Pre and post command routines are called only on the local node */
114 extern int do_pre_command(struct local_client *client);
115 extern int do_post_command(struct local_client *client);
116 extern void cmd_client_cleanup(struct local_client *client);
117 extern int add_client(struct local_client *new_client);
118
119 extern void clvmd_cluster_init_completed(void);
120 extern void process_message(struct local_client *client, const char *buf,
121                             int len, const char *csid);
122 extern void debuglog(const char *fmt, ... )
123   __attribute__ ((format(printf, 1, 2)));
124
125 int sync_lock(const char *resource, int mode, int flags, int *lockid);
126 int sync_unlock(const char *resource, int lockid);
127
128 #endif