1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26 #ifndef _RDC_IOCTL_H
27 #define _RDC_IOCTL_H
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 #include <sys/unistat/spcs_s.h>
34 #include <sys/nsctl/nsctl.h>
35 #ifndef DS_DDICT
36 #include <rpc/rpc.h>
37 #endif
38
39 #ifdef _SunOS_5_6
40 #define netbuf32 netbuf
41 #include <sys/nsctl/model.h>
42 #endif
43
44 typedef struct _rdc_ioctl_s {
45 long arg0;
46 long arg1;
47 long arg2;
48 long arg3;
49 long arg4;
50 long magic;
51 spcs_s_info_t ustatus;
52 long pad[1];
53 } _rdc_ioctl_t;
54
55 #ifdef _SYSCALL32
56 typedef struct _rdc_ioctl32_s {
57 int32_t arg0;
58 int32_t arg1;
59 int32_t arg2;
60 int32_t arg3;
61 int32_t arg4;
62 int32_t magic;
63 spcs_s_info32_t ustatus;
64 int32_t pad[1];
65 } _rdc_ioctl32_t;
66 #endif /* _SYSCALL32 */
67
68 /*
69 * Ioctl command numbers
70 */
71
72 #define _RDCI_(x) (('R'<<16)|('D'<<8)|(x))
73
74 /*
75 * Generic rdc ioctl arguments structure.
76 * Individual ioctl's will use 0-n of these arguments.
77 *
78 * Each rdc ioctl is described first by the command number
79 * e.g. #define RDC_CONFIG _RDCI_(0)
80 *
81 * Followed by a description of each argument (if any).
82 * Each argument is on a single line.
83 *
84 */
85
86 #define RDC_CONFIG _RDCI_(0)
87 /*
88 * rdc_config_t *user_configuration;
89 */
90
91 #define RDC_ENABLE_SVR _RDCI_(1)
92 /*
93 * rdc_svc_args_t *daemon_configuration;
94 */
95
96 #define RDC_STATUS _RDCI_(2)
97 /*
98 * rdc_status_t *rdc_status;
99 */
100
101 #define RDC_VERSION _RDCI_(3)
102 /*
103 * rdc_version_t *rdc_version;
104 */
105
106 #define RDC_LINK_DOWN _RDCI_(4)
107 /*
108 * char *rdc_host;
109 */
110
111 #define RDC_SYNC_EVENT _RDCI_(5)
112 /*
113 * char *rdc_master;
114 * char *rdc_group;
115 */
116
117 #define RDC_POOL_CREATE _RDCI_(6)
118 /*
119 * struct svcpool_args *
120 */
121
122 #define RDC_POOL_WAIT _RDCI_(7)
123 /*
124 * int id
125 */
126
127 #define RDC_POOL_RUN _RDCI_(8)
128 /*
129 * int id
130 */
131 #define RDC_BITMAPOP _RDCI_(9)
132
133 #ifdef DEBUG
134 #define RDC_ASYNC6 _RDCI_(20) /* send async message by hand */
135 #define RDC_CLRKSTAT _RDCI_(21) /* clear kstat_io structure */
136 #define RDC_STALL0 _RDCI_(22) /* stall sequence 0 on server */
137 #define RDC_READGEN _RDCI_(23) /* cause a read on server */
138 #endif
139
140
141 #define MAX_RDC_HOST_SIZE 64
142
143 /*
144 * Change this when the ioctl structure changes
145 */
146 #define RDC_MAGIC 0xf00d0001
147
148 typedef struct rdc_addr {
149 struct netbuf addr;
150 char intf[MAX_RDC_HOST_SIZE];
151 char file[NSC_MAXPATH];
152 char bitmap[NSC_MAXPATH];
153 } rdc_addr_t;
154
155 #ifdef _SYSCALL32
156 struct rdc_addr32 {
157 struct netbuf32 addr;
158 char intf[MAX_RDC_HOST_SIZE];
159 char file[NSC_MAXPATH];
160 char bitmap[NSC_MAXPATH];
161 };
162 #endif /* _SYSCALL32 */
163
164 /*
165 * User level rdc set structure - must be a multiple of 64bits long.
166 */
167 typedef struct rdc_set {
168 rdc_addr_t primary;
169 rdc_addr_t secondary;
170 struct knetconfig *netconfig;
171 long align1;
172 double alignfix;
173 int flags; /* See RDC flags below */
174 int sync_flags; /* See RDC flags below */
175 int bmap_flags; /* See RDC flags below */
176 int mflags; /* RDC 1-to-many flags */
177 int index; /* 0 .. rdc_max_sets - 1 */
178 int bits_set; /* Bits set in bitmap */
179 int autosync; /* Autosync on (1) or off (0) */
180 int syshostid; /* for cluster integration */
181 int asyncthr; /* # of async threads */
182 int setid; /* unique set id for this set */
183 uint64_t sync_pos; /* Progress through sync */
184 uint64_t volume_size; /* Size of volume */
185 int64_t maxqfbas; /* max # of fbas on async q */
186 int64_t maxqitems; /* max # of items on async q */
187 char group_name[NSC_MAXPATH]; /* Group the set belongs to */
188 char direct_file[NSC_MAXPATH]; /* Local FCAL direct io file */
189 char disk_queue[NSC_MAXPATH]; /* Disk Queue for set|group */
190 } rdc_set_t;
191
192 #ifdef _SYSCALL32
193 struct rdc_set32 {
194 struct rdc_addr32 primary;
195 struct rdc_addr32 secondary;
196 caddr32_t netconfig;
197 int32_t align1;
198 double alignfix;
199 int32_t flags; /* See RDC flags below */
200 int32_t sync_flags; /* See RDC flags below */
201 int32_t bmap_flags; /* See RDC flags below */
202 int32_t mflags; /* RDC 1-to-many flags */
203 int32_t index; /* 0 .. rdc_max_sets - 1 */
204 int32_t bits_set; /* Bits set in bitmap */
205 int32_t autosync; /* Autosync on (1) or off (0) */
206 int32_t syshostid; /* for cluster integration */
207 int32_t asyncthr; /* # of async threads */
208 int32_t setid; /* unique set id for this set */
209 uint64_t sync_pos; /* Progress through sync */
210 uint64_t volume_size; /* Size of volume */
211 int64_t maxqfbas; /* max # of fbas on async q */
212 int64_t maxqitems; /* max # of items on async q */
213 char group_name[NSC_MAXPATH]; /* Group the set belongs to */
214 char direct_file[NSC_MAXPATH]; /* Local FCAL direct io file */
215 char disk_queue[NSC_MAXPATH]; /* Disk Queue for set|group */
216 };
217 #endif /* _SYSCALL32 */
218
219 /*
220 * Parameter structure to pass to RDC_CONFIG
221 */
222
223 typedef struct rdc_config {
224 int command; /* RDC_CMD_XXX */
225 int options; /* RDC_OPT_XXX */
226 int pad[2]; /* Do NOT remove - 32/64-bit padding */
227 rdc_set_t rdc_set[1]; /* The rdc sets */
228 } rdc_config_t;
229
230 #ifdef _SYSCALL32
231 struct rdc_config32 {
232 int32_t command; /* RDC_CMD_XXX */
233 int32_t options; /* RDC_OPT_XXX */
234 int32_t pad[2]; /* Do NOT remove - 32/64-bit padding */
235 struct rdc_set32 rdc_set[1]; /* The rdc sets */
236 };
237 #endif /* _SYSCALL32 */
238
239 #define RDC_BITMAPSET 0x01
240 #define RDC_BITMAPOR 0x02
241 typedef struct rdc_bitmap_op {
242 nsc_off_t offset; /* byte offset within bitmap mod fba */
243 int32_t op; /* or/set operation */
244 char sechost[MAX_RDC_HOST_SIZE];
245 char secfile[NSC_MAXPATH];
246 int32_t len; /* length of bitmap in bytes */
247 unsigned long addr; /* address of bitmap in userland */
248 } rdc_bitmap_op_t;
249
250 #ifdef _SYSCALL32
251 typedef struct rdc_bitmap_op32 {
252 nsc_off_t offset;
253 int32_t op;
254 char sechost[MAX_RDC_HOST_SIZE];
255 char secfile[NSC_MAXPATH];
256 int32_t len;
257 uint32_t addr;
258 } rdc_bitmap_op32_t;
259
260 #endif /* _SYSCALL32 */
261
262 #ifdef DEBUG
263 /*
264 * structure to initiate an asynchronous send to the secondary,
265 * so we can test the queuing code.
266 */
267 typedef struct rdc_async6 {
268 char sechost[MAX_RDC_HOST_SIZE];
269 char secfile[NSC_MAXPATH];
270 int pos; /* Position in file */
271 int len;
272 int seq;
273 int pat; /* fill data with this */
274 int idx; /* server returned index */
275 int spos; /* sub task start block */
276 int slen; /* sub task length */
277 int endind; /* set when last block in multi request */
278 } rdc_async6_t;
279 /*
280 * structure to initiate a read on the secondary, so we can test the
281 * maxfba break up code.
282 */
283 typedef struct rdc_readgen {
284 char sechost[MAX_RDC_HOST_SIZE];
285 char secfile[NSC_MAXPATH];
286 int len;
287 int pos;
288 int idx;
289 int flag;
290 int rpcversion;
291 void *data; /* where to place the data from the read */
292 } rdc_readgen_t;
293
294 #ifdef _SYSCALL32
295 typedef struct rdc_readgen32 {
296 char sechost[MAX_RDC_HOST_SIZE];
297 char secfile[NSC_MAXPATH];
298 int len;
299 int pos;
300 int idx;
301 int flag;
302 int rpcversion;
303 caddr32_t data; /* where to place the data from the read */
304 } rdc_readgen32_t;
305 #endif
306 #endif
307
308
309
310
311
312 /*
313 * Config ioctl commands
314 */
315 #define RDC_CMD_ENABLE 1 /* New enable */
316 #define RDC_CMD_DISABLE 2 /* Complete disable */
317 #define RDC_CMD_RESUME 3 /* Local re-enable */
318 #define RDC_CMD_SUSPEND 4 /* Local clear */
319 #define RDC_CMD_LOG 5 /* Start logging mode */
320 #define RDC_CMD_COPY 6 /* Start synching */
321 #define RDC_CMD_RECONFIG 7 /* Change the rdc set */
322 #define RDC_CMD_TUNABLE 8 /* Change a tunable parameter */
323 #define RDC_CMD_WAIT 9 /* Wait for syncs to complete */
324 #define RDC_CMD_HEALTH 10 /* Return health state */
325 #define RDC_CMD_STATUS 11 /* Single set status */
326 #define RDC_CMD_RESET 12 /* reset error or failed status */
327 #define RDC_CMD_INITQ 14 /* initialise the disk queue */
328 #define RDC_CMD_FLUSHQ 15 /* flush queue for set */
329 #define RDC_CMD_ADDQ 16 /* add diskq to a set/group */
330 #define RDC_CMD_REMQ 17 /* nice remove a diskq from set/grp */
331 #define RDC_CMD_KILLQ 18 /* forced disgard of queue */
332 #define RDC_CMD_REPQ 19 /* replace queue */
333
334
335
336
337
338 /*
339 * Config ioctl options
340 */
341 #define RDC_OPT_SYNC 0x1 /* RDC_CMD_ENABLE, RDC_CMD_RESUME */
342 #define RDC_OPT_ASYNC 0x2 /* RDC_CMD_ENABLE, RDC_CMD_RESUME */
343 #define RDC_OPT_PRIMARY 0x4 /* All */
344 #define RDC_OPT_SECONDARY 0x8 /* All */
345 #define RDC_OPT_FORWARD 0x10 /* RDC_CMD_COPY */
346 #define RDC_OPT_REVERSE 0x20 /* RDC_CMD_COPY */
347 #define RDC_OPT_FULL 0x40 /* RDC_CMD_COPY */
348 #define RDC_OPT_UPDATE 0x80 /* RDC_CMD_COPY */
349 #define RDC_OPT_SETBMP 0x100 /* RDC_CMD_ENABLE */
350 #define RDC_OPT_CLRBMP 0x200 /* RDC_CMD_ENABLE */
351 #define RDC_OPT_REVERSE_ROLE 0x400 /* RDC_CMD_RECONFIG */
352 #define RDC_OPT_FORCE_QINIT 0x800 /* RDC_CMD_INITQ */
353 #define RDC_OPT_SET_QNOBLOCK 0x1000 /* RDC_CMD_TUNABLE */
354 #define RDC_OPT_CLR_QNOBLOCK 0x2000 /* RDC_CMD_TUNABLE */
355 #define RDC_OPT_FORCE_DISABLE 0x4000 /* RDC_CMD_DISABLE */
356
357 /*
358 * RDC flags
359 */
360
361 /*
362 * Passed out by the kernel (status)
363 */
364 #define RDC_ENABLED 0x2 /* RDC enabled */
365 #define RDC_PRIMARY 0x4 /* This node is the primary */
366 #define RDC_SLAVE 0x8 /* This node is target of the synch */
367 #define RDC_VOL_FAILED 0x10 /* Volume is failed */
368 #define RDC_BMP_FAILED 0x20 /* Bitmap is failed */
369 #define RDC_SYNC_NEEDED 0x40 /* Sync is needed */
370 #define RDC_RSYNC_NEEDED 0x80 /* Reverse sync is needed */
371 #define RDC_SYNCING 0x100 /* Synch in progress */
372 #define RDC_LOGGING 0x200 /* Logging */
373 #define RDC_FCAL_FAILED 0x400 /* Direct remote I/O failed */
374 #define RDC_ASYNC 0x800 /* Set is in async replicating mode */
375 #define RDC_FULL 0x1000 /* Full sync, not an update */
376 #define RDC_CLR_AFTERSYNC 0x2000 /* clr bitmap on secondary after sync */
377 #define RDC_DISKQ_FAILED 0x4000 /* Diskq I/O has failed */
378 #define RDC_QUEUING 0x8000 /* logging, but queueing to disk */
379 #ifndef RDC_QNOBLOCK
380 #define RDC_QNOBLOCK 0x10000
381 #endif
382 #define RDC_SYNC_START 0
383 #define RDC_SYNC_DONE 1
384 #define RDC_RSYNC_START 2
385
386 #ifdef _KERNEL
387
388 /*
389 * urdc->flags vs urdc->mflags usage:
390 *
391 * All flags are valid in urdc->flags, in which case the condition
392 * holds for the specific urdc.
393 *
394 * The flags in RDC_MFLAGS can also be in urdc->mflags, in which case
395 * the condition holds for a urdc somewhere on the many/multi chains
396 * connected to this urdc.
397 */
398
399 #define RDC_GROUP 0x7f8 /* Volume states that affect a group */
400
401 /*
402 * Mask of volume flags that are valid in urdc->mflags
403 */
404 #define RDC_MFLAGS (RDC_SLAVE | RDC_RSYNC_NEEDED)
405
406 #define IS_SLAVE(urdc) (rdc_get_mflags(urdc) & RDC_SLAVE)
407
408 /*
409 * Mask of volume flags that are maintained in sync_flags not flags,
410 * and protected by rdc_many_lock rather than the group lock.
411 * This allows code that is operating on one set to change the flags
412 * of another set.
413 */
414 #define RDC_SFLAGS (RDC_SYNC_NEEDED | RDC_RSYNC_NEEDED | \
415 RDC_VOL_FAILED | RDC_CLR_AFTERSYNC)
416
417 /*
418 * Mask of volume flags that are maintained in bmap_flags not flags,
419 * and protected by the bmapmutex rather than the group lock.
420 */
421 #define RDC_BFLAGS RDC_BMP_FAILED
422
423 #define RDC_VFLAGS (~(RDC_SFLAGS | RDC_BFLAGS))
424
425 #define RDC_SYNC_STATE_FLAGS (RDC_LOGGING | RDC_SYNCING | RDC_QUEUING | \
426 RDC_ASYNC)
427
428 #define IS_ASYNC(urdc) (rdc_get_vflags(urdc) & RDC_ASYNC)
429 #define IS_PRIMARY(urdc) (rdc_get_vflags(urdc) & RDC_PRIMARY)
430 #define IS_SECONDARY(urdc) (!IS_PRIMARY(urdc))
431 #define IS_STATE(urdc, state) (rdc_get_vflags(urdc) & (state))
432 #define IS_REPLICATING(urdc) (!(rdc_get_vflags(urdc) & RDC_LOGGING) && \
433 !(rdc_get_vflags(urdc) & RDC_SYNCING))
434
435 #endif /* _KERNEL */
436
437 typedef struct rdc_status {
438 int nset; /* Number of sets requested/enabled */
439 int maxsets; /* Max # of sets allowed today */
440 rdc_set_t rdc_set[1];
441 } rdc_status_t;
442
443 #ifdef _SYSCALL32
444 struct rdc_status32 {
445 int32_t nset; /* Number of sets requested/enabled */
446 int32_t maxsets; /* Max # of sets allowed today */
447 struct rdc_set32 rdc_set[1];
448 };
449 #endif /* _SYSCALL32 */
450
451 typedef struct rdc_svc_args {
452 int fd; /* Connection endpoint */
453 int nthr; /* Number of server threads */
454 char netid[128]; /* Identify transport */
455 struct netbuf addrmask; /* Address mask for host */
456 } rdc_svc_args_t;
457
458 #ifdef _SYSCALL32
459 struct rdc_svc_args32 {
460 int32_t fd;
461 int32_t nthr;
462 char netid[128];
463 struct netbuf32 addrmask;
464 };
465 #endif /* _SYSCALL32 */
466
467 typedef struct rdc_version {
468 int major; /* Major release number */
469 int minor; /* Minor release number */
470 int micro; /* Micro release number */
471 int baseline; /* Baseline revison number */
472 } rdc_version_t;
473 #ifdef _SYSCALL32
474 typedef struct rdc_version32 {
475 int32_t major; /* Major release number */
476 int32_t minor; /* Minor release number */
477 int32_t micro; /* Micro release number */
478 int32_t baseline; /* Baseline revison number */
479 } rdc_version32_t;
480 #endif
481
482
483 #if !defined(_KERNEL)
484
485 #define RDC_IOCTL(cmd, a0, a1, a2, a3, a4, ustatus) \
486 rdc_ioctl((long)(cmd), (long)(a0), (long)(a1), (long)(a2), \
487 (long)(a3), (long)(a4), (ustatus))
488
489 extern int rdc_ioctl(long, long, long, long, long, long, spcs_s_info_t);
490 extern int rdc_ioctl_simple(long, void *);
491
492 #endif /* ! _KERNEL */
493
494 #ifdef __cplusplus
495 }
496 #endif
497
498 #endif /* _RDC_IOCTL_H */