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 _META_H 27 #define _META_H 28 29 #include <limits.h> 30 #include <stdio.h> 31 #include <stdlib.h> 32 #include <fcntl.h> 33 #include <errno.h> 34 #include <string.h> 35 #include <unistd.h> 36 #include <libgen.h> 37 #include <locale.h> 38 #include <time.h> 39 #include <assert.h> 40 #include <stdarg.h> 41 #include <signal.h> 42 #include <devid.h> 43 #include <sys/types.h> 44 #include <sys/stat.h> 45 #include <sys/sysmacros.h> 46 #include <sys/mkdev.h> 47 #include <sys/time.h> 48 #include <sys/dkio.h> 49 #include <sys/vtoc.h> 50 #include <sys/efi_partition.h> 51 #include <meta_basic.h> 52 #include <mdiox.h> 53 #include <metamed.h> 54 #include <sys/lvm/mdio.h> 55 #include <sys/lvm/md_mddb.h> 56 #include <sys/lvm/md_sp.h> 57 #include <sys/lvm/mdmn_commd.h> 58 59 #ifdef __cplusplus 60 extern "C" { 61 #endif 62 63 /* debug malloc include */ 64 #ifdef DEBUG_MALLOC 65 #ifdef _REENTRANT 66 die right now 67 #endif 68 #include <../lib/malloclib/malloc.h> 69 #endif 70 71 /* 72 * useful macros 73 */ 74 #ifndef min 75 #define min(x, y) (((x) < (y)) ? (x) : (y)) 76 #endif 77 #ifndef max 78 #define max(x, y) (((x) > (y)) ? (x) : (y)) 79 #endif 80 #ifndef rounddown 81 #define rounddown(x, y) (((x) / (y)) * (y)) 82 #endif 83 84 /* 85 * external names 86 */ 87 88 #define METATAB "/etc/lvm/md.tab" 89 #define METACONF "/etc/lvm/md.cf" 90 #define METACONFTMP "/etc/lvm/md.cf.new" 91 #define META_DBCONF "/etc/lvm/mddb.cf" 92 #define META_DBCONFTMP "/etc/lvm/mddb.cf.new" 93 #define META_MNSET_NODELIST "/var/run/nodelist" 94 #define METALOG "/etc/lvm/md.log" 95 #define METALOCK "/etc/lvm/lock" 96 #define METADEVPATH "/etc/lvm/devpath" 97 #define METALOGENV "MD_LOG" 98 #define METAPKGROOT "/usr" 99 #define ADMSPECIAL "/dev/md/admin" 100 101 #define MDB_STR "metadevice state database" 102 #define META_LONGDISKNAME_STR "<long disk name>" 103 104 /* default database size (4MB) */ 105 #define MD_DBSIZE (8192) 106 107 /* default Multinode database size (16MB) */ 108 #define MD_MN_DBSIZE (32768) 109 110 /* disk label size */ 111 #define VTOC_SIZE (16) 112 113 /* EFI geometry data */ 114 #define MD_EFI_FG_HEADS 128 115 #define MD_EFI_FG_SECTORS 256 116 #define MD_EFI_FG_RPM 7200 117 #define MD_EFI_FG_WRI 1 118 #define MD_EFI_FG_RRI 1 119 120 /* maximum ctd name size (in # of digits) for printing out */ 121 #define CTD_FORMAT_LEN 6 122 123 /* Recommend timeout in seconds for RPC client creation. */ 124 #define MD_CLNT_CREATE_TOUT (60) 125 126 /* 127 * If event needs to be checked during wait of MD_CLNT_CREATE_TOUT, 128 * spin checking for event and then waiting for MD_CLNT_CREATE_SUBTIMEOUT 129 * seconds until MD_CLNT_CREATE_TOUT seconds are used. 130 */ 131 #define MD_CLNT_CREATE_SUBTIMEOUT (5) 132 133 /* 134 * metaclust verbosity levels and what they are for. Messages upto MC_LOG2 135 * will also be logged in syslog. 136 */ 137 #define MC_LOG0 0 /* special class. log messages regardless of */ 138 /* debug level */ 139 #define MC_LOG1 1 /* log standard error messages */ 140 #define MC_LOG2 2 /* log metaclust step level timing messages */ 141 #define MC_LOG3 3 /* log per set level timing messages */ 142 /* intended for use in loops walking mn sets */ 143 #define MC_LOG4 4 /* log per device level timing messages */ 144 /* intended for use in loops walking devices */ 145 #define MC_LOG5 5 /* typically for use in deep nested loops */ 146 /* or in libmeta routines */ 147 148 /* 149 * for meta_print* options 150 */ 151 typedef uint_t mdprtopts_t; 152 #define PRINT_SHORT 0x00000001 153 #define PRINT_SUBDEVS 0x00000002 154 #define PRINT_HEADER 0x00000004 155 #define PRINT_DEBUG 0x00000008 156 #define PRINT_TIMES 0x00000010 157 #define PRINT_SETSTAT 0x00000020 158 #define PRINT_SETSTAT_ONLY 0x00000040 159 #define PRINT_FAST 0x00000080 160 #define PRINT_DEVID 0x00000100 161 #define PRINT_LARGEDEVICES 0x00000200 162 #define PRINT_FN 0x00000400 163 164 /* 165 * for meta_devadm options 166 */ 167 typedef uint_t mddevopts_t; 168 #define DEV_VERBOSE 0x00000001 169 #define DEV_NOACTION 0x00000002 170 #define DEV_LOG 0x00000004 171 #define DEV_RELOAD 0x00000008 172 #define DEV_UPDATE 0x00000010 173 #define DEV_LOCAL_SET 0x00000020 /* update only MD_LOCAL_SET */ 174 175 /* 176 * return values for meta_devadm operations 177 */ 178 #define METADEVADM_SUCCESS 0 179 #define METADEVADM_ERR 1 180 #define METADEVADM_DEVIDINVALID 2 181 #define METADEVADM_DSKNAME_ERR 3 182 #define METADEVADM_DISKMOVE 4 183 184 /* 185 * return values for the splitname function 186 */ 187 #define METASPLIT_SUCCESS 0 188 #define METASPLIT_LONGPREFIX 1 189 #define METASPLIT_LONGDISKNAME 2 190 191 /* 192 * meta_check* options 193 */ 194 typedef uint_t mdchkopts_t; 195 #define MDCHK_ALLOW_MDDB 0x01 /* allows repliica in md's (metainit) */ 196 #define MDCHK_ALLOW_HS 0x02 /* allows hs in multiple hsp's (hs) */ 197 #define MDCHK_ALLOW_LOG 0x04 /* allows sharing of logs (trans) */ 198 #define MDCHK_ALLOW_REPSLICE 0x08 /* allow replica slice to be used */ 199 #define MDCHK_ALLOW_NODBS 0x10 /* no db replicas allowed (metadb) */ 200 #define MDCHK_DRVINSET 0x20 /* drive is in set (metaset) */ 201 #define MDCHK_SET_LOCKED 0x40 /* The set is locked */ 202 #define MDCHK_SET_FORCE 0x80 /* This is a forced operation */ 203 204 /* 205 * meta_check_inuse options 206 */ 207 typedef uint_t mdinuseopts_t; 208 #define MDCHK_SWAP 0x01 /* check swap & overlap w/swap */ 209 #define MDCHK_DUMP 0x02 /* check dump & overlap w/dump */ 210 #define MDCHK_MOUNTED 0x04 /* check mounted & overlap w/mounted */ 211 #define MDCHK_INUSE 0xff /* check all */ 212 213 /* 214 * meta* force options 215 */ 216 typedef uint_t mdforceopts_t; 217 #define MDFORCE_NONE 0x01 /* no extra force used */ 218 #define MDFORCE_LOCAL 0x02 /* force from metadb command line */ 219 #define MDFORCE_DS 0x04 /* force from metaset library */ 220 #define MDFORCE_SET_LOCKED 0x10 /* The set is locked */ 221 222 223 /* 224 * meta* options 225 */ 226 typedef uint_t mdcmdopts_t; 227 #define MDCMD_DOIT 0x0001 /* really do operation */ 228 #define MDCMD_FORCE 0x0002 /* force operation */ 229 #define MDCMD_PRINT 0x0004 /* print success messages to stdout */ 230 #define MDCMD_RECURSE 0x0008 /* recursive operation */ 231 #define MDCMD_INIT 0x0010 /* init operation */ 232 #define MDCMD_UPDATE 0x0020 /* update sizes used w/o DOIT mostly */ 233 #define MDCMD_NOLOCK 0x0040 /* lock already held, DONT acquire */ 234 #define MDCMD_VERBOSE 0x0100 /* be verbose */ 235 #define MDCMD_USE_WHOLE_DISK 0x0200 /* repartition disk */ 236 #define MDCMD_DIRECT 0x0400 /* extents specified directly */ 237 #define MDCMD_ALLOPTION 0x0800 /* the all option is being used */ 238 #define MDCMD_MN_OPEN_CHECK 0x1000 /* Perform open check on all nodes */ 239 240 /* 241 * meta_tab* definitions 242 */ 243 #define TAB_ARG_ALLOC 5 244 #define TAB_LINE_ALLOC 10 245 246 typedef uint_t mdinittypes_t; 247 #define TAB_UNKNOWN 0x0000 248 #define TAB_MDDB 0x0001 249 #define TAB_HSP 0x0002 250 #define TAB_STRIPE 0x0004 251 #define TAB_MIRROR 0x0008 252 #define TAB_RAID 0x0010 253 #define TAB_TRANS 0x0020 254 #define TAB_SP 0x0040 255 #define TAB_MD (TAB_STRIPE | TAB_MIRROR | TAB_RAID |\ 256 TAB_TRANS | TAB_SP) 257 #define TAB_MD_HSP (TAB_MD | TAB_HSP) 258 259 typedef struct { 260 mdinittypes_t type; 261 char *context; 262 char *cname; 263 int argc; 264 char **argv; 265 size_t alloc; 266 uint_t flags; /* for application use */ 267 } md_tab_line_t; 268 269 typedef struct { 270 char *filename; 271 char *data; 272 size_t total; 273 size_t nlines; 274 md_tab_line_t *lines; 275 size_t alloc; 276 } md_tab_t; 277 278 /* 279 * disk status definitions 280 */ 281 typedef struct md_disk_status_list { 282 struct md_disk_status_list *next; 283 mddrivename_t *drivenamep; 284 md_error_t status; 285 } md_disk_status_list_t; 286 287 /* 288 * module name list used by meta_patch_root & meta_systemfile 289 */ 290 struct modname { 291 char *name; 292 struct modname *next; 293 }; 294 295 /* 296 * list to be used for printing Device Relocation Information 297 */ 298 typedef struct mddevid_t { 299 struct mddevid_t *next; 300 char *ctdname; 301 mdkey_t key; 302 } mddevid_t; 303 304 /* 305 * Multi-Node Diskset List 306 * 307 * we either store the IP address of the private interconnect or its name 308 * in the msl_node_addr member 309 */ 310 typedef struct mndiskset_membershiplist { 311 uint_t msl_node_id; 312 md_mnnode_nm_t msl_node_name; 313 md_mnnode_nm_t msl_node_addr; 314 struct mndiskset_membershiplist *next; 315 } mndiskset_membershiplist_t; 316 317 /* 318 * client pool for rpc calls to mdcommd 319 */ 320 typedef struct md_mn_client_list { 321 CLIENT *mcl_clnt; 322 struct md_mn_client_list *mcl_next; 323 } md_mn_client_list_t; 324 325 /* 326 * Resync thread manipulation commands. 327 * 328 * The resync thread can now be started, blocked, unblocked or killed. 329 * This typedef specifies the action to be taken by meta_resync.c 330 * routines. 331 */ 332 typedef enum { 333 MD_RESYNC_START = 1, 334 MD_RESYNC_BLOCK, 335 MD_RESYNC_UNBLOCK, 336 MD_RESYNC_KILL, 337 MD_RESYNC_KILL_NO_WAIT, 338 MD_RESYNC_FORCE_MNSTART 339 } md_resync_cmd_t; 340 341 342 /* 343 * rpc.metad macro definitions. 344 */ 345 #define METAD_SETUP_DR(cmd, id) \ 346 { \ 347 req.ur_cmd = cmd; \ 348 req.ur_setno = MD_LOCAL_SET; \ 349 req.ur_type = MDDB_USER; \ 350 req.ur_type2 = MDDB_UR_DR; \ 351 req.ur_recid = id; \ 352 } 353 354 #define METAD_SETUP_NR(cmd, id) \ 355 { \ 356 req.ur_cmd = cmd; \ 357 req.ur_setno = MD_LOCAL_SET; \ 358 req.ur_type = MDDB_USER; \ 359 req.ur_type2 = MDDB_UR_NR; \ 360 req.ur_recid = id; \ 361 } 362 363 #define METAD_SETUP_SR(cmd, id) \ 364 { \ 365 req.ur_cmd = cmd; \ 366 req.ur_setno = MD_LOCAL_SET; \ 367 req.ur_type = MDDB_USER; \ 368 req.ur_type2 = MDDB_UR_SR; \ 369 req.ur_recid = id; \ 370 } 371 372 #define METAD_SETUP_UR(cmd, type2, id) \ 373 { \ 374 req.ur_cmd = cmd; \ 375 req.ur_setno = MD_LOCAL_SET; \ 376 req.ur_type = MDDB_USER; \ 377 req.ur_type2 = type2; \ 378 req.ur_recid = id; \ 379 } 380 381 #define METAD_SETUP_LR(cmd, setno, id) \ 382 { \ 383 req.ur_cmd = cmd; \ 384 req.ur_setno = setno; \ 385 req.ur_type = MDDB_USER; \ 386 req.ur_type2 = MDDB_UR_LR; \ 387 req.ur_recid = id; \ 388 } 389 390 /* 391 * This typedef specifies the signature of a function that 392 * meta_client_create_retry can use to establish an rpc connection. 393 * private is used to pass data from the caller of meta_client_create_retry 394 * to clnt_create_func. 395 */ 396 typedef CLIENT *(*clnt_create_func_t)(char *hostname, 397 void *private, 398 struct timeval *time_out); 399 400 /* definition of the table for the different message types */ 401 typedef struct md_mn_msg_tbl_entry { 402 md_mn_msgclass_t mte_class; 403 void (*mte_handler) 404 (md_mn_msg_t *msg, uint_t flags, md_mn_result_t *res); 405 int (*mte_smgen) 406 (md_mn_msg_t *msg, md_mn_msg_t **msglist); 407 time_t mte_timeout; /* seconds before msg times out */ 408 uint_t mte_retry1; /* nretries in case of class busy */ 409 uint_t mte_ticks1; /* sleep nticks before retry */ 410 uint_t mte_retry2; /* nretries in case of comm fail */ 411 uint_t mte_ticks2; /* sleep nticks before retry */ 412 } md_mn_msg_tbl_entry_t; 413 414 /* 415 * Flags for the take command 416 */ 417 #define TAKE_FORCE 0x0001 418 #define TAKE_USETAG 0x0002 419 #define TAKE_USEIT 0x0004 420 #define TAKE_IMP 0x0008 421 #define TAKE_RETAKE 0x0010 422 423 /* 424 * ignore gettext for lint so we check printf args 425 */ 426 #ifdef __lint 427 #define dgettext(d, s) s 428 #define gettext(s) s 429 #endif 430 431 /* 432 * Defines for enabling/disabling SVM services in SMF. 433 */ 434 #define META_SMF_CORE 0x01 435 #define META_SMF_DISKSET 0x02 436 #define META_SMF_MN_DISKSET 0x04 437 #define META_SMF_ALL 0xFF 438 439 /* 440 * Defines to send/not_send addition of mddb sidenames to 441 * rpc.mdcommd for MN disksets. 442 */ 443 #define DB_ADDSIDENMS_NO_BCAST 0 444 #define DB_ADDSIDENMS_BCAST 1 445 446 /* 447 * Defines and structures to support rpc.mdcommd. 448 * RPC routines in rpc.metad will be used to suspend, resume 449 * and reinitialize the rpc.mdcommd running on that node. 450 * These actions are needed when the nodelist is changing. 451 */ 452 #define COMMDCTL_SUSPEND 1 453 #define COMMDCTL_RESUME 2 454 #define COMMDCTL_REINIT 3 455 456 /* 457 * Defines used when joining a node to a MN diskset. 458 * A MN diskset is stale if < 50% mddbs are available when the first node 459 * joins the set. A MN diskset is stale when 50% mddbs are available when 460 * the first node joins the set if the mediator is unable to provide an 461 * extra vote. 462 * Once a MN set is marked stale, it stays in the stale state (even if > 50% 463 * mddbs are available) until all nodes are withdrawn from the diskset. 464 * Any new nodes joining a stale MN diskset are marked stale regardless of 465 * the availability of mddbs in order to keep the diskset consistent across 466 * all nodes. 467 * 468 * If a reconfig cycle is underway, set the reconfig flag so that rpc.metad 469 * clnt_locks are not enforced. Since the reconfig cycle has locked out the 470 * meta* commands, this is safe to do. 471 */ 472 #define MNSET_IS_STALE 1 /* Is MN set stale? */ 473 #define MNSET_IN_RECONFIG 2 /* Is MN set in reconfig? */ 474 475 /* 476 * Structure used during reconfig step2 to aid in sychronization 477 * of the drives in a diskset. 478 */ 479 typedef struct md_mnsr_node { 480 md_mnset_record *mmn_mnsr; 481 md_mnnode_nm_t mmn_nodename; 482 int mmn_numdrives; 483 md_drive_desc *mmn_dd; 484 struct md_mnsr_node *mmn_next; 485 } md_mnsr_node_t; 486 487 488 /* 489 * meta events definitions ("meta_notify.h") 490 */ 491 492 /* 493 * event flags 494 * meta_notify_createq(), (EXISTERR, PERMANENT) 495 * meta_notify_getev(), (WAIT) 496 * meta_notify_getevlist() (WAIT) 497 */ 498 #define EVFLG_WAIT 0x00000001 /* block until events are pending */ 499 #define EVFLG_EXISTERR 0x00000002 /* if q exists, return an error */ 500 #define EVFLG_PERMANENT 0x00000004 /* queue persists after process exit */ 501 502 /* 503 * events are always associated with an underlying object 504 * This object is of one of the following types. 505 */ 506 typedef enum md_ev_objtype_t { 507 EVO_EMPTY = 0, 508 EVO_METADEV, 509 EVO_MIRROR, 510 EVO_STRIPE, 511 EVO_RAID5, 512 EVO_TRANS, 513 EVO_REPLICA, 514 EVO_HSP, 515 EVO_HS, 516 EVO_SET, 517 EVO_DRIVE, 518 EVO_HOST, 519 EVO_MEDIATOR, 520 EVO_UNSPECIFIED, 521 EVO_LAST 522 } ev_obj_t; 523 524 /* 525 * Specific events are sent upon state changes 526 * in the underlying devices or when sent by 527 * user applications. These events have a unique 528 * type. These types map to kernel event types (sys/md_notify.h) 529 * 530 * When updating these UPDATE THE TABLE in lib/config/config.c 531 */ 532 typedef enum md_ev_id_t { 533 EV_UNK = 0, 534 EV_EMPTY, 535 EV_CREATE, 536 EV_DELETE, 537 EV_ADD, 538 EV_REMOVE, 539 EV_REPLACE, 540 EV_GROW, 541 EV_RENAME_SRC, 542 EV_RENAME_DST, 543 EV_MEDIATOR_ADD, 544 EV_MEDIATOR_DELETE, 545 EV_HOST_ADD, 546 EV_HOST_DELETE, 547 EV_DRIVE_ADD, 548 EV_DRIVE_DELETE, 549 EV_INIT_START, 550 EV_INIT_FAILED, 551 EV_INIT_FATAL, 552 EV_INIT_SUCCESS, 553 EV_IOERR, 554 EV_ERRED, 555 EV_LASTERRED, 556 EV_OK, 557 EV_ENABLE, 558 EV_RESYNC_START, 559 EV_RESYNC_FAILED, 560 EV_RESYNC_SUCCESS, 561 EV_RESYNC_DONE, 562 EV_HOTSPARED, 563 EV_HS_FREED, 564 EV_HS_CHANGED, 565 EV_TAKEOVER, 566 EV_RELEASE, 567 EV_OPEN_FAIL, 568 EV_OFFLINE, 569 EV_ONLINE, 570 EV_GROW_PENDING, 571 EV_DETACH, 572 EV_DETACHING, 573 EV_ATTACH, 574 EV_ATTACHING, 575 EV_CHANGE, 576 EV_EXCHANGE, 577 EV_REGEN_START, 578 EV_REGEN_DONE, 579 EV_REGEN_FAILED, 580 EV_USER, 581 EV_NOTIFY_LOST, 582 EV_LAST 583 } evid_t; 584 585 #define EV_ALLOBJS (~0ULL) 586 #define EV_ALLSETS ((set_t)(~0)) 587 588 #if !defined(_KERNEL) 589 590 #define NOTIFY_MD(tag, set, dev, ev) \ 591 (void) meta_notify_sendev((tag), (set), (dev), (ev)) 592 593 #define SE_NOTIFY(se_class, se_subclass, tag, set, dev) \ 594 meta_svm_sysevent((se_class), (se_subclass), (tag), (set), (dev)) 595 596 #endif /* _KERNEL */ 597 598 typedef struct md_ev { 599 ev_obj_t obj_type; 600 set_t setno; 601 evid_t ev; 602 u_longlong_t obj; /* usually md_dev64_t or hsp id */ 603 u_longlong_t uev; /* for (EV_USER) user-defined events */ 604 } md_ev_t; 605 606 typedef struct md_evlist { 607 struct md_evlist *next; 608 md_ev_t *evp; 609 } md_evlist_t; 610 611 /* end of meta event definitions ("meta_notify.h") */ 612 613 typedef struct md_im_names { 614 int min_count; 615 char **min_names; 616 } md_im_names_t; 617 618 /* Values for replica info status */ 619 #define MD_IM_REPLICA_SCANNED (0x01) 620 #define MD_IM_REPLICA_VALID (0x02) 621 622 typedef struct md_im_replica_info { 623 struct md_im_replica_info *mir_next; 624 int mir_status; 625 int mir_flags; 626 daddr32_t mir_offset; 627 daddr32_t mir_length; 628 md_timeval32_t mir_timestamp; 629 } md_im_replica_info_t; 630 631 typedef struct md_im_drive_info { 632 struct md_im_drive_info *mid_next; /* next drive in this set */ 633 mddrivename_t *mid_dnp; 634 void *mid_devid; 635 void *mid_o_devid; 636 int mid_devid_sz; 637 int mid_o_devid_sz; 638 char mid_minor_name[MDDB_MINOR_NAME_MAX]; 639 minor_t mid_mnum; 640 int mid_available; 641 md_timeval32_t mid_setcreatetimestamp; 642 char *mid_driver_name; 643 char *mid_devname; 644 md_im_replica_info_t *mid_replicas; 645 int overlapped_disk; 646 struct md_im_drive_info *overlap; /* chain of overlap disks */ 647 } md_im_drive_info_t; 648 649 /* Values for mid_available */ 650 #define MD_IM_DISK_AVAILABLE 0x00 651 #define MD_IM_DISK_NOT_AVAILABLE 0x01 652 653 /* Values for set descriptor flags */ 654 #define MD_IM_SET_INVALID 0x10 655 #define MD_IM_SET_REPLICATED 0x20 656 657 /* Values for mis_partial */ 658 #define MD_IM_COMPLETE_DISKSET 0x04 659 #define MD_IM_PARTIAL_DISKSET 0x08 660 661 typedef struct md_im_set_desc { 662 struct md_im_set_desc *mis_next; 663 int mis_flags; 664 int mis_oldsetno; 665 md_im_drive_info_t *mis_drives; 666 int mis_active_replicas; 667 int mis_partial; 668 } md_im_set_desc_t; 669 670 /* meta_admin.c */ 671 extern int open_admin(md_error_t *ep); 672 extern int close_admin(md_error_t *ep); 673 extern int meta_dev_ismeta(md_dev64_t dev); 674 extern int meta_get_nunits(md_error_t *ep); 675 extern md_dev64_t metamakedev(minor_t mnum); 676 677 /* meta_attach.c */ 678 extern int meta_concat_generic(mdsetname_t *sp, mdname_t *namep, 679 u_longlong_t big_or_little, md_error_t *ep); 680 extern int meta_concat_parent(mdsetname_t *sp, mdname_t *childnp, 681 md_error_t *ep); 682 683 /* meta_check.c */ 684 extern int meta_check_inuse(mdsetname_t *sp, mdname_t *np, 685 mdinuseopts_t inuse_flag, md_error_t *ep); 686 extern int meta_check_driveinset(mdsetname_t *sp, 687 mddrivename_t *dnp, md_error_t *ep); 688 extern int meta_check_drivemounted(mdsetname_t *sp, 689 mddrivename_t *dnp, md_error_t *ep); 690 extern int meta_check_driveswapped(mdsetname_t *sp, 691 mddrivename_t *dnp, md_error_t *ep); 692 extern int meta_check_samedrive(mdname_t *np1, mdname_t *np2, 693 md_error_t *ep); 694 extern int meta_check_overlap(char *uname, mdname_t *np1, 695 diskaddr_t slblk1, diskaddr_t nblks1, mdname_t *np2, 696 diskaddr_t slblk2, diskaddr_t nblks2, 697 md_error_t *ep); 698 extern int meta_check_inmeta(mdsetname_t *sp, mdname_t *np, 699 mdchkopts_t options, diskaddr_t slblk, 700 diskaddr_t nblks, 701 md_error_t *ep); 702 extern int meta_check_inset(mdsetname_t *sp, mdname_t *np, 703 md_error_t *ep); 704 extern int meta_check_root(md_error_t *ep); 705 706 707 /* meta_db.c */ 708 extern char *meta_devid_encode_str(ddi_devid_t devid, 709 char *minor_name); 710 extern void meta_devid_encode_str_free(char *devidstr); 711 extern int meta_devid_decode_str(char *devidstr, 712 ddi_devid_t *devidp, char **minor_namep); 713 extern int meta_check_inreplica(mdsetname_t *sp, mdname_t *np, 714 diskaddr_t slblk, diskaddr_t nblks, md_error_t *ep); 715 extern int meta_check_replica(mdsetname_t *sp, mdname_t *np, 716 mdchkopts_t options, diskaddr_t slblk, 717 diskaddr_t nblks, md_error_t *ep); 718 extern int meta_db_addsidenms(mdsetname_t *sp, mdname_t *np, 719 daddr_t blkno, int bcast, md_error_t *ep); 720 extern int meta_db_delsidenm(mdsetname_t *sp, side_t sideno, 721 mdname_t *np, daddr_t blkno, md_error_t *ep); 722 extern int meta_db_patch(char *sname, char *cname, int patch, 723 md_error_t *ep); 724 extern int meta_db_attach(mdsetname_t *sp, mdnamelist_t *db_nlp, 725 mdchkopts_t options, md_timeval32_t *timeval, 726 int dbcnt, int dbsize, char *sysfilename, 727 md_error_t *ep); 728 extern int meta_db_detach(mdsetname_t *sp, mdnamelist_t *db_nlp, 729 mdforceopts_t force, char *sysfilename, 730 md_error_t *ep); 731 extern void metafreereplicalist(md_replicalist_t *rlp); 732 extern int metareplicalist(mdsetname_t *sp, int flags, 733 md_replicalist_t **rlpp, md_error_t *ep); 734 extern void meta_sync_db_locations(mdsetname_t *sp, 735 md_error_t *ep); 736 extern int meta_setup_db_locations(md_error_t *ep); 737 extern daddr_t meta_db_minreplica(mdsetname_t *sp, md_error_t *ep); 738 extern int meta_get_replica_names(mdsetname_t *, 739 mdnamelist_t **, int options, md_error_t *); 740 extern void meta_mkdummymaster(mdsetname_t *sp, int fd, 741 daddr_t firstblk); 742 extern md_timeval32_t meta_get_lb_inittime(mdsetname_t *sp, md_error_t *ep); 743 744 /* meta_db_balance.c */ 745 extern int meta_db_balance(mdsetname_t *sp, md_drive_desc *opdd, 746 md_drive_desc *curdd, daddr_t dbsize, 747 md_error_t *ep); 748 749 /* metadevstamp.c */ 750 extern int getdevstamp(mddrivename_t *dnp, time_t *stamp, 751 md_error_t *ep); 752 extern int setdevstamp(mddrivename_t *dnp, time_t *stamp, 753 md_error_t *ep); 754 755 /* meta_error.c */ 756 extern int metaioctl(int cmd, void *data, md_error_t *ep, 757 char *name); 758 extern void md_logpfx(FILE *fp); 759 /* PRINTFLIKE2 */ 760 extern char *mde_sperror(md_error_t *mdep, const char *fmt, ...); 761 /* PRINTFLIKE2 */ 762 extern void mde_perror(md_error_t *mdep, const char *fmt, ...); 763 /* PRINTFLIKE1 */ 764 extern void md_perror(const char *fmt, ...); 765 /* PRINTFLIKE1 */ 766 extern void md_eprintf(const char *fmt, ...); 767 extern void meta_mc_log(int level, const char *fmt, ...); 768 769 /* meta_getdevs.c */ 770 extern minor_t meta_getminor(md_dev64_t dev64); 771 extern major_t meta_getmajor(md_dev64_t dev64); 772 extern md_dev64_t meta_expldev(md_dev64_t dev); 773 extern dev32_t meta_cmpldev(md_dev64_t dev64); 774 775 extern int meta_fix_compnames(mdsetname_t *sp, 776 mdname_t *namep, md_dev64_t dev, md_error_t *ep); 777 extern int meta_getdevs(mdsetname_t *sp, mdname_t *namep, 778 mdnamelist_t **nlpp, md_error_t *ep); 779 extern int meta_getalldevs(mdsetname_t *sp, mdnamelist_t **nlpp, 780 int check_db, md_error_t *ep); 781 extern int meta_getvtoc(int fd, char *devname, 782 struct vtoc *vtocbufp, int *partno, 783 md_error_t *ep); 784 extern int meta_setvtoc(int fd, char *devname, 785 struct vtoc *vtocbufp, md_error_t *ep); 786 extern int meta_setmdvtoc(int fd, char *devname, 787 mdvtoc_t *mdvtocbufp, md_error_t *ep); 788 extern int meta_get_names(char *drivername, mdsetname_t *sp, 789 mdnamelist_t **nlpp, mdprtopts_t options, 790 md_error_t *ep); 791 extern int meta_deviceid_to_nmlist(char *search_path, 792 ddi_devid_t devid, char *minor_name, 793 devid_nmlist_t **retlist); 794 795 /* meta_hotspares.c */ 796 extern int meta_get_hsp_names(mdsetname_t *sp, 797 mdhspnamelist_t **hspnlpp, int options, 798 md_error_t *ep); 799 extern void meta_free_hsp(md_hsp_t *hspp); 800 extern void meta_invalidate_hsp(mdhspname_t *hspnp); 801 extern md_hsp_t *meta_get_hsp(mdsetname_t *sp, mdhspname_t *hspnp, 802 md_error_t *ep); 803 extern md_hsp_t *meta_get_hsp_common(mdsetname_t *sp, 804 mdhspname_t *hspnp, int fast, md_error_t *ep); 805 extern int meta_check_inhsp(mdsetname_t *sp, mdname_t *np, 806 diskaddr_t slblk, diskaddr_t nblks, md_error_t *ep); 807 extern int meta_check_hotspare(mdsetname_t *sp, mdname_t *np, 808 md_error_t *ep); 809 extern char *hs_state_to_name(md_hs_t *hsp, 810 md_timeval32_t *tvp); 811 extern int meta_hsp_print(mdsetname_t *sp, mdhspname_t *hspnp, 812 mdnamelist_t **nlpp, char *fname, FILE *fp, 813 mdprtopts_t options, md_error_t *ep); 814 extern int metachkhsp(mdsetname_t *sp, mdhspname_t *hspnp, 815 md_error_t *ep); 816 extern int meta_hs_add(mdsetname_t *sp, mdhspname_t *hspnp, 817 mdnamelist_t *nlp, mdcmdopts_t options, 818 md_error_t *ep); 819 extern int meta_hs_delete(mdsetname_t *sp, mdhspname_t *hspnp, 820 mdnamelist_t *nlp, mdcmdopts_t options, 821 md_error_t *ep); 822 extern int meta_hs_replace(mdsetname_t *sp, mdhspname_t *hspnp, 823 mdname_t *oldnp, mdname_t *newnp, 824 mdcmdopts_t options, md_error_t *ep); 825 extern int meta_hs_enable(mdsetname_t *sp, mdnamelist_t *nlp, 826 mdcmdopts_t options, md_error_t *ep); 827 extern int meta_check_hsp(mdsetname_t *sp, md_hsp_t *hspp, 828 mdcmdopts_t options, md_error_t *ep); 829 extern int meta_create_hsp(mdsetname_t *sp, md_hsp_t *hspp, 830 mdcmdopts_t options, md_error_t *ep); 831 extern int meta_init_hsp(mdsetname_t **spp, 832 int argc, char *argv[], mdcmdopts_t options, 833 md_error_t *ep); 834 extern int meta_hsp_reset(mdsetname_t *sp, mdhspname_t *hspnp, 835 mdcmdopts_t options, md_error_t *ep); 836 837 /* meta_init.c */ 838 extern int parse_interlace(char *uname, char *name, 839 diskaddr_t *interlacep, md_error_t *ep); 840 extern int meta_cook_syntax(md_error_t *ep, 841 md_void_errno_t errcode, char *uname, 842 int argc, char *argv[]); 843 extern int meta_setup_geom(md_unit_t *md, mdname_t *np, 844 mdgeom_t *geomp, uint_t write_reinstruct, 845 uint_t read_reinstruct, uint_t round_cyl, 846 md_error_t *ep); 847 extern int meta_adjust_geom(md_unit_t *md, mdname_t *np, 848 uint_t write_reinstruct, uint_t read_reinstruct, 849 uint_t round_cyl, md_error_t *ep); 850 extern int meta_init_name(mdsetname_t **spp, int argc, 851 char *argv[], char *cname, mdcmdopts_t options, 852 md_error_t *ep); 853 extern int meta_check_devicesize(diskaddr_t total_blocks); 854 extern int meta_init_make_device(mdsetname_t **spp, char *uname, 855 md_error_t *ep); 856 extern mdinittypes_t meta_get_init_type(int argc, char *argv[]); 857 858 /* meta_mdcf.c */ 859 extern int meta_update_md_cf(mdsetname_t *sp, md_error_t *ep); 860 861 /* meta_med.c */ 862 extern int meddstealerror(md_error_t *ep, med_err_t *medep); 863 extern int clnt_med_null(char *hostname, md_error_t *ep); 864 extern int clnt_med_upd_data(md_h_t *mdhp, mdsetname_t *sp, 865 med_data_t *meddp, md_error_t *ep); 866 extern int clnt_med_get_data(md_h_t *mdhp, mdsetname_t *sp, 867 med_data_t *meddp, md_error_t *ep); 868 extern int clnt_med_get_rec(md_h_t *mdhp, mdsetname_t *sp, 869 med_rec_t *medrp, md_error_t *ep); 870 extern int clnt_med_upd_rec(md_h_t *mdhp, mdsetname_t *sp, 871 med_rec_t *medrp, md_error_t *ep); 872 extern int clnt_med_hostname(char *hostname, char **ret_hostname, 873 md_error_t *ep); 874 extern int clnt_user_med_upd_data(md_h_t *mdhp, bool_t obandiskset, 875 char *setname, uint_t setnum, med_data_t *meddp, 876 md_error_t *ep); 877 extern int clnt_user_med_get_data(md_h_t *mdhp, bool_t obandiskset, 878 char *setname, uint_t setnum, med_data_t *meddp, 879 md_error_t *ep); 880 881 extern int meta_med_hnm2ip(md_hi_arr_t *mp, md_error_t *ep); 882 extern int meta_h2hi(md_h_arr_t *mdhp, md_hi_arr_t *mdhip, 883 md_error_t *ep); 884 extern int meta_hi2h(md_hi_arr_t *mdhip, md_h_arr_t *mdhp, 885 md_error_t *ep); 886 extern int setup_med_cfg(mdsetname_t *sp, mddb_config_t *cp, 887 int force, md_error_t *ep); 888 extern int meta_mediator_info_from_file(char *sname, int verbose, 889 md_error_t *ep); 890 891 /* meta_mem.c */ 892 #ifdef _DEBUG_MALLOC_INC 893 extern void *_Malloc(char *file, int line, size_t s); 894 extern void *_Zalloc(char *file, int line, size_t s); 895 extern void *_Realloc(char *file, int line, void *p, size_t s); 896 extern void *_Calloc(char *file, int line, size_t n, size_t s); 897 extern char *_Strdup(char *file, int line, char *p); 898 extern void _Free(char *file, int line, void *p); 899 #define Malloc(s) _Malloc(__FILE__, __LINE__, (s)) 900 #define Zalloc(s) _Zalloc(__FILE__, __LINE__, (s)) 901 #define Realloc(p, s) _Realloc(__FILE__, __LINE__, (p), (s)) 902 #define Calloc(n, s) _Calloc(__FILE__, __LINE__, (n), (s)) 903 #define Strdup(p) _Strdup(__FILE__, __LINE__, (p)) 904 #define Free(p) _Free(__FILE__, __LINE__, (p)) 905 #else /* ! _DEBUG_MALLOC_INC */ 906 extern void *Malloc(size_t s); 907 extern void *Zalloc(size_t s); 908 extern void *Realloc(void *p, size_t s); 909 extern void *Calloc(size_t n, size_t s); 910 extern char *Strdup(char *p); 911 extern void Free(void *p); 912 #endif /* ! _DEBUG_MALLOC_INC */ 913 914 /* meta_metad.c */ 915 extern int clnt_adddrvs(char *hostname, mdsetname_t *sp, 916 md_drive_desc *dd, md_timeval32_t timestamp, 917 ulong_t genid, md_error_t *ep); 918 extern int clnt_addhosts(char *hostname, mdsetname_t *sp, 919 int node_c, char **node_v, md_error_t *ep); 920 extern int clnt_update_namespace(char *hostname, mdsetname_t *sp, 921 side_t side, mddrivename_t *dnp, char *newname, 922 md_error_t *ep); 923 extern int clnt_add_drv_sidenms(char *hostname, char *this_host, 924 mdsetname_t *sp, md_set_desc *sd, int node_c, 925 char **node_v, md_error_t *ep); 926 extern int clnt_createset(char *hostname, mdsetname_t *sp, 927 md_node_nm_arr_t nodes, md_timeval32_t timestamp, 928 ulong_t genid, md_error_t *ep); 929 extern int clnt_mncreateset(char *hostname, mdsetname_t *sp, 930 md_mnnode_desc *nodelist, md_timeval32_t timestamp, 931 ulong_t genid, md_node_nm_t master_nodenm, 932 int master_nodeid, md_error_t *ep); 933 extern int clnt_joinset(char *hostname, mdsetname_t *sp, 934 int flags, md_error_t *ep); 935 extern int clnt_withdrawset(char *hostname, mdsetname_t *sp, 936 md_error_t *ep); 937 extern int clnt_deldrvs_by_devid(char *hostname, mdsetname_t *sp, 938 md_drive_desc *dd, md_error_t *ep); 939 extern int clnt_deldrvs(char *hostname, mdsetname_t *sp, 940 md_drive_desc *dd, md_error_t *ep); 941 extern int clnt_delhosts(char *hostname, mdsetname_t *sp, 942 int node_c, char **node_v, md_error_t *ep); 943 extern int clnt_delset(char *hostname, mdsetname_t *sp, 944 md_error_t *ep); 945 extern int clnt_del_drv_sidenms(char *hostname, mdsetname_t *sp, 946 md_error_t *ep); 947 extern int clnt_devinfo(char *hostname, mdsetname_t *sp, 948 mddrivename_t *dp, md_dev64_t *ret_dev, 949 time_t *ret_timestamp, md_error_t *ep); 950 extern int clnt_devid(char *hostname, mdsetname_t *sp, 951 mddrivename_t *dp, char **ret_encdevid, 952 md_error_t *ep); 953 extern int clnt_devinfo_by_devid(char *hostname, mdsetname_t *sp, 954 char *devidstr, md_dev64_t *retdev, 955 char *orig_devname, char **ret_devname, 956 char **ret_driver, md_error_t *ep); 957 extern int clnt_drvused(char *hostname, mdsetname_t *sp, 958 mddrivename_t *dp, md_error_t *ep); 959 extern void free_sr(md_set_record *sr); 960 extern int clnt_getset(char *hostname, char *setname, set_t setno, 961 md_set_record **sr, md_error_t *ep); 962 extern int clnt_mngetset(char *hostname, char *setname, 963 set_t setno, md_mnset_record **mnsr, 964 md_error_t *ep); 965 extern int clnt_hostname(char *hostname, char **ret_hostname, 966 md_error_t *ep); 967 extern int clnt_nullproc(char *hostname, md_error_t *ep); 968 extern int clnt_ownset(char *hostname, mdsetname_t *sp, 969 int *ret_bool, md_error_t *ep); 970 extern int clnt_setnameok(char *hostname, mdsetname_t *sp, 971 int *ret_bool, md_error_t *ep); 972 extern int clnt_setnumbusy(char *hostname, set_t setno, 973 int *ret_bool, md_error_t *ep); 974 extern int clnt_upd_dr_dbinfo(char *hostname, mdsetname_t *sp, 975 md_drive_desc *dd, md_error_t *ep); 976 extern int clnt_stimeout(char *hostname, mdsetname_t *sp, 977 mhd_mhiargs_t *mhiargsp, md_error_t *ep); 978 extern int clnt_gtimeout(char *hostname, mdsetname_t *sp, 979 mhd_mhiargs_t *ret_mhiargs, md_error_t *ep); 980 extern int clnt_upd_dr_flags(char *hostname, mdsetname_t *sp, 981 md_drive_desc *dd, uint_t new_flags, 982 md_error_t *ep); 983 extern int clnt_enable_sr_flags(char *hostname, mdsetname_t *sp, 984 uint_t new_flags, md_error_t *ep); 985 extern int clnt_disable_sr_flags(char *hostname, mdsetname_t *sp, 986 uint_t new_flags, md_error_t *ep); 987 extern int clnt_upd_sr_flags(char *hostname, mdsetname_t *sp, 988 uint_t new_flags, md_error_t *ep); 989 extern int clnt_upd_nr_flags(char *hostname, mdsetname_t *sp, 990 md_mnnode_desc *nd, uint_t flag_action, 991 uint_t flags, md_error_t *ep); 992 extern int clnt_unlock_set(char *hostname, md_setkey_t *cl_sk, 993 md_error_t *ep); 994 extern int clnt_lock_set(char *hostname, mdsetname_t *sp, 995 md_error_t *ep); 996 extern int clnt_updmeds(char *hostname, mdsetname_t *sp, 997 md_h_arr_t *meddp, md_error_t *ep); 998 extern int clnt_resnarf_set(char *hostname, set_t setno, 999 md_error_t *ep); 1000 extern md_setkey_t *cl_get_setkey(set_t setno, char *setname); 1001 extern void cl_set_setkey(md_setkey_t *cl_sk); 1002 extern void meta_conv_drvname_new2old(o_mddrivename_t *, 1003 mddrivename_t *); 1004 extern void meta_conv_drvname_old2new(o_mddrivename_t *, 1005 mddrivename_t *); 1006 extern void meta_conv_drvdesc_new2old(o_md_drive_desc *, 1007 md_drive_desc *); 1008 extern void meta_conv_drvdesc_old2new(o_md_drive_desc *, 1009 md_drive_desc *); 1010 extern void alloc_olddrvdesc(o_md_drive_desc **, md_drive_desc *); 1011 extern void alloc_newdrvdesc(o_md_drive_desc *, md_drive_desc **); 1012 extern void free_olddrvdesc(o_md_drive_desc *); 1013 extern void free_newdrvdesc(md_drive_desc *); 1014 extern char *meta_get_devid(char *); 1015 extern int clnt_mnsetmaster(char *hostname, mdsetname_t *sp, 1016 md_node_nm_t master_nodenm, int master_nodeid, 1017 md_error_t *ep); 1018 extern int clnt_clr_mnsetlock(char *hostname, md_error_t *ep); 1019 extern int clnt_mdcommdctl(char *hostname, int flag_action, 1020 mdsetname_t *sp, md_mn_msgclass_t class, 1021 uint_t flags, md_error_t *ep); 1022 extern int clnt_mn_is_stale(char *hostname, mdsetname_t *sp, 1023 int *ret_bool, md_error_t *ep); 1024 extern int clnt_getdrivedesc(char *hostname, mdsetname_t *sp, 1025 md_drive_desc **dd, md_error_t *ep); 1026 extern void free_rem_dd(md_drive_desc *dd); 1027 extern int clnt_upd_dr_reconfig(char *hostname, mdsetname_t *sp, 1028 md_drive_desc *dd, md_error_t *ep); 1029 extern int clnt_reset_mirror_owner(char *hostname, mdsetname_t *sp, 1030 int node_c, int *node_id, md_error_t *ep); 1031 extern int clnt_mn_susp_res_io(char *hostname, set_t setno, 1032 int flag, md_error_t *ep); 1033 extern int clnt_mn_mirror_resync_all(char *hostname, set_t setno, 1034 md_error_t *ep); 1035 extern int clnt_mn_sp_update_abr(char *hostname, set_t setno, 1036 md_error_t *ep); 1037 1038 /* meta_metad_subr.c */ 1039 extern mddb_userreq_t *get_db_rec(md_ur_get_cmd_t cmd, set_t setno, 1040 mddb_type_t type, uint_t type2, mddb_recid_t *idp, 1041 md_error_t *ep); 1042 extern void *get_ur_rec(set_t setno, md_ur_get_cmd_t cmd, 1043 uint_t type2, mddb_recid_t *idp, md_error_t *ep); 1044 extern void sr_validate(void); 1045 extern void sr_del_drv(md_set_record *sr, mddb_recid_t recid); 1046 extern int set_snarf(md_error_t *ep); 1047 extern void sr_cache_add(md_set_record *sr); 1048 extern void sr_cache_del(mddb_recid_t recid); 1049 extern void dr_cache_add(md_set_record *sr, md_drive_record *dr); 1050 extern void dr_cache_del(md_set_record *sr, mddb_recid_t recid); 1051 extern void mnnr_cache_add(md_mnset_record *sr, 1052 md_mnnode_record *nr); 1053 extern void mnnr_cache_del(md_mnset_record *sr, mddb_recid_t recid); 1054 extern int metad_isautotakebyname(char *setname); 1055 extern int metad_isautotakebynum(set_t setno); 1056 extern md_set_record *metad_getsetbyname(char *setname, md_error_t *ep); 1057 extern md_set_record *metad_getsetbynum(set_t setno, md_error_t *ep); 1058 extern void commitset(md_set_record *sr, int inc_genid, 1059 md_error_t *ep); 1060 extern md_set_record *setdup(md_set_record *sr); 1061 extern md_mnset_record *mnsetdup(md_mnset_record *mnsr); 1062 extern md_drive_record *drdup(md_drive_record *dr); 1063 extern md_mnnode_record *nrdup(md_mnnode_record *nr); 1064 extern md_drive_desc *dd_list_dup(md_drive_desc *dd); 1065 extern void sr_cache_flush(int flushnames); 1066 extern void sr_cache_flush_setno(set_t setno); 1067 extern void s_delset(char *setname, md_error_t *ep); 1068 extern void s_delrec(mddb_recid_t recid, md_error_t *ep); 1069 extern int s_ownset(set_t setno, md_error_t *ep); 1070 extern int resnarf_set(set_t setno, md_error_t *ep); 1071 1072 /* meta_mh.c */ 1073 extern mhd_mhiargs_t defmhiargs; 1074 extern int meta_take_own(char *sname, mddrivenamelist_t *dnlp, 1075 mhd_mhiargs_t *mhiargsp, int partial_set, 1076 md_error_t *ep); 1077 extern int tk_own_bydd(mdsetname_t *sp, md_drive_desc *dd, 1078 mhd_mhiargs_t *mhiargsp, int partial_set, 1079 md_error_t *ep); 1080 extern int meta_rel_own(char *sname, mddrivenamelist_t *dnlp, 1081 int partial_set, md_error_t *ep); 1082 extern int rel_own_bydd(mdsetname_t *sp, md_drive_desc *dd, 1083 int partial_set, md_error_t *ep); 1084 extern int meta_status_own(char *sname, 1085 md_disk_status_list_t *dslp, int partial_set, 1086 md_error_t *ep); 1087 extern md_disk_status_list_t *meta_drive_to_disk_status_list( 1088 mddrivenamelist_t *dnlp); 1089 extern void meta_free_disk_status_list(md_disk_status_list_t *dslp); 1090 extern void meta_free_drive_info_list(mhd_drive_info_list_t *listp); 1091 extern int meta_list_drives(char *hostname, char *path, 1092 mhd_did_flags_t flags, 1093 mhd_drive_info_list_t *listp, md_error_t *ep); 1094 extern int meta_get_drive_names(mdsetname_t *sp, 1095 mddrivenamelist_t **dnlpp, int options, 1096 md_error_t *ep); 1097 1098 /* meta_mirror.c */ 1099 extern int meta_get_mirror_names(mdsetname_t *sp, 1100 mdnamelist_t **nlpp, int options, md_error_t *ep); 1101 extern void meta_free_mirror(md_mirror_t *mirrorp); 1102 extern md_mirror_t *meta_get_mirror(mdsetname_t *sp, mdname_t *mirnp, 1103 md_error_t *ep); 1104 extern int meta_check_inmirror(mdsetname_t *sp, mdname_t *np, 1105 diskaddr_t slblk, diskaddr_t nblks, md_error_t *ep); 1106 extern int meta_check_submirror(mdsetname_t *sp, mdname_t *np, 1107 mdname_t *mirnp, int force, md_error_t *ep); 1108 extern char *rd_opt_to_name(mm_rd_opt_t opt); 1109 extern int name_to_rd_opt(char *uname, char *name, 1110 mm_rd_opt_t *optp, md_error_t *ep); 1111 extern char *wr_opt_to_name(mm_wr_opt_t opt); 1112 extern int name_to_wr_opt(char *uname, char *name, 1113 mm_wr_opt_t *optp, md_error_t *ep); 1114 extern int name_to_pass_num(char *uname, char *name, 1115 mm_pass_num_t *passp, md_error_t *ep); 1116 extern char *sm_state_to_name(md_submirror_t *mdsp, 1117 md_status_t mirror_status, md_timeval32_t *tvp, 1118 uint_t tstate); 1119 extern int sm_state_to_action(mdsetname_t *sp, 1120 md_submirror_t *mdsp, md_status_t mirror_status, 1121 md_mirror_t *mirrorp, char **actionp, 1122 md_error_t *ep); 1123 extern int meta_print_mirror_options(mm_rd_opt_t read_options, 1124 mm_wr_opt_t write_option, mm_pass_num_t pass_num, 1125 uint_t tstate, char *fname, 1126 mdsetname_t *sp, FILE *fp, md_error_t *ep); 1127 extern int meta_mirror_print(mdsetname_t *sp, mdname_t *mirnp, 1128 mdnamelist_t **nlpp, char *fname, FILE *fp, 1129 mdprtopts_t options, md_error_t *ep); 1130 extern int meta_mirror_online(mdsetname_t *sp, mdname_t *mirnp, 1131 mdname_t *submirnp, mdcmdopts_t options, 1132 md_error_t *ep); 1133 extern int meta_mirror_offline(mdsetname_t *sp, mdname_t *mirnp, 1134 mdname_t *submirnp, mdcmdopts_t options, 1135 md_error_t *ep); 1136 extern int meta_mirror_attach(mdsetname_t *sp, mdname_t *mirnp, 1137 mdname_t *submirnp, mdcmdopts_t options, 1138 md_error_t *ep); 1139 extern int meta_mirror_detach(mdsetname_t *sp, mdname_t *mirnp, 1140 mdname_t *submirnp, mdcmdopts_t options, 1141 md_error_t *ep); 1142 extern int meta_mirror_get_params(mdsetname_t *sp, 1143 mdname_t *mirnp, mm_params_t *paramsp, 1144 md_error_t *ep); 1145 extern int meta_mirror_set_params(mdsetname_t *sp, 1146 mdname_t *mirnp, mm_params_t *paramsp, 1147 md_error_t *ep); 1148 extern int meta_mirror_replace(mdsetname_t *sp, mdname_t *mirnp, 1149 mdname_t *oldnp, mdname_t *newnp, 1150 mdcmdopts_t options, md_error_t *ep); 1151 extern int meta_mirror_enable(mdsetname_t *sp, mdname_t *mirnp, 1152 mdname_t *compnp, mdcmdopts_t options, 1153 md_error_t *ep); 1154 extern int meta_check_mirror(mdsetname_t *sp, 1155 md_mirror_t *mirrorp, mdcmdopts_t options, 1156 md_error_t *ep); 1157 extern int meta_create_mirror(mdsetname_t *sp, 1158 md_mirror_t *mirrorp, mdcmdopts_t options, 1159 md_error_t *ep); 1160 extern int meta_init_mirror(mdsetname_t **spp, 1161 int argc, char *argv[], mdcmdopts_t options, 1162 md_error_t *ep); 1163 extern int meta_mirror_reset(mdsetname_t *sp, mdname_t *mirnp, 1164 mdcmdopts_t options, md_error_t *ep); 1165 extern int meta_mirror_anycomp_is_err(mdsetname_t *, 1166 mdnamelist_t *); 1167 1168 /* meta_mirror_resync.c */ 1169 extern int meta_mirror_resync(mdsetname_t *sp, mdname_t *mirnp, 1170 daddr_t size, md_error_t *ep, md_resync_cmd_t cmd); 1171 extern int meta_mirror_resync_all(mdsetname_t *sp, daddr_t size, 1172 md_error_t *ep); 1173 extern void *meta_mn_mirror_resync_all(void *arg); 1174 extern void meta_mirror_resync_kill_all(void); 1175 extern void meta_mirror_resync_block_all(void); 1176 extern void meta_mirror_resync_unblock_all(void); 1177 extern void meta_mirror_resync_unblock(mdsetname_t *sp); 1178 extern void meta_mirror_resync_kill(mdsetname_t *sp); 1179 1180 /* meta_mount.c */ 1181 extern char *meta_get_mountp(mdsetname_t *, mdname_t *, 1182 md_error_t *); 1183 1184 /* meta_name.c */ 1185 extern char *meta_name_getname(mdsetname_t **spp, char *uname, 1186 meta_device_type_t uname_type, md_error_t *ep); 1187 extern char *meta_canonicalize(mdsetname_t *sp, char *uname); 1188 extern char *meta_canonicalize_check_set(mdsetname_t **sp, 1189 char *uname, md_error_t *ep); 1190 extern int meta_is_all(char *uname); 1191 extern int is_existing_metadevice(mdsetname_t *sp, char *uname); 1192 extern int is_existing_hsp(mdsetname_t *sp, char *uname); 1193 extern int is_existing_meta_hsp(mdsetname_t *sp, char *uname); 1194 extern int is_metaname(char *uname); 1195 extern int meta_is_none(char *uname); 1196 extern int is_hspname(char *uname); 1197 extern int parse_ctd(char *uname, uint_t *slice); 1198 extern void parse_device(mdsetname_t *, char *, char **, char **); 1199 extern md_set_desc *sr2setdesc(md_set_record *sr); 1200 extern mdsetname_t *metasetname(char *sname, md_error_t *ep); 1201 extern mdsetname_t *metasetnosetname(set_t setno, md_error_t *ep); 1202 extern mdsetname_t *metafakesetname(set_t setno, char *sname); 1203 extern md_set_desc *metaget_setdesc(mdsetname_t *sp, md_error_t *ep); 1204 extern void metaflushsetname(mdsetname_t *sp); 1205 extern void metaflushdrivenames(void); 1206 extern int metaislocalset(mdsetname_t *sp); 1207 extern int metaissameset(mdsetname_t *sp1, mdsetname_t *sp2); 1208 extern void metaflushsidenames(mddrivename_t *dnp); 1209 extern char *metadiskname(char *name); 1210 extern mddrivename_t *metadrivename(mdsetname_t **spp, char *uname, 1211 md_error_t *ep); 1212 extern mddrivename_t *metadrivenamebydevid(mdsetname_t **spp, char *devid, 1213 char *uname, md_error_t *ep); 1214 extern mdname_t *metaslicename(mddrivename_t *dnp, uint_t sliceno, 1215 md_error_t *ep); 1216 extern void metafreedrivename(mddrivename_t *dnp); 1217 extern void metafreedrivenamelist(mddrivenamelist_t *dnlp); 1218 extern int metadrivenamelist(mdsetname_t **spp, 1219 mddrivenamelist_t **dnlpp, 1220 int argc, char *argv[], md_error_t *ep); 1221 extern mddrivename_t *metadrivenamelist_append(mddrivenamelist_t **dnlpp, 1222 mddrivename_t *dnp); 1223 extern mddrivenamelist_t **meta_drivenamelist_append_wrapper( 1224 mddrivenamelist_t **dnlpp, 1225 mddrivename_t *dnp); 1226 extern int meta_getdev(mdsetname_t *sp, mdname_t *np, 1227 md_error_t *ep); 1228 extern mdname_t *metaname_fast(mdsetname_t **spp, char *uname, 1229 meta_device_type_t uname_type, md_error_t *ep); 1230 extern mdname_t *metaname(mdsetname_t **spp, char *uname, 1231 meta_device_type_t uname_type, md_error_t *ep); 1232 extern mdname_t *metamnumname(mdsetname_t **spp, minor_t mnum, 1233 int fast, md_error_t *ep); 1234 extern char *get_mdname(mdsetname_t *sp, minor_t mnum); 1235 extern int metaismeta(mdname_t *np); 1236 extern int metachkmeta(mdname_t *np, md_error_t *ep); 1237 extern int metachkdisk(mdname_t *np, md_error_t *ep); 1238 extern int metachkcomp(mdname_t *np, md_error_t *ep); 1239 extern void metafreenamelist(mdnamelist_t *nlp); 1240 extern int metanamelist(mdsetname_t **spp, mdnamelist_t **nlpp, 1241 int argc, char *argv[], meta_device_type_t type, 1242 md_error_t *ep); 1243 extern mdname_t *metanamelist_append(mdnamelist_t **nlpp, 1244 mdname_t *np); 1245 extern mdnamelist_t **meta_namelist_append_wrapper(mdnamelist_t **nlpp, 1246 mdname_t *np); 1247 extern mdhspname_t *metahspname(mdsetname_t **spp, 1248 char *uname, md_error_t *ep); 1249 extern mdhspname_t *metahsphspname(mdsetname_t **spp, 1250 hsp_t hsp, md_error_t *ep); 1251 extern char *get_hspname(mdsetname_t *sp, hsp_t mnum); 1252 extern void metafreehspnamelist(mdhspnamelist_t *hspnlp); 1253 extern int metahspnamelist(mdsetname_t **spp, 1254 mdhspnamelist_t **hspnlpp, 1255 int argc, char *argv[], md_error_t *ep); 1256 extern mdhspname_t *metahspnamelist_append(mdhspnamelist_t **hspnlp, 1257 mdhspname_t *hspnp); 1258 extern mdname_t *metadevname(mdsetname_t **spp, 1259 md_dev64_t dev, md_error_t *ep); 1260 extern char *get_devname(set_t setno, md_dev64_t dev); 1261 extern mdname_t *metakeyname(mdsetname_t **spp, 1262 mdkey_t key, int fast, md_error_t *ep); 1263 extern void metaflushmetanames(void); 1264 extern void metaflushnames(int flush_sr_cache); 1265 extern int meta_get_hotspare_names(mdsetname_t *sp, 1266 mdnamelist_t **nlpp, int options, md_error_t *ep); 1267 extern void meta_create_non_dup_list(mdname_t *mdnp, 1268 mddevid_t **ldevidpp); 1269 extern mddrivename_t *meta_getdnp_bydevid(mdsetname_t *sp, side_t sideno, 1270 ddi_devid_t devidp, mdkey_t key, md_error_t *ep); 1271 1272 1273 /* meta_nameinfo.c */ 1274 extern mdsetname_t *metagetset(mdname_t *np, int bypass_daemon, 1275 md_error_t *ep); 1276 extern void metafreevtoc(mdvtoc_t *vtocp); 1277 extern int meta_match_enclosure(mdname_t *, mdcinfo_t *, 1278 md_error_t *); 1279 extern mdvtoc_t *metagetvtoc(mdname_t *np, int nocache, uint_t *partnop, 1280 md_error_t *ep); 1281 extern int metasetvtoc(mdname_t *np, md_error_t *ep); 1282 extern void metaflushctlrcache(void); 1283 extern mdgeom_t *metagetgeom(mdname_t *np, md_error_t *ep); 1284 extern mdcinfo_t *metagetcinfo(mdname_t *np, md_error_t *ep); 1285 extern int metagetpartno(mdname_t *np, md_error_t *ep); 1286 extern diskaddr_t metagetsize(mdname_t *np, md_error_t *ep); 1287 extern diskaddr_t metagetlabel(mdname_t *np, md_error_t *ep); 1288 extern diskaddr_t metagetstart(mdsetname_t *sp, mdname_t *np, 1289 md_error_t *ep); 1290 extern int metahasmddb(mdsetname_t *sp, mdname_t *np, 1291 md_error_t *ep); 1292 extern char *metagetdevicesname(mdname_t *np, md_error_t *ep); 1293 extern char *metagetmiscname(mdname_t *np, md_error_t *ep); 1294 extern md_unit_t *meta_get_mdunit(mdsetname_t *sp, mdname_t *np, 1295 md_error_t *ep); 1296 extern void meta_free_unit(mddrivename_t *dnp); 1297 extern void meta_invalidate_name(mdname_t *np); 1298 extern md_common_t *meta_get_unit(mdsetname_t *sp, mdname_t *np, 1299 md_error_t *ep); 1300 extern int meta_isopen(mdsetname_t *sp, mdname_t *np, 1301 md_error_t *ep, mdcmdopts_t options); 1302 1303 /* meta_namespace.c */ 1304 extern char *meta_getnmbykey(set_t setno, side_t sideno, 1305 mdkey_t key, md_error_t *ep); 1306 extern char *meta_getnmentbykey(set_t setno, side_t sideno, 1307 mdkey_t key, char **drvnm, minor_t *mnum, 1308 md_dev64_t *dev, md_error_t *ep); 1309 extern char *meta_getnmentbydev(set_t setno, side_t sideno, 1310 md_dev64_t dev, char **drvnm, minor_t *mnum, 1311 mdkey_t *key, md_error_t *ep); 1312 extern char *meta_gethspnmentbyid(set_t setno, side_t sideno, 1313 hsp_t hspid, md_error_t *ep); 1314 extern hsp_t meta_gethspnmentbyname(set_t setno, side_t sideno, 1315 char *hspname, md_error_t *ep); 1316 extern char *meta_getdidminorbykey(set_t setno, side_t sideno, 1317 mdkey_t key, md_error_t *ep); 1318 extern ddi_devid_t meta_getdidbykey(set_t setno, side_t sideno, 1319 mdkey_t key, md_error_t *ep); 1320 extern int meta_setdid(set_t setno, side_t sideno, mdkey_t key, 1321 md_error_t *ep); 1322 extern int add_name(mdsetname_t *sp, side_t sideno, mdkey_t key, 1323 char *dname, minor_t mnum, char *bname, 1324 char *minorname, ddi_devid_t devid, md_error_t *ep); 1325 extern int del_name(mdsetname_t *sp, side_t sideno, mdkey_t key, 1326 md_error_t *ep); 1327 extern int add_key_name(mdsetname_t *sp, mdname_t *np, 1328 mdnamelist_t **nlpp, md_error_t *ep); 1329 extern int del_key_name(mdsetname_t *sp, mdname_t *np, 1330 md_error_t *ep); 1331 extern int del_key_names(mdsetname_t *sp, mdnamelist_t *nlp, 1332 md_error_t *ep); 1333 extern mdkey_t add_self_name(mdsetname_t *, char *, 1334 md_mkdev_params_t *, md_error_t *); 1335 extern int del_self_name(mdsetname_t *, mdkey_t, 1336 md_error_t *); 1337 1338 /* meta_patch.c */ 1339 extern int meta_patch_vfstab(char *cmpname, mdname_t *fsnp, 1340 char *vname, char *old_bdevname, int doit, 1341 int verbose, char **tname, md_error_t *ep); 1342 extern int meta_patch_fsdev(char *fsname, mdname_t *fsnp, 1343 char *vname, md_error_t *ep); 1344 extern int meta_patch_swapdev(mdname_t *fsnp, 1345 char *vname, char *old_bdevname, md_error_t *ep); 1346 extern int meta_patch_mddb(char *sname, char *cname, int patch, 1347 md_error_t *ep); 1348 1349 /* meta_patch_root.c */ 1350 extern int meta_patch_rootdev(mdname_t *np, char *sname, 1351 char *vname, char *cname, char *dbname, int doit, 1352 int verbose, md_error_t *ep); 1353 1354 /* meta_print.c */ 1355 extern int meta_print_name(mdsetname_t *sp, mdname_t *namep, 1356 mdnamelist_t **nlpp, char *fname, FILE *fp, 1357 mdprtopts_t options, mdnamelist_t **lognlpp, 1358 md_error_t *ep); 1359 extern int meta_print_all(mdsetname_t *sp, char *fname, 1360 mdnamelist_t **nlpp, FILE *fp, 1361 mdprtopts_t options, int *meta_print_trans_msgp, 1362 md_error_t *ep); 1363 extern char *meta_print_time(md_timeval32_t *timep); 1364 extern char *meta_print_hrtime(hrtime_t secs); 1365 extern int meta_prbits(FILE *fp, const char *fmt, ...); 1366 extern char *meta_number_to_string(diskaddr_t number, 1367 u_longlong_t blk_sz); 1368 extern int meta_get_tstate(md_dev64_t dev64, uint_t *tstatep, 1369 md_error_t *ep); 1370 extern int meta_print_devid(mdsetname_t *sp, FILE *fp, 1371 mddevid_t *mddevidp, md_error_t *ep); 1372 1373 /* meta_raid.c */ 1374 extern int meta_raid_check_component(mdsetname_t *sp, 1375 mdname_t *np, md_dev64_t dev, md_error_t *ep); 1376 extern int meta_get_raid_names(mdsetname_t *sp, 1377 mdnamelist_t **nlpp, int options, md_error_t *ep); 1378 extern void meta_free_raid(md_raid_t *raidp); 1379 extern md_raid_t *meta_get_raid_common(mdsetname_t *sp, mdname_t *raidnp, 1380 int fast, md_error_t *ep); 1381 extern md_raid_t *meta_get_raid(mdsetname_t *sp, mdname_t *raidnp, 1382 md_error_t *ep); 1383 extern int meta_check_inraid(mdsetname_t *sp, mdname_t *np, 1384 diskaddr_t slblk, diskaddr_t nblks, md_error_t *ep); 1385 extern int meta_check_column(mdsetname_t *sp, mdname_t *np, 1386 md_error_t *ep); 1387 extern char *raid_state_to_name(md_raid_t *raidp, 1388 md_timeval32_t *tvp, uint_t tstate); 1389 extern char *raid_state_to_action(md_raid_t *raidp); 1390 extern char *raid_col_state_to_name(md_raidcol_t *colp, 1391 md_timeval32_t *tvp, uint_t tstate); 1392 extern int meta_print_raid_options(mdhspname_t *hspnamep, 1393 char *fname, FILE *fp, md_error_t *ep); 1394 extern int meta_raid_print(mdsetname_t *sp, mdname_t *raidnp, 1395 mdnamelist_t **nlpp, char *fname, FILE *fp, 1396 mdprtopts_t options, md_error_t *ep); 1397 extern int meta_raid_attach(mdsetname_t *sp, mdname_t *raidnp, 1398 mdnamelist_t *nlp, mdcmdopts_t options, 1399 md_error_t *ep); 1400 extern int meta_raid_get_params(mdsetname_t *sp, mdname_t *raidnp, 1401 mr_params_t *paramsp, md_error_t *ep); 1402 extern int meta_raid_set_params(mdsetname_t *sp, mdname_t *raidnp, 1403 mr_params_t *paramsp, md_error_t *ep); 1404 extern int meta_raid_replace(mdsetname_t *sp, mdname_t *raidnp, 1405 mdname_t *oldnp, mdname_t *newnp, 1406 mdcmdopts_t options, md_error_t *ep); 1407 extern int meta_raid_enable(mdsetname_t *sp, mdname_t *raidnp, 1408 mdname_t *compnp, mdcmdopts_t options, 1409 md_error_t *ep); 1410 extern diskaddr_t meta_default_raid_interlace(void); 1411 extern int meta_raid_check_interlace(diskaddr_t interlace, 1412 char *uname, md_error_t *ep); 1413 extern int meta_check_raid(mdsetname_t *sp, md_raid_t *raidp, 1414 mdcmdopts_t options, md_error_t *ep); 1415 extern int meta_create_raid(mdsetname_t *sp, md_raid_t *raidp, 1416 mdcmdopts_t options, md_error_t *ep); 1417 extern int meta_init_raid(mdsetname_t **spp, 1418 int argc, char *argv[], mdcmdopts_t options, 1419 md_error_t *ep); 1420 extern int meta_raid_reset(mdsetname_t *sp, mdname_t *np, 1421 mdcmdopts_t options, md_error_t *ep); 1422 extern int meta_raid_anycomp_is_err(mdsetname_t *, mdnamelist_t *); 1423 1424 /* meta_raid_resync.c */ 1425 extern int meta_raid_resync(mdsetname_t *sp, mdname_t *raidnp, 1426 daddr_t size, md_error_t *ep); 1427 extern int meta_raid_resync_all(mdsetname_t *sp, daddr_t size, 1428 md_error_t *ep); 1429 1430 extern int meta_raid_regen_byname(mdsetname_t *sp, 1431 mdname_t *raidnp, diskaddr_t size, md_error_t *ep); 1432 1433 /* meta_repartition.c */ 1434 extern int meta_replicaslice(mddrivename_t *dnp, 1435 uint_t *slicep, md_error_t *ep); 1436 1437 /* meta_replace.c */ 1438 extern int meta_replace_byname(mdsetname_t *sp, mdname_t *namep, 1439 mdname_t *oldnp, mdname_t *newnp, 1440 mdcmdopts_t options, md_error_t *ep); 1441 extern int meta_enable_byname(mdsetname_t *sp, mdname_t *namep, 1442 mdname_t *compnp, mdcmdopts_t options, 1443 md_error_t *ep); 1444 1445 /* meta_reset.c */ 1446 extern int meta_reset(mdsetname_t *sp, mdname_t *np, 1447 mdcmdopts_t options, md_error_t *ep); 1448 extern int meta_reset_all(mdsetname_t *sp, mdcmdopts_t options, 1449 md_error_t *ep); 1450 extern int meta_reset_by_name(mdsetname_t *sp, mdname_t *np, 1451 mdcmdopts_t options, md_error_t *ep); 1452 1453 /* meta_resync.c */ 1454 extern int meta_resync_byname(mdsetname_t *sp, mdname_t *np, 1455 daddr_t size, md_error_t *ep, md_resync_cmd_t cmd); 1456 extern int meta_resync_all(mdsetname_t *sp, daddr_t size, 1457 md_error_t *ep); 1458 1459 /* meta_set.c */ 1460 extern set_t get_max_sets(md_error_t *ep); 1461 extern int get_max_meds(md_error_t *ep); 1462 extern side_t getmyside(mdsetname_t *sp, md_error_t *ep); 1463 extern md_set_record *getsetbyname(char *setname, md_error_t *ep); 1464 extern md_set_record *getsetbynum(set_t setno, md_error_t *ep); 1465 extern int meta_check_drive_inuse(mdsetname_t *sp, 1466 mddrivename_t *dnp, int check_db, md_error_t *ep); 1467 extern int meta_check_ownership(mdsetname_t *sp, md_error_t *ep); 1468 extern int meta_check_ownership_on_host(mdsetname_t *sp, 1469 char *hostname, md_error_t *ep); 1470 extern int meta_is_member(char *node_name, md_mn_nodeid_t node_id, 1471 mndiskset_membershiplist_t *nl); 1472 extern int meta_getnextside_devinfo(mdsetname_t *sp, char *bname, 1473 side_t *sideno, char **ret_bname, char **ret_dname, 1474 minor_t *ret_mnum, md_error_t *ep); 1475 extern int meta_getside_devinfo(mdsetname_t *sp, char *bname, 1476 side_t sideno, char **ret_bname, char **ret_dname, 1477 minor_t *ret_mnum, md_error_t *ep); 1478 extern int meta_is_drive_in_anyset(mddrivename_t *dnp, 1479 mdsetname_t **spp, int bypass_daemon, 1480 md_error_t *ep); 1481 extern int meta_is_drive_in_thisset(mdsetname_t *sp, 1482 mddrivename_t *dnp, int bypass_daemon, 1483 md_error_t *ep); 1484 extern int meta_is_devid_in_anyset(void *devid, 1485 mdsetname_t **spp, md_error_t *ep); 1486 extern int meta_is_devid_in_thisset(mdsetname_t *sp, 1487 void *devid, md_error_t *ep); 1488 extern int meta_set_balance(mdsetname_t *sp, md_error_t *ep); 1489 extern int meta_set_destroy(mdsetname_t *sp, int lock_set, 1490 md_error_t *ep); 1491 extern int meta_set_purge(mdsetname_t *sp, int bypass_cluster, 1492 int forceflg, md_error_t *ep); 1493 extern int meta_set_query(mdsetname_t *sp, mddb_dtag_lst_t **dtlpp, 1494 md_error_t *ep); 1495 extern mddrivename_t *metadrivename_withdrkey(mdsetname_t *sp, 1496 side_t sideno, mdkey_t key, int flags, 1497 md_error_t *ep); 1498 extern void metafreedrivedesc(md_drive_desc **dd); 1499 extern md_drive_desc *metaget_drivedesc(mdsetname_t *sp, int flags, 1500 md_error_t *ep); 1501 extern md_drive_desc *metaget_drivedesc_fromnamelist(mdsetname_t *sp, 1502 mdnamelist_t *nlp, md_error_t *ep); 1503 extern md_drive_desc *metaget_drivedesc_sideno(mdsetname_t *sp, 1504 side_t sideno, int flags, md_error_t *ep); 1505 extern int metaget_setownership(mdsetname_t *sp, md_error_t *ep); 1506 extern char *mynode(void); 1507 extern int strinlst(char *str, int cnt, char **lst); 1508 extern int meta_get_reserved_names(mdsetname_t *sp, 1509 mdnamelist_t **nlpp, int options, md_error_t *ep); 1510 extern int meta_set_join(mdsetname_t *sp, md_error_t *ep); 1511 extern int meta_set_withdraw(mdsetname_t *sp, md_error_t *ep); 1512 extern int meta_reconfig_choose_master(); 1513 extern int meta_mnsync_user_records(mdsetname_t *sp, 1514 md_error_t *ep); 1515 extern int meta_mnsync_diskset_mddbs(mdsetname_t *sp, 1516 md_error_t *ep); 1517 extern int meta_mnjoin_all(mdsetname_t *sp, md_error_t *ep); 1518 extern int meta_getandsetmaster(mdsetname_t *sp, 1519 md_mnset_record *mnsr, md_set_desc *sd, 1520 md_error_t *ep); 1521 extern int meta_devid_use(md_error_t *ep); 1522 1523 /* meta_set_drv.c */ 1524 extern int meta_make_sidenmlist(mdsetname_t *, 1525 mddrivename_t *, int imp_flag, 1526 md_im_drive_info_t *midp, md_error_t *); 1527 extern int meta_set_adddrives(mdsetname_t *sp, 1528 mddrivenamelist_t *dnlp, daddr_t dbsize, 1529 int force_label, md_error_t *ep); 1530 extern int meta_set_deletedrives(mdsetname_t *sp, 1531 mddrivenamelist_t *dnlp, int forceflg, 1532 md_error_t *ep); 1533 1534 /* meta_set_hst.c */ 1535 extern int meta_set_checkname(char *setname, md_error_t *ep); 1536 extern int meta_set_addhosts(mdsetname_t *sp, int multi_node, 1537 int node_c, char **node_v, int auto_take, 1538 md_error_t *ep); 1539 extern int meta_set_deletehosts(mdsetname_t *sp, int node_c, 1540 char **node_v, int forceflg, md_error_t *ep); 1541 extern int meta_set_auto_take(mdsetname_t *sp, int take_val, 1542 md_error_t *ep); 1543 1544 /* meta_set_med.c */ 1545 extern int meta_set_addmeds(mdsetname_t *sp, int node_c, 1546 char **node_v, md_error_t *ep); 1547 extern int meta_set_deletemeds(mdsetname_t *sp, int node_c, 1548 char **node_v, int forceflg, md_error_t *ep); 1549 1550 /* meta_set_tkr.c */ 1551 extern int meta_set_take(mdsetname_t *sp, mhd_mhiargs_t *mhiargsp, 1552 int flags, int usetag, md_error_t *ep); 1553 extern int meta_set_release(mdsetname_t *sp, md_error_t *ep); 1554 extern int meta_update_mb(mdsetname_t *sp, md_drive_desc *dd, 1555 md_error_t *ep); 1556 1557 /* meta_setup.c */ 1558 extern char *myname; 1559 extern FILE *metalogfp; 1560 extern int metasyslog; 1561 extern uint_t verbosity; 1562 extern hrtime_t start_time; 1563 extern sigset_t allsigs; 1564 #define ANYSIG allsigs 1565 extern char *meta_lock_name(set_t setno); 1566 extern int meta_unlock(mdsetname_t *sp, md_error_t *ep); 1567 extern int meta_lock(mdsetname_t *sp, int print_status, 1568 md_error_t *ep); 1569 extern int meta_lock_nowait(mdsetname_t *sp, md_error_t *ep); 1570 extern int meta_lock_status(mdsetname_t *sp, md_error_t *ep); 1571 extern int md_daemonize(mdsetname_t *sp, md_error_t *ep); 1572 extern void md_exit(mdsetname_t *sp, int eval); 1573 extern void md_post_sig(int sig); 1574 extern int md_got_sig(void); 1575 extern int md_which_sig(void); 1576 extern void md_rb_sig_handling_on(void); 1577 extern void md_rb_sig_handling_off(int sig_seen, int sig); 1578 extern void setup_mc_log(uint_t level); 1579 extern int md_init(int argc, char *argv[], 1580 int dosyslog, int doadmin, md_error_t *ep); 1581 extern int md_init_nosig(int argc, char *argv[], 1582 int dosyslog, int doadmin, md_error_t *ep); 1583 1584 extern int md_init_daemon(char *name, md_error_t *ep); 1585 1586 /* meta_smf.c */ 1587 extern int meta_smf_enable(uint_t flags, md_error_t *ep); 1588 extern int meta_smf_disable(uint_t flags, md_error_t *ep); 1589 extern int meta_smf_isonline(uint_t flags, md_error_t *ep); 1590 extern int meta_smf_getmask(); 1591 1592 /* meta_sp.c */ 1593 extern int meta_sp_check_component(mdsetname_t *sp, 1594 mdname_t *np, md_error_t *ep); 1595 extern int meta_get_sp_names(mdsetname_t *sp, mdnamelist_t **nlpp, 1596 int options, md_error_t *ep); 1597 extern int meta_check_insp(mdsetname_t *sp, mdname_t *np, 1598 diskaddr_t slblk, diskaddr_t nblks, md_error_t *ep); 1599 extern int meta_sp_print(mdsetname_t *sp, mdname_t *np, 1600 mdnamelist_t **nlpp, char *fname, FILE *fp, 1601 mdprtopts_t options, md_error_t *ep); 1602 extern md_sp_t *meta_get_sp_common(mdsetname_t *sp, mdname_t *np, 1603 int fast, md_error_t *ep); 1604 extern md_sp_t *meta_get_sp(mdsetname_t *sp, mdname_t *np, 1605 md_error_t *ep); 1606 extern int meta_init_sp(mdsetname_t **spp, int argc, char *argv[], 1607 mdcmdopts_t options, md_error_t *ep); 1608 extern void meta_free_sp(md_sp_t *spp); 1609 extern int meta_sp_issp(mdsetname_t *sp, mdname_t *np, 1610 md_error_t *ep); 1611 extern int meta_sp_reset(mdsetname_t *sp, mdname_t *np, 1612 mdcmdopts_t options, md_error_t *ep); 1613 extern int meta_sp_reset_component(mdsetname_t *sp, char *name, 1614 mdcmdopts_t options, md_error_t *ep); 1615 extern int meta_sp_attach(mdsetname_t *sp, mdname_t *np, 1616 char *addsize, mdcmdopts_t options, 1617 sp_ext_length_t alignment, md_error_t *ep); 1618 extern int meta_recover_sp(mdsetname_t *sp, mdname_t *np, int argc, 1619 char *argv[], mdcmdopts_t options, md_error_t *ep); 1620 extern boolean_t meta_sp_can_create_sps(mdsetname_t *mdsetnamep, 1621 mdname_t *mdnamep, int number_of_sps, 1622 blkcnt_t sp_size); 1623 extern boolean_t meta_sp_can_create_sps_on_drive(mdsetname_t *mdsetnamep, 1624 mddrivename_t *mddrivenamep, int number_of_sps, 1625 blkcnt_t sp_size); 1626 extern blkcnt_t meta_sp_get_free_space(mdsetname_t *mdsetnamep, 1627 mdname_t *mdnamep); 1628 extern blkcnt_t meta_sp_get_free_space_on_drive(mdsetname_t *mdsetnamep, 1629 mddrivename_t *mddrivenamep); 1630 extern int meta_sp_get_number_of_possible_sps( 1631 mdsetname_t *mdsetnamep, mdname_t *mdnamep, 1632 blkcnt_t sp_size); 1633 extern int meta_sp_get_number_of_possible_sps_on_drive( 1634 mdsetname_t *mdsetnamep, 1635 mddrivename_t *mddrivenamep, blkcnt_t sp_size); 1636 extern blkcnt_t meta_sp_get_possible_sp_size(mdsetname_t *mdsetnamep, 1637 mdname_t *mdnamep, int number_of_sps); 1638 extern blkcnt_t meta_sp_get_possible_sp_size_on_drive( 1639 mdsetname_t *mdsetnamep, 1640 mddrivename_t *mddrivenamep, int number_of_sps); 1641 extern int meta_sp_setstatus(mdsetname_t *sp, minor_t *minors, 1642 int num_units, sp_status_t status, md_error_t *ep); 1643 extern int meta_sp_parsesize(char *s, sp_ext_length_t *szp); 1644 extern int meta_sp_update_abr(mdsetname_t *sp, md_error_t *ep); 1645 extern void *meta_mn_sp_update_abr(void *arg); 1646 1647 /* meta_stat.c */ 1648 extern int meta_stat(const char *, struct stat *); 1649 extern void metaflushstatcache(void); 1650 1651 /* meta_stripe.c */ 1652 extern int meta_stripe_check_component(mdsetname_t *sp, 1653 mdname_t *np, md_dev64_t dev, md_error_t *ep); 1654 extern int meta_stripe_replace(mdsetname_t *sp, mdname_t *stripenp, 1655 mdname_t *oldnp, mdname_t *newnp, 1656 mdcmdopts_t options, md_error_t *ep); 1657 extern int meta_get_stripe_names(mdsetname_t *sp, 1658 mdnamelist_t **nlpp, int options, md_error_t *ep); 1659 extern void meta_free_stripe(md_stripe_t *stripep); 1660 extern md_stripe_t *meta_get_stripe_common(mdsetname_t *sp, 1661 mdname_t *stripenp, int fast, md_error_t *ep); 1662 extern md_stripe_t *meta_get_stripe(mdsetname_t *sp, mdname_t *stripenp, 1663 md_error_t *ep); 1664 extern int meta_check_instripe(mdsetname_t *sp, mdname_t *np, 1665 diskaddr_t slblk, diskaddr_t nblks, md_error_t *ep); 1666 extern int meta_check_component(mdsetname_t *sp, mdname_t *np, 1667 int force, md_error_t *ep); 1668 extern char *comp_state_to_name(md_comp_t *mdcp, 1669 md_timeval32_t *tvp, uint_t tstate); 1670 extern int meta_print_stripe_options(mdhspname_t *hspnamep, 1671 char *fname, FILE *fp, md_error_t *ep); 1672 extern int meta_stripe_print(mdsetname_t *sp, mdname_t *stripenp, 1673 mdnamelist_t **nlpp, char *fname, FILE *fp, 1674 mdprtopts_t options, md_error_t *ep); 1675 extern int meta_find_erred_comp(mdsetname_t *sp, 1676 mdname_t *stripenp, mdname_t **compnpp, 1677 comp_state_t *compstate, md_error_t *ep); 1678 extern int meta_stripe_attach(mdsetname_t *sp, mdname_t *stripenp, 1679 mdnamelist_t *nlp, diskaddr_t interlace, 1680 mdcmdopts_t options, md_error_t *ep); 1681 extern int meta_stripe_get_params(mdsetname_t *sp, 1682 mdname_t *stripenp, ms_params_t *paramsp, 1683 md_error_t *ep); 1684 extern int meta_stripe_set_params(mdsetname_t *sp, 1685 mdname_t *stripenp, ms_params_t *paramsp, 1686 md_error_t *ep); 1687 extern diskaddr_t meta_default_stripe_interlace(void); 1688 extern int meta_stripe_check_interlace(diskaddr_t interlace, 1689 char *uname, md_error_t *ep); 1690 extern int meta_check_stripe(mdsetname_t *sp, 1691 md_stripe_t *stripep, mdcmdopts_t options, 1692 md_error_t *ep); 1693 extern int meta_create_stripe(mdsetname_t *sp, 1694 md_stripe_t *stripep, mdcmdopts_t options, 1695 md_error_t *ep); 1696 extern int meta_init_stripe(mdsetname_t **spp, 1697 int argc, char *argv[], mdcmdopts_t options, 1698 md_error_t *ep); 1699 extern int meta_stripe_reset(mdsetname_t *sp, mdname_t *stripenp, 1700 mdcmdopts_t options, md_error_t *ep); 1701 extern int meta_stripe_anycomp_is_err(mdsetname_t *, 1702 mdnamelist_t *); 1703 1704 /* meta_systemfile.c */ 1705 extern int meta_systemfile_copy(char *sname, int doroot, 1706 int domddb, int doit, int verbose, char **tname, 1707 FILE **tfp, md_error_t *ep); 1708 extern int meta_systemfile_append_mdroot(mdname_t *rootnp, 1709 char *sname, char *tname, FILE *tfp, int ismeta, 1710 int doit, int verbose, md_error_t *ep); 1711 extern int meta_systemfile_append_mddb(char *cname, char *sname, 1712 char *tname, FILE *tfp, int doit, int verbose, 1713 int check, md_error_t *ep); 1714 1715 /* meta_tab.c */ 1716 extern void meta_tab_dump(md_tab_t *tabp, FILE *fp); 1717 extern void meta_tab_free(md_tab_t *tabp); 1718 extern md_tab_t *meta_tab_parse(char *filename, md_error_t *ep); 1719 extern md_tab_line_t *meta_tab_find(mdsetname_t *sp, md_tab_t *tabp, 1720 char *name, mdinittypes_t type); 1721 1722 /* meta_trans.c */ 1723 extern int meta_trans_replace(mdsetname_t *sp, mdname_t *transnp, 1724 mdname_t *oldnp, mdname_t *newnp, 1725 mdcmdopts_t options, md_error_t *ep); 1726 extern int meta_get_trans_names(mdsetname_t *sp, 1727 mdnamelist_t **nlpp, int options, md_error_t *ep); 1728 extern void meta_free_trans(md_trans_t *transp); 1729 extern md_trans_t *meta_get_trans(mdsetname_t *sp, mdname_t *transnp, 1730 md_error_t *ep); 1731 extern md_trans_t *meta_get_trans_common(mdsetname_t *sp, 1732 mdname_t *transnp, int fast, md_error_t *ep); 1733 extern int meta_check_intrans(mdsetname_t *sp, mdname_t *np, 1734 mdchkopts_t options, diskaddr_t slblk, 1735 diskaddr_t nblks, md_error_t *ep); 1736 extern int meta_check_master(mdsetname_t *sp, mdname_t *np, 1737 int force, md_error_t *ep); 1738 extern int meta_check_log(mdsetname_t *sp, mdname_t *np, 1739 md_error_t *ep); 1740 extern char *mt_l_error_to_name(md_trans_t *transp, 1741 md_timeval32_t *tvp, uint_t tstate); 1742 extern char *mt_flags_to_name(md_trans_t *transp, 1743 md_timeval32_t *tvp, uint_t tstate); 1744 extern char *mt_flags_to_action(md_trans_t *transp); 1745 extern char *mt_l_error_to_action( 1746 mdsetname_t *sp, 1747 mdnamelist_t *transnlp, 1748 mdname_t *lognamep, 1749 md_error_t *ep); 1750 extern int meta_trans_print(mdsetname_t *sp, mdname_t *transnp, 1751 mdnamelist_t **nlistpp, char *fname, FILE *fp, 1752 mdprtopts_t options, int *meta_print_trans_msgp, 1753 mdnamelist_t **lognlpp, md_error_t *ep); 1754 extern int meta_logs_print(mdsetname_t *sp, mdnamelist_t *lognlp, 1755 mdnamelist_t **nlistpp, char *fname, FILE *fp, 1756 mdprtopts_t options, md_error_t *ep); 1757 extern int meta_trans_attach(mdsetname_t *sp, mdname_t *transnp, 1758 mdname_t *lognp, mdcmdopts_t options, 1759 md_error_t *ep); 1760 extern int meta_trans_detach(mdsetname_t *sp, mdname_t *transnp, 1761 mdcmdopts_t options, int *delayed, md_error_t *ep); 1762 extern int meta_check_trans(mdsetname_t *sp, md_trans_t *transp, 1763 mdcmdopts_t options, md_error_t *ep); 1764 extern int meta_create_trans(mdsetname_t *sp, md_trans_t *transp, 1765 mdcmdopts_t options, char *uname, md_error_t *ep); 1766 extern int meta_init_trans(mdsetname_t **spp, 1767 int argc, char *argv[], mdcmdopts_t options, 1768 md_error_t *ep); 1769 extern int meta_trans_reset(mdsetname_t *sp, mdname_t *transnp, 1770 mdcmdopts_t options, md_error_t *ep); 1771 1772 /* meta_userflags.c */ 1773 extern int meta_getuserflags(mdsetname_t *sp, mdname_t *np, 1774 uint_t *userflags, md_error_t *ep); 1775 extern int meta_setuserflags(mdsetname_t *sp, mdname_t *np, 1776 uint_t userflags, md_error_t *ep); 1777 1778 /* metarpcopen.c */ 1779 extern CLIENT *meta_client_create_retry(char *hostname, 1780 clnt_create_func_t func, void *data, 1781 time_t tout, md_error_t *ep); 1782 extern CLIENT *meta_client_create(char *host, rpcprog_t prognum, 1783 rpcvers_t version, char *nettype); 1784 extern CLIENT *metarpcopen(char *hostname, long time_out, 1785 md_error_t *ep); 1786 extern void metarpcclose(CLIENT *clntp); 1787 extern void metarpccloseall(void); 1788 extern int cl_sto(CLIENT *clntp, char *hostname, long time_out, 1789 md_error_t *ep); 1790 1791 /* metasplitname.c */ 1792 extern int splitname(char *devname, md_splitname *splitname); 1793 extern char *splicename(md_splitname *splitname); 1794 1795 /* meta_notify.c */ 1796 extern int meta_notify_createq(char *qname, ulong_t flags, 1797 md_error_t *ep); 1798 extern int meta_notify_deleteq(char *qname, md_error_t *ep); 1799 extern int meta_notify_validq(char *qname, md_error_t *ep); 1800 extern int meta_notify_listq(char ***qnames, md_error_t *ep); 1801 extern int meta_notify_flushq(char *qname, md_error_t *ep); 1802 1803 extern int meta_notify_getev(char *qname, ulong_t flags, 1804 md_ev_t *evp, md_error_t *ep); 1805 extern int meta_notify_getevlist(char *qname, ulong_t flags, 1806 md_evlist_t **evlpp, md_error_t *ep); 1807 extern int meta_notify_putev(md_ev_t *evp, md_error_t *ep); 1808 extern int meta_notify_putevlist(md_evlist_t *evlistp, 1809 md_error_t *ep); 1810 extern void meta_notify_freeevlist(md_evlist_t *evlp); 1811 1812 extern int meta_notify_sendev(ev_obj_t tag, set_t set, 1813 md_dev64_t dev, evid_t event); 1814 1815 extern int meta_exchange(mdsetname_t *, mdname_t *, mdname_t *, 1816 mdcmdopts_t, md_error_t *); 1817 extern int meta_rename(mdsetname_t *, mdname_t *, mdname_t *, 1818 mdcmdopts_t, md_error_t *); 1819 /* meta_se_notify.c */ 1820 extern void meta_svm_sysevent(char *se_class, char *se_subclass, 1821 uint32_t tag, set_t setno, md_dev64_t devid); 1822 1823 /* metgetroot.c */ 1824 extern void *meta_get_current_root(md_error_t *ep); 1825 extern mdname_t *meta_get_current_root_dev(mdsetname_t *sp, 1826 md_error_t *ep); 1827 1828 /* meta_time.c */ 1829 extern int meta_gettimeofday(md_timeval32_t *tv); 1830 1831 /* meta_devadm.c */ 1832 extern int meta_update_namespace(set_t setno, side_t sideno, 1833 char *devname, md_dev64_t dev, mdkey_t key, 1834 char *pname, md_error_t *ep); 1835 extern int meta_fixdevid(mdsetname_t *sp, mddevopts_t options, 1836 char *diskname, md_error_t *ep); 1837 extern int meta_upd_ctdnames(mdsetname_t **sp, set_t setno, 1838 side_t sideno, mddrivename_t *dnp, char **newname, 1839 md_error_t *ep); 1840 extern int pathname_reload(mdsetname_t **sp, set_t setno, 1841 md_error_t *ep); 1842 extern int meta_update_devtree(minor_t mnum); 1843 1844 /* meta_mn_comm.c */ 1845 extern int mdmn_send_message(set_t setno, md_mn_msgtype_t type, 1846 uint_t flags, char *data, int size, 1847 md_mn_result_t **resp, md_error_t *ep); 1848 extern int mdmn_send_message_with_msgid(set_t setno, 1849 md_mn_msgtype_t type, uint_t flags, char *data, 1850 int size, md_mn_result_t **resp, 1851 md_mn_msgid_t *msgid, md_error_t *ep); 1852 extern int mdmn_create_msgid(md_mn_msgid_t *id); 1853 extern int mdmn_reinit_set(set_t setno, long timeout); 1854 extern int mdmn_resume(set_t setno, md_mn_msgclass_t class, 1855 uint_t flags, long timeout); 1856 extern int mdmn_suspend(set_t setno, md_mn_msgclass_t class, 1857 long timeout); 1858 extern int mdmn_msgtype_lock(md_mn_msgtype_t msgtype, 1859 uint_t locktype); 1860 extern void mdmn_abort(void); 1861 extern md_mn_result_t *copy_result(md_mn_result_t *res); 1862 extern void free_result(md_mn_result_t *res); 1863 extern md_mn_msg_t *copy_msg(md_mn_msg_t *src, md_mn_msg_t *dest); 1864 1865 /* meta_import.c */ 1866 extern int read_master_block(md_error_t *ep, int fd, void *bp, 1867 int bsize); 1868 extern int read_database_block(md_error_t *, int, mddb_mb_t *, int, 1869 void *, int); 1870 extern daddr_t getphysblk(mddb_block_t, mddb_mb_t *); 1871 1872 extern md_im_drive_info_t *pick_good_disk(md_im_set_desc_t *misp); 1873 1874 extern void meta_unrslv_replicated_mb(mdsetname_t *sp, 1875 md_drive_desc *dd, mddrivenamelist_t *dnlp, 1876 md_error_t *ep); 1877 extern void meta_unrslv_replicated_nm(mdsetname_t *sp, 1878 md_drive_desc *dd, mddrivenamelist_t *dnlp, 1879 md_error_t *ep); 1880 extern void * replicated_list_lookup(uint_t devid_len, 1881 void *old_devid); 1882 extern int build_replicated_disks_list(md_error_t *ep, 1883 mddrivenamelist_t *dnlp); 1884 1885 /* 1886 * pnm_rec is used to store the mapping from keys in the NM namespace 1887 * to actual physical devices. The current name of a physical device, used 1888 * by a set that can be imported, can be retrieved by matching the did_key 1889 * (deviceID entry) in the DID_SHR_NM namespace to the min_devid_key in the 1890 * DID_NM namespace(the did_key to the min_key). Then matching the min_key 1891 * in the DID_NM namespace to the n_key in the NM namespace. 1892 * 1893 * n_name is defined to be an array, so that only one malloc is needed for the 1894 * entire datastructure. 1895 */ 1896 typedef struct pnm_rec { 1897 mdkey_t n_key; /* The n_key/min_key value */ 1898 struct pnm_rec *next; 1899 ushort_t n_namlen; 1900 char n_name[1]; /* The name of the physical device */ 1901 } pnm_rec_t; 1902 1903 /* Indentation value for metaimport output */ 1904 #define META_INDENT 4 1905 1906 /* Flags for metaimport reporting */ 1907 #define META_IMP_REPORT 0x0001 1908 #define META_IMP_VERBOSE 0x0002 1909 #define META_IMP_PASS1 0x1000 1910 1911 extern int meta_list_disks(md_error_t *, md_im_names_t *); 1912 extern mddrivenamelist_t *meta_prune_cnames(md_error_t *, 1913 md_im_names_t *, int); 1914 extern int meta_get_and_report_set_info( 1915 mddrivenamelist_t *, md_im_set_desc_t **, 1916 int, uint_t, int *, int, 1917 md_im_drive_info_t *, md_error_t *); 1918 extern void free_pnm_rec_list(pnm_rec_t **); 1919 extern int meta_imp_set(md_im_set_desc_t *, 1920 char *, int, bool_t, md_error_t *); 1921 extern int meta_imp_drvused(mdsetname_t *sp, 1922 mddrivename_t *dnp, md_error_t *ep); 1923 extern int meta_replica_quorum(md_im_set_desc_t *misp); 1924 extern int meta_imp_set_adddrives(mdsetname_t *sp, 1925 mddrivenamelist_t *dnlp, 1926 md_im_set_desc_t *misp, md_error_t *ep); 1927 extern void meta_free_im_set_desc(md_im_set_desc_t *misp); 1928 extern int clnt_imp_adddrvs(char *hostname, 1929 mdsetname_t *sp, md_drive_desc *dd, 1930 md_timeval32_t timestamp, 1931 ulong_t genid, md_error_t *ep); 1932 1933 /* Flags for direction in copy_msg_1 */ 1934 #define MD_MN_COPY_TO_ONDISK 0x0001 1935 #define MD_MN_COPY_TO_INCORE 0x0002 1936 1937 extern void copy_msg_1(md_mn_msg_t *incorep, 1938 md_mn_msg_od_t *ondiskp, int direction); 1939 extern void free_msg(md_mn_msg_t *msg); 1940 1941 extern md_mn_msgclass_t mdmn_get_message_class(md_mn_msgtype_t msgtype); 1942 extern void (*mdmn_get_handler(md_mn_msgtype_t msgtype)) 1943 (md_mn_msg_t *msg, uint_t flags, 1944 md_mn_result_t *res); 1945 extern int (*mdmn_get_submessage_generator(md_mn_msgtype_t type)) 1946 (md_mn_msg_t *msg, md_mn_msg_t **msglist); 1947 extern time_t mdmn_get_timeout(md_mn_msgtype_t msgtype); 1948 1949 extern int meta_read_nodelist(int *nodecnt, 1950 mndiskset_membershiplist_t **nl, md_error_t *ep); 1951 extern int meta_write_nodelist(int nodecnt, char **nids, 1952 md_error_t *ep); 1953 extern void meta_free_nodelist(mndiskset_membershiplist_t *nl); 1954 1955 /* meta_mn_subr.c */ 1956 /* defines for flags argument for meta_mn_send_command() */ 1957 #define MD_DISP_STDERR 0x0000 1958 #define MD_IGNORE_STDERR 0x0001 1959 #define MD_DRYRUN 0x0002 1960 #define MD_RETRY_BUSY 0x0004 1961 #define MD_NOLOG 0x0008 1962 #define MD_PANIC_WHEN_INCONSISTENT 0x0010 1963 1964 /* define for initall_context argument for meta_mn_send_command() */ 1965 #define NO_CONTEXT_STRING NULL 1966 1967 extern int meta_is_mn_set(mdsetname_t *sp, md_error_t *ep); 1968 extern int meta_is_mn_name(mdsetname_t **sp, char *name, 1969 md_error_t *ep); 1970 extern void meta_ping_mnset(set_t setno); 1971 extern int meta_mn_send_command(mdsetname_t *sp, int argc, 1972 char *argv[], int flags, char *initall_context, 1973 md_error_t *ep); 1974 extern int meta_mn_send_suspend_writes(minor_t mnum, 1975 md_error_t *ep); 1976 extern int meta_mn_send_setsync(mdsetname_t *sp, 1977 mdname_t *mirnp, daddr_t size, md_error_t *ep); 1978 extern int meta_mn_send_metaclear_command(mdsetname_t *sp, 1979 char *name, mdcmdopts_t options, int pflag, 1980 md_error_t *ep); 1981 extern int meta_mn_send_resync_starting(mdname_t *mirnp, 1982 md_error_t *ep); 1983 extern int meta_mn_change_owner(md_set_mmown_params_t **opp, 1984 set_t setno, uint_t mnum, uint_t owner, 1985 uint_t flags); 1986 extern int meta_mn_singlenode(void); 1987 extern int meta_mn_send_get_tstate(md_dev64_t dev, uint_t *tstatep, 1988 md_error_t *ep); 1989 /* meta_set_prv.c */ 1990 extern int setup_db_bydd(mdsetname_t *sp, md_drive_desc *dd, 1991 int force, md_error_t *ep); 1992 extern int snarf_set(mdsetname_t *sp, bool_t stale_bool, 1993 md_error_t *ep); 1994 extern int halt_set(mdsetname_t *sp, md_error_t *ep); 1995 1996 /* meta_statconcise.c */ 1997 extern void print_concise_entry(int indent, char *name, 1998 diskaddr_t size, char mtype); 1999 extern char *meta_get_raid_col_state(rcs_state_t); 2000 extern char *meta_get_stripe_state(comp_state_t); 2001 extern char *meta_get_hs_state(hotspare_states_t); 2002 extern int report_metastat_info(mddb_mb_t *, mddb_lb_t *, 2003 mddb_rb_t *, pnm_rec_t **, mdname_t *, int, 2004 md_timeval32_t *, md_error_t *); 2005 2006 #ifdef __cplusplus 2007 } 2008 #endif 2009 2010 #endif /* _META_H */ 2011