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 */