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 %/* 23 % * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24 % * Use is subject to license terms. 25 % */ 26 % 27 %#pragma ident "%Z%%M% %I% %E% SMI" 28 % 29 %/* 30 % * MDD interface definitions 31 % */ 32 33 %/* pick up multihost ioctl definitions */ 34 %#include <sys/lvm/md_mhdx.h> 35 %/* get the basic XDR types */ 36 %#include <sys/lvm/md_basic.h> 37 %/* pick up device id information */ 38 %#include <sys/dditypes.h> 39 40 %#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 41 %/* 42 % * NOTE: can't change these structures so make sure they are packed 43 % * in the kernel. 44 % */ 45 %#pragma pack(4) 46 %#endif 47 % 48 %/* 49 % * fundamental types 50 % */ 51 % 52 %/* 53 % * 54 % * NOTE: THESE ARE ON-DISK VALUES DO NOT CHANGE THE ORDER 55 % */ 56 enum mddb_type_t { 57 MDDB_ALL, 58 MDDB_NM_HDR, 59 MDDB_NM, 60 MDDB_SHR_NM, 61 MDDB_VTOC, 62 MDDB_USER, 63 MDDB_DID_NM_HDR, 64 MDDB_DID_NM, 65 MDDB_DID_SHR_NM, 66 MDDB_EFILABEL, 67 MDDB_FIRST_MODID = 1000 68 }; 69 70 % 71 %/* 72 % * Configuration commands. 73 % */ 74 enum mddb_cfgcmd_t { 75 MDDB_USEDEV, 76 MDDB_NEWDEV, 77 MDDB_DELDEV, 78 MDDB_GETDEV, 79 MDDB_ENDDEV, 80 MDDB_GETDRVRNAME, 81 MDDB_RELEASESET, 82 MDDB_NEWSIDE, 83 MDDB_DELSIDE, 84 MDDB_SETDID, 85 MDDB_LBINITTIME 86 }; 87 88 % 89 %/* 90 % * Return codes from DB record operations. 91 % */ 92 enum mddb_recstatus_t { 93 MDDB_NORECORD, 94 MDDB_NODATA, 95 MDDB_OK, 96 MDDB_STALE 97 }; 98 99 % 100 %/* 101 % * Commands for DB accesses from user land. 102 % */ 103 enum mddb_usercmd_t { 104 MD_DB_GETNEXTREC, 105 MD_DB_COMMIT_ONE, 106 MD_DB_COMMIT_MANY, 107 MD_DB_GETDATA, 108 MD_DB_DELETE, 109 MD_DB_CREATE, 110 MD_DB_GETSTATUS, 111 MD_DB_GETSIZE, 112 MD_DB_SETDATA, 113 MD_DB_MAKEID 114 }; 115 116 % 117 %/* 118 % * MDDB_USER record subtypes, set records and drive records. 119 % * Node records (NR) used for Multinode Disksets. 120 % * The MDDB_UR_SR record subtype is associated with the structures 121 % * md_set_record and md_mnset_record. 122 % * The MDDB_UR_DR record subtype is associated with the structure 123 % * md_drive_record. 124 % * The MDDB_NR_DR record subtype is associated with the structure 125 % * md_mnnode_record. 126 % * The MDDB_UR_LR record subtype is associated with the structure 127 % * md_mn_changelog_record_t 128 % */ 129 enum mddb_userrec_t { 130 MDDB_UR_ALL, 131 MDDB_UR_SR, 132 MDDB_UR_DR, 133 MDDB_UR_NR, 134 MDDB_UR_LR 135 }; 136 137 % 138 %/* 139 % * MDDB_USER record get commands. 140 % */ 141 enum md_ur_get_cmd_t { 142 MD_UR_GET_NEXT, 143 MD_UR_GET_WKEY 144 }; 145 146 % 147 %/* 148 % * These are the options for mddb_createrec() 149 % */ 150 enum md_create_rec_option_t { 151 MD_CRO_NOOPT = 0x000, 152 MD_CRO_OPTIMIZE = 0x001, 153 MD_CRO_32BIT = 0x002, 154 MD_CRO_64BIT = 0x004, 155 MD_CRO_STRIPE = 0x008, 156 MD_CRO_MIRROR = 0x010, 157 MD_CRO_RAID = 0x020, 158 MD_CRO_SOFTPART = 0x040, 159 MD_CRO_TRANS_MASTER = 0x080, 160 MD_CRO_TRANS_LOG = 0x100, 161 MD_CRO_HOTSPARE = 0x200, 162 MD_CRO_HOTSPARE_POOL = 0x400, 163 MD_CRO_CHANGELOG = 0x800, 164 MD_CRO_FN = 0x1000 165 }; 166 167 % 168 %/* 169 % * This SKEW value is used to skew the sideno of 170 % * the share device names that are put into each 171 % * local set's namespace. This will prevent the 172 % * wrong name to be picked up via a devno, when 173 % * we really wanted a local device name. 174 % */ 175 const SKEW = 1; 176 177 #ifdef RPC_XDR 178 % 179 %/* Start - Avoid duplicate definitions, but get the xdr calls right */ 180 %#if 0 181 #include "meta_arr.x" 182 %#endif /* 0 */ 183 %/* End - Avoid duplicate definitions, but get the xdr calls right */ 184 % 185 #endif /* RPC_XDR */ 186 187 const MD_DRIVE_RECORD_REVISION = 0x00010000; 188 189 #ifdef RPC_HDR 190 % 191 %#define MD_DR_ADD 0x00000001U 192 %#define MD_DR_DEL 0x00000002U 193 %#define MD_DR_FIX_MB_DID 0x10000000U /* Fix MB */ 194 %#define MD_DR_FIX_LB_NM_DID 0x20000000U /* Fix LB and namespaces */ 195 %#define MD_DR_UNRSLV_REPLICATED 0x40000000U 196 %#define MD_DR_OK 0x80000000U 197 #endif /* RPC_HDR */ 198 199 #if !defined(_KERNEL) 200 struct md_drive_record { 201 u_int dr_revision; /* revision level */ 202 u_int dr_flags; /* state flags */ 203 mddb_recid_t dr_selfid; /* db record id */ 204 md_timeval32_t dr_ctime; /* creation timestamp */ 205 u_long dr_genid; /* generation id */ 206 md_drive_record *dr_next; /* next ptr (Incore) */ 207 mddb_recid_t dr_nextrec; /* next record id */ 208 int dr_dbcnt; /* # of replica's */ 209 int dr_dbsize; /* replica size */ 210 mdkey_t dr_key; /* namespace key */ 211 }; 212 #else /* _KERNEL */ 213 struct md_drive_record { 214 u_int dr_revision; /* revision level */ 215 u_int dr_flags; /* state flags */ 216 mddb_recid_t dr_selfid; /* db record id */ 217 md_timeval32_t dr_ctime; /* creation timestamp */ 218 u_int dr_genid; /* generation id */ 219 u_int dr_next; /* next ptr (Incore) */ 220 mddb_recid_t dr_nextrec; /* next record id */ 221 int dr_dbcnt; /* # of replica's */ 222 int dr_dbsize; /* replica size */ 223 mdkey_t dr_key; /* namespace key */ 224 }; 225 #endif /* !_KERNEL */ 226 227 #ifdef RPC_HDR 228 %/* 229 % * Actions that can be taken on a node record. 230 % * Used with routine upd_nr_flags. 231 % */ 232 % 233 %#define MD_NR_JOIN 0x00000001U /* Turn on JOIN flag */ 234 %#define MD_NR_WITHDRAW 0x00000002U /* Turn off JOIN flag */ 235 %#define MD_NR_SET 0x00000004U /* Set node flags in nodelist */ 236 %#define MD_NR_DEL 0x00000008U /* reset OK flag, set DEL */ 237 %#define MD_NR_OK 0x80000000U /* set OK flag; reset ADD */ 238 #endif /* RPC_HDR */ 239 240 struct md_mnnode_record { 241 u_int nr_revision; /* revision level */ 242 u_int nr_flags; /* state flags */ 243 mddb_recid_t nr_selfid; /* db record id */ 244 md_timeval32_t nr_ctime; /* creation timestamp */ 245 u_long nr_genid; /* generation id */ 246 md_mnnode_record *nr_next; /* next ptr (Incore) */ 247 mddb_recid_t nr_nextrec; /* next node rec id */ 248 u_int nr_nodeid; /* node id */ 249 md_node_nm_t nr_nodename; /* node name */ 250 251 }; 252 253 const MD_MNNODE_RECORD_REVISION = 0x00000100; 254 255 const MD_SET_RECORD_REVISION = 0x00010000; 256 257 #ifdef RPC_HDR 258 % 259 %#define MD_SR_ADD 0x00000001U 260 %#define MD_SR_DEL 0x00000002U 261 %#define MD_SR_CHECK 0x00000004U 262 %#define MD_SR_CVT 0x00000008U 263 %#define MD_SR_LOCAL 0x00000010U 264 %#define MD_SR_UNRSLV_REPLICATED 0x08000000U 265 %#define MD_SR_MB_DEVID 0x10000000U 266 %#define MD_SR_AUTO_TAKE 0x20000000U 267 %#define MD_SR_MN 0x40000000U 268 %#define MD_SR_OK 0x80000000U 269 %#define MD_SR_STATE_FLAGS (MD_SR_ADD | \ 270 % MD_SR_DEL | \ 271 % MD_SR_CHECK | \ 272 % MD_SR_CVT | \ 273 % MD_SR_UNRSLV_REPLICATED | \ 274 % MD_SR_OK) 275 #endif /* RPC_HDR */ 276 277 #if !defined(_KERNEL) 278 struct md_set_record { 279 u_int sr_revision; /* revision level */ 280 u_int sr_flags; /* state flags */ 281 mddb_recid_t sr_selfid; /* db record id */ 282 #ifdef RPC_HDR 283 md_set_record *sr_next; /* next ptr (Incore) */ 284 #endif /* RPC_HDR */ 285 set_t sr_setno; /* set number */ 286 md_set_nm_t sr_setname; /* setname */ 287 md_timeval32_t sr_ctime; /* creation timestamp */ 288 u_long sr_genid; /* generation id */ 289 md_node_nm_arr_t sr_nodes; /* array of nodenames */ 290 md_drive_record *sr_drivechain; /* dr list (Incore) */ 291 mddb_recid_t sr_driverec; /* first dr record id */ 292 mhd_mhiargs_t sr_mhiargs; /* MH ioctl timeouts */ 293 md_h_arr_t sr_med; /* Mediator hosts */ 294 }; 295 #else /* _KERNEL */ 296 struct md_set_record { 297 u_int sr_revision; /* revision level */ 298 u_int sr_flags; /* state flags */ 299 mddb_recid_t sr_selfid; /* db record id */ 300 #ifdef RPC_HDR 301 u_int sr_next; /* next ptr (Incore) */ 302 #endif /* RPC_HDR */ 303 set_t sr_setno; /* set number */ 304 md_set_nm_t sr_setname; /* setname */ 305 md_timeval32_t sr_ctime; /* creation timestamp */ 306 u_int sr_genid; /* generation id */ 307 md_node_nm_arr_t sr_nodes; /* array of nodenames */ 308 u_int sr_drivechain; /* dr list (Incore) */ 309 mddb_recid_t sr_driverec; /* first dr record id */ 310 mhd_mhiargs_t sr_mhiargs; /* MH ioctl timeouts */ 311 md_h_arr_t sr_med; /* Mediator hosts */ 312 }; 313 #endif /* !_KERNEL */ 314 315 struct md_mnset_record { 316 u_int sr_revision; /* revision level */ 317 u_int sr_flags; /* state flags */ 318 mddb_recid_t sr_selfid; /* db record id */ 319 #ifdef RPC_HDR 320 md_set_record *sr_next; /* next ptr (Incore) */ 321 #endif /* RPC_HDR */ 322 set_t sr_setno; /* set number */ 323 md_set_nm_t sr_setname; /* setname */ 324 md_timeval32_t sr_ctime; /* creation timestamp */ 325 u_long sr_genid; /* generation id */ 326 md_node_nm_arr_t sr_nodes_bw_compat; /* for compat with */ 327 /* md_set_record, */ 328 /* first node always */ 329 /* this node */ 330 md_drive_record *sr_drivechain; /* dr list (Incore) */ 331 mddb_recid_t sr_driverec; /* first dr record id */ 332 mhd_mhiargs_t sr_mhiargs; /* MH ioctl timeouts */ 333 md_h_arr_t sr_med; /* Mediator hosts */ 334 md_mnnode_record *sr_nodechain; /* node list (incore) */ 335 mddb_recid_t sr_noderec; /* first node rec id */ 336 md_node_nm_t sr_master_nodenm; /* Master nm (incore) */ 337 u_int sr_master_nodeid; /* Master id (incore) */ 338 u_int sr_mddb_min_size; /* min size of mddb */ 339 }; 340 341 #ifdef RPC_HDR 342 % 343 %#define MD_SETOWNER_NO 0 344 %#define MD_SETOWNER_YES 1 345 %#define MD_SETOWNER_NONE 2 346 #endif /* RPC_HDR */ 347 348 % 349 %/* Gate key type */ 350 struct md_setkey_t { 351 string sk_host<>; 352 set_t sk_setno; 353 string sk_setname<>; 354 md_timeval32_t sk_key; 355 #ifdef RPC_HDR 356 struct md_setkey_t *sk_next; 357 #endif /* RPC_HDR */ 358 }; 359 360 % 361 %/* metadevice ID */ 362 typedef minor_t unit_t; 363 364 % 365 %/* component ID */ 366 struct comp_t { 367 minor_t mnum; /* associated metadevice */ 368 md_dev64_t dev; 369 }; 370 371 % 372 %/* hotspare pool ID */ 373 typedef u_int hsp_t; 374 375 #ifdef RPC_HDR 376 % 377 %#define MD_HSP_NONE ((hsp_t)~0U) 378 #endif /* RPC_HDR */ 379 380 % 381 %/* hotspare ID */ 382 struct hs_t { 383 hsp_t hsp; /* associated hotspare pool */ 384 md_dev64_t dev; /* device ID */ 385 }; 386 387 % 388 %/* mnum or hsp */ 389 typedef u_int minor_or_hsp_t; 390 391 % 392 %/* 393 % * name service stuff 394 % */ 395 const MD_MAXPREFIX = 127; 396 % 397 %#define MD_MAX_CTDLEN 64 398 399 struct md_name_prefix { 400 u_char pre_len; 401 char pre_data[MD_MAXPREFIX]; 402 }; 403 404 const MD_MAXSUFFIX = 40; 405 % 406 struct md_name_suffix { 407 u_char suf_prefix; 408 u_char suf_len; 409 char suf_data[MD_MAXSUFFIX]; 410 }; 411 412 struct md_splitname { 413 md_name_prefix sn_prefix; 414 md_name_suffix sn_suffix; 415 }; 416 417 #ifdef RPC_HDR 418 % 419 %#define SPN_PREFIX(spn) ((spn)->sn_prefix) 420 %#define SPN_SUFFIX(spn) ((spn)->sn_suffix) 421 #endif /* RPC_HDR */ 422 423 % 424 %/* 425 % * Number of bits to represent a setno 426 % * this gives us all info to define masks and shifts ... 427 % * Also used for minor #, hsp id, recid mask and shifts. 428 % */ 429 const MD_BITSSET = 5; 430 const MD_DEFAULTSETS = 4; 431 % 432 #ifdef RPC_HDR 433 % 434 %#define MD_MAXSETS (1 << MD_BITSSET) 435 %#define MD_SETMASK (MD_MAXSETS - 1) 436 #endif /* RPC_HDR */ 437 438 % 439 %/* 440 % * Define a file descriptor for lockfd 441 % * when the lock is not held. 442 % */ 443 const MD_NO_LOCK = -2; 444 445 % 446 %/* 447 % * accumulated setname 448 % */ 449 struct mdsetname_t { 450 string setname<>; /* logical name */ 451 set_t setno; /* set number */ 452 #ifdef RPC_HDR 453 struct md_set_desc *setdesc; /* Cache set/drive desc */ 454 int lockfd; /* used by meta_lock_* */ 455 #endif /* RPC_HDR */ 456 }; 457 458 struct mdsetnamelist_t { 459 mdsetnamelist_t *next; 460 mdsetname_t *sp; 461 }; 462 463 % 464 %/* 465 % * device name 466 % */ 467 #ifdef RPC_HDR 468 %#define MD_FULLNAME_ONLY 0x0 469 %#define MD_BASICNAME_OK 0x1 470 %#define MD_BYPASS_DAEMON 0x2 471 % 472 %#define MD_SLICE0 0 473 %#define MD_SLICE6 6 474 %#define MD_SLICE7 7 475 % 476 %#define MD_MAX_PARTS 17 477 #endif /* RPC_HDR */ 478 479 struct mdname_t { 480 #ifdef RPC_HDR 481 struct mddrivename_t *drivenamep; /* back pointer to drive */ 482 #endif /* RPC_HDR */ 483 string cname<>; /* cannonical name */ 484 string bname<>; /* block name */ 485 string rname<>; /* raw name */ 486 string devicesname<>; /* /devices name (or NULL) */ 487 string minor_name<>; /* minor name with respect to devid */ 488 md_dev64_t dev; /* major/minor (or NODEV64) */ 489 #ifdef RPC_HDR 490 mdkey_t key; /* namespace key (or MD_KEYBAD) */ 491 #endif /* RPC_HDR */ 492 diskaddr_t end_blk; /* end of database replicas (or -1) */ 493 diskaddr_t start_blk; /* usable start block (or -1) */ 494 }; 495 496 %/* name structure (old style) */ 497 struct o_mdname_t { 498 #ifdef RPC_HDR 499 struct o_mddrivename_t *drivenamep; /* back pointer to drive */ 500 #endif /* RPC_HDR */ 501 string cname<>; /* cannonical name */ 502 string bname<>; /* block name */ 503 string rname<>; /* raw name */ 504 string devicesname<>; /* /devices name (or NULL) */ 505 dev_t dev; /* major/minor (or NODEV64) */ 506 #ifdef RPC_HDR 507 mdkey_t key; /* namespace key (or MD_KEYBAD) */ 508 #endif /* RPC_HDR */ 509 daddr_t end_blk; /* end of database replicas (or -1) */ 510 daddr_t start_blk; /* usable start block (or -1) */ 511 }; 512 513 struct mdnamelist_t { 514 mdnamelist_t *next; 515 mdname_t *namep; 516 }; 517 518 % 519 %/* 520 % * drive name 521 % */ 522 %/* name types */ 523 enum mdnmtype_t { 524 MDT_UNKNOWN = 0, /* unknown type */ 525 MDT_ACCES, /* could not access device */ 526 MDT_META, /* metadevice name */ 527 MDT_COMP, /* regular device name */ 528 MDT_FAST_META, /* metadevice name (partial) */ 529 MDT_FAST_COMP /* regular device name (partial) */ 530 }; 531 532 %/* metadevice types */ 533 enum md_types_t { 534 MD_UNDEFINED = 0, 535 MD_DEVICE, 536 MD_METAMIRROR, 537 MD_METATRANS, 538 MD_METARAID, 539 MD_METASP 540 }; 541 542 %/* SVM general device types 543 % * 544 % * META_DEVICE refers to any SVM metadevice 545 % * LOGICAL_DEVICE refers to any underlying physical device 546 % * HSP_DEVICE refers to a hotspare pool 547 % * 548 % * In the past, the device type can be determined via 549 % * the device name (such as d10, c1t1d1s1). With 550 % * the friendly name implementation, it is not possible 551 % * to determine from the device name. In the code, 552 % * whereever the device type is obvious that type will be 553 % * used explicitly otherwise 'UNKNOWN' will be used and 554 % * specific SVM lookup routines will be called to determine 555 % * the device type associated with the name. 556 % */ 557 enum meta_device_type_t { 558 UNKNOWN = 0, 559 META_DEVICE, 560 HSP_DEVICE, 561 LOGICAL_DEVICE 562 }; 563 564 #ifdef RPC_HDR 565 % 566 %/* misc module names */ 567 %/* When modifying this list also update meta_names in md_names.c */ 568 %#define MD_STRIPE "md_stripe" 569 %#define MD_MIRROR "md_mirror" 570 %#define MD_TRANS "md_trans" 571 %#define MD_HOTSPARES "md_hotspares" 572 %#define MD_RAID "md_raid" 573 %#define MD_VERIFY "md_verify" 574 %#define MD_SP "md_sp" 575 %#define MD_NOTIFY "md_notify" 576 #endif /* RPC_HDR */ 577 578 %/* generic device info */ 579 struct mdgeom_t { 580 u_int ncyl; 581 u_int nhead; 582 u_int nsect; 583 u_int rpm; 584 u_int write_reinstruct; 585 u_int read_reinstruct; 586 u_int blk_sz; 587 }; 588 589 %/* generic device info (old style) */ 590 struct o_mdgeom_t { 591 u_int ncyl; 592 u_int nhead; 593 u_int nsect; 594 u_int rpm; 595 u_int write_reinstruct; 596 u_int read_reinstruct; 597 }; 598 599 struct mdcinfo_t { 600 char cname[16]; /* controller driver name */ 601 mhd_ctlrtype_t ctype; /* controller type */ 602 u_int cnum; /* controller instance */ 603 u_int tray; /* SSA100 tray */ 604 u_int bus; /* SSA100 bus */ 605 u_longlong_t wwn; /* SSA100 World Wide Name */ 606 char dname[16]; /* disk driver name */ 607 u_int unit; /* disk instance */ 608 u_int maxtransfer; /* max I/O size (in blocks) */ 609 }; 610 611 struct mdpart_t { 612 diskaddr_t start; /* start block */ 613 diskaddr_t size; /* size of partition (in blocks) */ 614 u_short tag; /* ID tag of partition */ 615 u_short flag; /* permission flags */ 616 diskaddr_t label; /* size of disk label (or 0) */ 617 }; 618 619 %/* partition information (old style) */ 620 struct o_mdpart_t { 621 daddr_t start; /* start block */ 622 daddr_t size; /* size of partition (in blocks) */ 623 u_short tag; /* ID tag of partition */ 624 u_short flag; /* permission flags */ 625 daddr_t label; /* size of disk label (or 0) */ 626 }; 627 628 struct mdvtoc_t { 629 u_int nparts; 630 diskaddr_t first_lba; /* for efi devices only */ 631 diskaddr_t last_lba; /* for efi devices only */ 632 diskaddr_t lbasize; /* for efi devices only */ 633 mdpart_t parts[MD_MAX_PARTS]; /* room for i386 too */ 634 char *typename; /* disk type (or NULL) */ 635 }; 636 637 %/* vtoc information (old style) */ 638 struct o_mdvtoc_t { 639 char *typename; /* disk type (or NULL) */ 640 u_int nparts; 641 o_mdpart_t parts[16]; /* room for i386 too */ 642 }; 643 % 644 %/* 645 % * List of drivename cnames per side, 646 % * also the driver name, mnum (for slice 7). 647 % */ 648 struct mdsidenames_t { 649 mdsidenames_t *next; 650 side_t sideno; 651 minor_t mnum; 652 string dname<>; 653 string cname<>; 654 }; 655 656 struct mddrivename_t { 657 #ifdef RPC_HDR 658 /* 659 * the following string is not used but is left in place so that 660 * it is not necessary to version the rpc interface that passes 661 * this structure. 662 */ 663 string not_used<>; 664 #endif /* RPC_HDR */ 665 string cname<>; /* canonical drive name */ 666 string rname<>; /* raw name */ 667 mdnmtype_t type; /* type of drive */ 668 string devid<>; /* Device Id of the drive */ 669 int errnum; /* errno for type == MDT_ACCES */ 670 mdgeom_t geom; /* disk geometry */ 671 mdcinfo_t cinfo; /* controller info */ 672 mdvtoc_t vtoc; /* volume table of contents info */ 673 mdname_t parts<>; /* partitions in drive */ 674 mdsidenames_t *side_names; /* list of names per side */ 675 mdkey_t side_names_key; /* key used to store the side names*/ 676 677 string miscname<>; /* metadevice misc name */ 678 #ifdef RPC_HDR 679 struct md_common_t *unitp; /* metadevice unit structure */ 680 #endif /* RPC_HDR */ 681 }; 682 683 %/* 684 % * old version of mddrivename_t that contains an old version of mdgeom_t, 685 % * mdvtoc_t and mdname_t (prefixed _o). 686 % */ 687 struct o_mddrivename_t { 688 #ifdef RPC_HDR 689 string cachenm<>; /* name used for cache lookups */ 690 #endif /* RPC_HDR */ 691 string cname<>; /* canonical drive name */ 692 string rname<>; /* raw name */ 693 mdnmtype_t type; /* type of drive */ 694 int errnum; /* errno for type == MDT_ACCES */ 695 o_mdgeom_t geom; /* disk geometry (old style) */ 696 mdcinfo_t cinfo; /* controller info */ 697 o_mdvtoc_t vtoc; /* vtoc info (old style) */ 698 o_mdname_t parts<>; /* partitions in drive (old style) */ 699 mdsidenames_t *side_names; /* list of names per side */ 700 mdkey_t side_names_key; /* key used to store the side names*/ 701 702 string miscname<>; /* metadevice misc name */ 703 #ifdef RPC_HDR 704 struct md_common_t *unitp; /* metadevice unit structure */ 705 #endif /* RPC_HDR */ 706 }; 707 struct mddrivenamelist_t { 708 mddrivenamelist_t *next; 709 mddrivename_t *drivenamep; 710 }; 711 712 % 713 %/* 714 % * replica struct 715 % */ 716 typedef u_int replica_flags_t; 717 #ifdef RPC_HDR 718 % 719 %#define MDDB_F_EREAD 0x00001 /* a read error occurred */ 720 %#define MDDB_F_TOOSMALL 0x00002 /* replica is too small to hold db */ 721 %#define MDDB_F_EFMT 0x00004 /* something is wrong with the data */ 722 %#define MDDB_F_EDATA 0x00008 /* error in data blocks */ 723 %#define MDDB_F_EMASTER 0x00010 /* error in master block(s) */ 724 %#define MDDB_F_ACTIVE 0x00020 /* this replica is currently in use */ 725 %#define MDDB_F_EWRITE 0x00040 /* a write error occurred */ 726 %#define MDDB_F_MASTER 0x00080 /* the copy which was used as input */ 727 %#define MDDB_F_SUSPECT 0x00100 /* replica write ability is suspect */ 728 %#define MDDB_F_PTCHED 0x00400 /* db location was patched in kernel */ 729 %#define MDDB_F_IOCTL 0x00800 /* db location passed in from ioctl */ 730 %#define MDDB_F_GOTTEN 0x01000 /* getdev has been done on this dev */ 731 %#define MDDB_F_LOCACC 0x02000 /* the locator has been accessed */ 732 %#define MDDB_F_UP2DATE 0x04000 /* this copy of db is up to date */ 733 %#define MDDB_F_OLDACT 0x08000 /* this copy was active previously */ 734 %#define MDDB_F_DELETED 0x10000 /* place holder in empty slot */ 735 %#define MDDB_F_TAGDATA 0x20000 /* Data is tagged */ 736 %#define MDDB_F_BADTAG 0x40000 /* Data tag was not valid */ 737 %#define MDDB_F_NODEVID 0x80000 /* No devid associated with replica */ 738 % 739 %/* 740 % * These are used in de_flags only 741 % * Do not change these values, they are stored on-disk 742 % */ 743 %#define MDDB_F_STRIPE 0x00001 /* record is a stripe record */ 744 %#define MDDB_F_MIRROR 0x00002 /* record is a mirror record */ 745 %#define MDDB_F_RAID 0x00004 /* record is a raid record */ 746 %#define MDDB_F_SOFTPART 0x00008 /* record is a sp record */ 747 %#define MDDB_F_TRANS_MASTER 0x00010 /* trans master record */ 748 %#define MDDB_F_TRANS_LOG 0x00020 /* trans log record */ 749 %#define MDDB_F_HOTSPARE 0x00040 /* hotspare record */ 750 %#define MDDB_F_HOTSPARE_POOL 0x00080 /* hotspare record */ 751 %#define MDDB_F_OPT 0x00200 /* optimization record */ 752 %#define MDDB_F_CHANGELOG 0x00400 /* change log record */ 753 754 %/* used by metadb(1m) for printing */ 755 %#define MDDB_FLAGS_STRING "RSFDMaWm pc luo tBr" 756 %#define MDDB_FLAGS_LEN (strlen(MDDB_FLAGS_STRING)) 757 % 758 %/* 759 % * See meta_prbits() in SUNWmd/lib/libmeta/meta_print.c for a description of 760 % * the way this is used 761 % */ 762 %#define MDDB_F_BITNAMES "\020\001EREAD\002TOOSMALL\003EFMT\004EDATA" \ 763 % "\005EMASTER\006ACTIVE\007EWRITE\010MASTER" \ 764 % "\011SUSPECT\012OPT\013PTCHED\014IOCTL" \ 765 % "\015GOTTEN\016LOCACC\017UP2DATE\020OLDACT" \ 766 % "\021DELETED\022TAGDATA\023BADTAG\024NORELOC" 767 % 768 #endif /* RPC_HDR */ 769 770 /* 771 * Refering to r_blkno and r_nblk: 772 * A replica will always be smaller than 1 Terabyte, so no need to 773 * change the ondisk structure to 64 bits. 774 */ 775 struct md_replica_t { 776 mdname_t *r_namep; 777 replica_flags_t r_flags; 778 daddr_t r_blkno; 779 daddr_t r_nblk; 780 ddi_devid_t r_devid; 781 char r_driver_name[MD_MAXDRVNM]; 782 char r_minor_name[MDDB_MINOR_NAME_MAX]; 783 }; 784 785 struct md_replica_recerr_t { 786 int r_li; 787 int r_flags; 788 daddr32_t r_blkno; 789 minor_t r_mnum; 790 char r_driver_name[MD_MAXDRVNM]; 791 }; 792 793 struct md_replicalist_t { 794 md_replicalist_t *rl_next; 795 md_replica_t *rl_repp; 796 }; 797 798 % 799 %/* 800 % * set/drive structs exposed by the library routines 801 % */ 802 struct md_drive_desc { 803 md_timeval32_t dd_ctime; /* creation time */ 804 u_long dd_genid; /* generation id */ 805 u_int dd_flags; /* state flags */ 806 md_drive_desc *dd_next; /* next drive */ 807 mddrivename_t *dd_dnp; /* drive name ptr */ 808 int dd_dbcnt; /* # of replicas */ 809 int dd_dbsize; /* size of replica */ 810 }; 811 812 % 813 %/* 814 % * set/drive structs exposed by the library routines (old style) 815 % */ 816 struct o_md_drive_desc { 817 md_timeval32_t dd_ctime; /* creation time */ 818 u_long dd_genid; /* generation id */ 819 u_int dd_flags; /* state flags */ 820 o_md_drive_desc *dd_next; /* next drive */ 821 o_mddrivename_t *dd_dnp; /* drive name ptr */ 822 int dd_dbcnt; /* # of replicas */ 823 int dd_dbsize; /* size of replica */ 824 }; 825 826 struct md_mnnode_desc { 827 md_timeval32_t nd_ctime; /* creation time */ 828 u_long nd_genid; /* generation id */ 829 u_int nd_flags; /* state flags */ 830 md_mnnode_desc *nd_next; /* next node */ 831 md_mnnode_nm_t nd_nodename; /* name of node */ 832 u_int nd_nodeid; /* id of node */ 833 md_mnnode_nm_t nd_priv_ic; /* priv interconnect */ 834 /* nodename */ 835 }; 836 837 struct md_set_desc { 838 md_timeval32_t sd_ctime; /* creation time */ 839 u_long sd_genid; /* generation id */ 840 set_t sd_setno; /* set number */ 841 u_int sd_flags; /* state flags */ 842 md_node_nm_arr_t sd_nodes; /* array of nodenames */ 843 /* for !MN_disksets */ 844 int sd_isown[MD_MAXSIDES]; /* bool for is owner? */ 845 md_h_arr_t sd_med; /* Mediator hosts */ 846 md_drive_desc *sd_drvs; /* drive list */ 847 u_int sd_mn_am_i_master; 848 u_int sd_mn_numnodes; /* # of nodes in list */ 849 md_mnnode_desc *sd_nodelist; /* MN node list */ 850 /* for MN_disksets */ 851 md_node_nm_t sd_mn_master_nodenm; /* Master node name */ 852 u_int sd_mn_master_nodeid; /* Master node id */ 853 md_mnnode_desc *sd_mn_mynode; /* shortcut to me */ 854 md_mnnode_desc *sd_mn_masternode; /* shortcut to master */ 855 }; 856 857 %/* 858 % * Defines to determine if diskset is a Multinode diskset. 859 % * The sd_flags field in the md_set_desc structure is never manipulated 860 % * directly but is always a copy of the set record's sr_flags field, so 861 % * the same define (MD_SR_MN) can be used for both sd_flags and sr_flags. 862 % * The set record is of the structure type md_set_record if a regular diskset 863 % * or type md_mnset_record for a Multinode diskset. 864 %*/ 865 %#define MD_MNSET_DESC(sd) (((sd)->sd_flags & MD_SR_MN) ? 1 : 0) 866 %#define MD_MNSET_REC(sr) (((sr)->sr_flags & MD_SR_MN) ? 1 : 0) 867 %#define MD_MNDR_REC(dr) (((dr)->dr_flags & MD_DR_MN) ? 1 : 0) 868 869 %/* 870 % * Define to determine if diskset is a Auto-Take diskset. 871 %*/ 872 %#define MD_ATSET_DESC(sd) (((sd)->sd_flags & MD_SR_AUTO_TAKE) ? 1 : 0) 873 874 %/* 875 % * Define to set the alive flag for a node. A node is alive if it 876 % * is in the multi_node membership list. 877 % */ 878 %#define MD_MN_NODE_ALIVE 0x0001 879 880 %/* 881 % * Define to set the own flag for a node. A node is an owner of the diskset 882 % * if that node has snarf'd in the mddb. 883 % */ 884 %#define MD_MN_NODE_OWN 0x0002 885 886 %/* 887 % * Defines to set the add, delete and ok states of a node. The add state is 888 % * set at the beginning of the addition of a node to a diskset. The 889 % * delete state is set at the beginning of a deletion of a node from a diskset. 890 % * The OK state is set (and the add state reset) when that node is 891 % * functional in the diskset. 892 % * Rollback join flag is used on an error condition when deleting the last 893 % * disk from a diskset. rpc.metad should never see this flag. 894 % * NOSET flag is used on an error condition during a reconfig cycle when 895 % * the set has been removed from this node. rpc.metad should just ignore 896 % * this flag. 897 % */ 898 %#define MD_MN_NODE_ADD 0x0004 899 %#define MD_MN_NODE_DEL 0x0008 900 %#define MD_MN_NODE_OK 0x0010 901 %#define MD_MN_NODE_RB_JOIN 0x0020 902 %#define MD_MN_NODE_NOSET 0x0040 903 904 %/* 905 % * Define for invalid node id. Used specifically to set mn set record 906 % * master nodeid to invalid when no master can be determined. 907 % */ 908 %#define MD_MN_INVALID_NID 0xfffffffful /* invalid node id */ 909 910 % 911 %/* 912 % * set description (old style) 913 % */ 914 struct o_md_set_desc { 915 md_timeval32_t sd_ctime; /* creation time */ 916 u_long sd_genid; /* generation id */ 917 set_t sd_setno; /* set number */ 918 u_int sd_flags; /* state flags */ 919 md_node_nm_arr_t sd_nodes; /* array of nodenames */ 920 int sd_isown[MD_MAXSIDES]; /* bool for is owner? */ 921 md_h_arr_t sd_med; /* Mediator hosts */ 922 o_md_drive_desc *sd_drvs; /* drive list */ 923 }; 924 925 % 926 %/* 927 % * hotspare pool name 928 % */ 929 struct mdhspname_t { 930 string hspname<>; /* hotspare pool name */ 931 hsp_t hsp; /* number */ 932 933 #ifdef RPC_HDR 934 struct md_hsp_t *unitp; /* hotspare pool unit structure */ 935 #endif /* RPC_HDR */ 936 }; 937 938 struct mdhspnamelist_t { 939 mdhspnamelist_t *next; 940 mdhspname_t *hspnamep; 941 }; 942 943 % 944 %/* 945 % * generic metadevice descriptions for status and init 946 % */ 947 % 948 949 %/* 950 % * following used with un_status 951 % * bottom 16 bits are global definitions 952 % * top 16 bits are defined by sub device 953 % */ 954 typedef u_int md_status_t; 955 #ifdef RPC_HDR 956 % 957 %#define MD_UN_GROW_PENDING 0x0008 /* grow mirror pending */ 958 %#define MD_UN_BEING_RESET 0x0040 /* reset at snarf time */ 959 #endif /* RPC_HDR */ 960 % 961 %/* 962 % * following are used with un_parent 963 % * MD_NO_PARENT - Not a sub-device. 964 % * MD_MULTI_PARENT - A sub-device with one or more parents, like a log. 965 % * other - A sub-device with only one parent, like a submirror. 966 % * The number is the parent's unit number. 967 % */ 968 typedef unit_t md_parent_t; 969 #ifdef RPC_HDR 970 % 971 %#define MD_NO_PARENT 0xffffffffu 972 %#define MD_MULTI_PARENT 0xfffffffeu 973 %#define MD_HAS_PARENT(p) ((p) != MD_NO_PARENT) 974 #endif /* RPC_HDR */ 975 976 typedef u_int md_stackcap_t; 977 #ifdef RPC_HDR 978 % 979 %#define MD_CANT_PARENT 0x00 /* cannot have a parent */ 980 %#define MD_CAN_PARENT 0x01 /* can have a parent */ 981 %#define MD_CAN_SUB_MIRROR 0x02 /* can be a sub-mirror */ 982 %#define MD_CAN_META_CHILD 0x04 /* can have metadev. children */ 983 %#define MD_CAN_SP 0x08 /* can be soft partitioned */ 984 985 #endif /* RPC_HDR */ 986 987 /* common to all metadevices */ 988 struct md_common_t { 989 mdname_t *namep; 990 md_types_t type; 991 md_status_t state; 992 md_stackcap_t capabilities; 993 md_parent_t parent; 994 diskaddr_t size; 995 u_long user_flags; 996 u_longlong_t revision; 997 }; 998 999 % 1000 %/* 1001 % * stripe 1002 % */ 1003 /* 1004 * ioctl stuff 1005 */ 1006 struct ms_params_t { 1007 int change_hsp_id; 1008 hsp_t hsp_id; 1009 }; 1010 1011 /* 1012 * unit structure 1013 */ 1014 typedef u_int comp_state_t; 1015 #ifdef RPC_HDR 1016 % 1017 %#define CS_OKAY 0x0001 1018 %#define CS_ERRED 0x0002 1019 %#define CS_RESYNC 0x0004 1020 %#define CS_LAST_ERRED 0x0008 1021 % 1022 %/* interlace values (in bytes) */ 1023 %#define MININTERLACE (16 * 512) 1024 %#define MAXINTERLACE (100 * 1024 * 1024) 1025 #endif /* RPC_HDR */ 1026 1027 struct md_comp_t { 1028 mdname_t *compnamep; 1029 mdname_t *hsnamep; 1030 comp_state_t state; 1031 u_int lasterrcnt; 1032 md_timeval32_t timestamp; 1033 }; 1034 1035 struct md_row_t { 1036 diskaddr_t interlace; 1037 diskaddr_t row_size; 1038 md_comp_t comps<>; 1039 }; 1040 1041 struct md_stripe_t { 1042 md_common_t common; 1043 mdhspname_t *hspnamep; 1044 md_row_t rows<>; 1045 }; 1046 1047 % 1048 %/* 1049 % * soft partition 1050 % */ 1051 typedef uint64_t xsp_offset_t; 1052 typedef uint64_t xsp_length_t; 1053 typedef u_int xsp_status_t; 1054 % 1055 %#define SP_INIT 0x0001 1056 %#define SP_OK 0x0002 1057 %#define SP_LASTERR 0x0004 1058 % 1059 /* 1060 * unit structure 1061 */ 1062 1063 struct md_sp_ext_t { 1064 xsp_offset_t voff; 1065 xsp_offset_t poff; 1066 xsp_length_t len; 1067 }; 1068 1069 struct md_sp_t { 1070 md_common_t common; 1071 mdname_t *compnamep; /* name of this component */ 1072 xsp_status_t status; /* state of this soft partition */ 1073 md_sp_ext_t ext<>; 1074 }; 1075 1076 % 1077 %/* 1078 % * mirror 1079 % */ 1080 /* 1081 * ioctl stuff 1082 */ 1083 enum mm_wr_opt_t { 1084 WR_PARALLEL = 0, /* write submirrors in parallel */ 1085 WR_SERIAL /* write submirrors one at a time */ 1086 }; 1087 1088 enum mm_rd_opt_t { 1089 RD_LOAD_BAL = 0, /* read submirrors roundrobin */ 1090 RD_GEOMETRY, /* read submirrors geometrically */ 1091 RD_FIRST /* read first submirror */ 1092 }; 1093 1094 typedef short mm_pass_num_t; 1095 const MD_PASS_DEFAULT = 1; 1096 const MD_PASS_MAX = 9; 1097 1098 struct mm_params_t { 1099 int change_read_option; 1100 mm_rd_opt_t read_option; 1101 int change_write_option; 1102 mm_wr_opt_t write_option; 1103 int change_pass_num; 1104 mm_pass_num_t pass_num; 1105 }; 1106 1107 /* 1108 * unit structure 1109 */ 1110 typedef u_int sm_state_t; 1111 #ifdef RPC_HDR 1112 % 1113 %#define SMS_UNUSED 0x0000 1114 %#define SMS_RUNNING 0x0001 1115 %#define SMS_COMP_ERRED 0x0002 1116 %#define SMS_COMP_RESYNC 0x0004 1117 %#define SMS_ATTACHED 0x0008 1118 %#define SMS_ATTACHED_RESYNC 0x0010 1119 %#define SMS_OFFLINE 0x0020 1120 %#define SMS_OFFLINE_RESYNC 0x0040 1121 %#define SMS_ALL_ERRED 0x0080 1122 %#define SMS_INUSE (0xffff) 1123 %#define SMS_LIMPING (SMS_COMP_ERRED | SMS_COMP_RESYNC) 1124 %#define SMS_IGNORE 0x4000 1125 #endif /* RPC_HDR */ 1126 1127 typedef u_int sm_flags_t; 1128 #ifdef RPC_HDR 1129 % 1130 %#define MD_SM_RESYNC_TARGET 0x0001 1131 %#define MD_SM_FAILFAST 0x0002 1132 #endif /* RPC_HDR */ 1133 1134 struct md_submirror_t { 1135 mdname_t *submirnamep; 1136 sm_state_t state; 1137 sm_flags_t flags; 1138 md_timeval32_t timestamp; 1139 }; 1140 1141 #ifdef RPC_HDR 1142 % 1143 %#define MD_UN_RESYNC_ACTIVE 0x00010000 1144 %#define MD_UN_WAR 0x00020000 1145 %#define MD_UN_OFFLINE_SM 0x00040000 1146 %#define MD_UN_OPT_NOT_DONE 0x00080000 1147 %#define MD_UN_KEEP_DIRTY (MD_UN_OFFLINE_SM | MD_UN_OPT_NOT_DONE) 1148 %#define MD_UN_RESYNC_CANCEL 0x00100000 1149 %#define MD_UN_REPLAYED 0x00200000 1150 %#define MD_UN_RENAMING 0x00400000 1151 %#define MD_UN_MOD_INPROGRESS (MD_UN_RESYNC_ACTIVE | \ 1152 % MD_UN_OPT_NOT_DONE | \ 1153 % MD_UN_RENAMING) 1154 #endif /* RPC_HDR */ 1155 1156 const NMIRROR = 4; 1157 struct md_mirror_t { 1158 md_common_t common; 1159 mm_rd_opt_t read_option; 1160 mm_wr_opt_t write_option; 1161 mm_pass_num_t pass_num; 1162 int percent_done; 1163 int percent_dirty; 1164 md_submirror_t submirrors[NMIRROR]; 1165 }; 1166 1167 1168 % 1169 %/* 1170 % * trans 1171 % */ 1172 %/* 1173 % * unit structure 1174 % */ 1175 typedef u_int mt_flags_t; 1176 #ifdef RPC_HDR 1177 % 1178 %#define TRANS_NEED_OPEN 0x0001 /* subdevs are unopened */ 1179 %#define TRANS_OPENED 0x0002 /* open at snarf succeeded */ 1180 %#define TRANS_DETACHING 0x0004 /* detaching the log */ 1181 %#define TRANS_DETACHED 0x0008 /* log successfully detached */ 1182 %#define TRANS_DETACH_SKIP 0x0010 /* already processed; skip */ 1183 %#define TRANS_ATTACHING 0x0020 /* attaching the log */ 1184 %#define TRANS_ROLL_ON_WRITE 0x0040 /* roll on physio write */ 1185 %#define TRANS_NEED_SCANROLL 0x0080 /* roll on physio write */ 1186 #endif /* RPC_HDR */ 1187 1188 typedef u_int mt_l_error_t; 1189 #ifdef RPC_HDR 1190 % 1191 %#define LDL_ERROR 0x0001 /* error state */ 1192 %#define LDL_HERROR 0x0002 /* hard error state */ 1193 %#define LDL_ANYERROR 0x0003 /* any error state */ 1194 %#define LDL_NOERROR 0x0004 /* dont error transition during scan */ 1195 %#define LDL_SAVERROR 0x0008 /* transition to error after scan */ 1196 #endif /* RPC_HDR */ 1197 1198 typedef u_int mt_debug_t; /* values in md_trans.h */ 1199 1200 struct md_trans_t { 1201 md_common_t common; 1202 mdname_t *masternamep; 1203 mdname_t *lognamep; 1204 mt_flags_t flags; 1205 md_timeval32_t timestamp; 1206 mt_l_error_t log_error; 1207 md_timeval32_t log_timestamp; 1208 daddr_t log_size; 1209 mt_debug_t debug; 1210 }; 1211 1212 1213 1214 % 1215 %/* 1216 % * RAID 1217 % */ 1218 /* 1219 * ioctl stuff 1220 */ 1221 struct mr_params_t { 1222 int change_hsp_id; 1223 hsp_t hsp_id; 1224 }; 1225 1226 /* 1227 * unit structure 1228 */ 1229 enum rcs_state_t { 1230 RCS_UNUSED = 0x0, 1231 RCS_INIT = 0x1, 1232 RCS_OKAY = 0x2, 1233 RCS_ERRED = 0x4, 1234 RCS_LAST_ERRED = 0x8, 1235 RCS_RESYNC = 0x10, 1236 RCS_INIT_ERRED = 0x20, 1237 RCS_REGEN = 0x40 1238 }; 1239 1240 typedef u_int rcs_flags_t; 1241 #ifdef RPC_HDR 1242 % 1243 %#define MD_RAID_DEV_ISOPEN 0x00001 1244 %#define MD_RAID_ALT_ISOPEN 0x00002 1245 %#define MD_RAID_RESYNC 0x00004 1246 %#define MD_RAID_RESYNC_ERRED 0x00008 1247 %#define MD_RAID_FORCE_REPLACE 0x00010 1248 %#define MD_RAID_WRITE_ALT 0x00020 1249 %#define MD_RAID_DEV_ERRED 0x00040 1250 %#define MD_RAID_COPY_RESYNC 0x00080 1251 %#define MD_RAID_REGEN_RESYNC 0x00100 1252 %#define MD_RAID_DEV_PROBEOPEN 0x00200 1253 %#define MD_RAID_HAS_LABEL 0x40000 1254 #endif /* RPC_HDR */ 1255 1256 struct md_raidcol_t { 1257 mdname_t *colnamep; 1258 mdname_t *hsnamep; 1259 rcs_state_t state; 1260 rcs_flags_t flags; 1261 md_timeval32_t timestamp; 1262 }; 1263 1264 enum rus_state_t { 1265 RUS_UNUSED = 0x0, 1266 RUS_INIT = 0x1, 1267 RUS_OKAY = 0x2, 1268 RUS_ERRED = 0x4, 1269 RUS_LAST_ERRED = 0x8, 1270 RUS_DOI = 0x10, 1271 RUS_REGEN = 0x20 1272 }; 1273 1274 typedef u_int md_riflags_t; 1275 #ifdef RPC_HDR 1276 % 1277 %#define MD_RI_INPROGRESS 0x0001 1278 %#define MD_GROW_INPROGRESS 0x0002 1279 %#define MD_RI_BLOCK 0x0004 1280 %#define MD_RI_UNBLOCK 0x0008 1281 %#define MD_RI_KILL 0x0010 1282 %#define MD_RI_BLOCK_OWNER 0x0020 1283 %#define MD_RI_SHUTDOWN 0x0040 1284 %#define MD_RI_NO_WAIT 0x0080 1285 %#define MD_RI_RESYNC_FORCE_MNSTART 0x0100 1286 #endif /* RPC_HDR */ 1287 1288 const MD_RAID_MIN = 3; 1289 struct md_raid_t { 1290 md_common_t common; 1291 rus_state_t state; 1292 md_timeval32_t timestamp; 1293 diskaddr_t interlace; 1294 diskaddr_t column_size; 1295 size_t orig_ncol; 1296 mdhspname_t *hspnamep; 1297 md_riflags_t resync_flags; 1298 int percent_dirty; 1299 int percent_done; 1300 int pw_count; 1301 md_raidcol_t cols<>; 1302 }; 1303 1304 % 1305 %/* 1306 % * shared 1307 % */ 1308 /* 1309 * unit structure 1310 */ 1311 struct md_shared_t { 1312 md_common_t common; 1313 }; 1314 1315 % 1316 %/* 1317 % * hotspare 1318 % */ 1319 /* 1320 * ioctl stuff 1321 */ 1322 enum hotspare_states_t { 1323 HSS_UNUSED, HSS_AVAILABLE, HSS_RESERVED, HSS_BROKEN 1324 }; 1325 1326 /* 1327 * unit structure 1328 */ 1329 struct md_hs_t { 1330 mdname_t *hsnamep; 1331 hotspare_states_t state; 1332 diskaddr_t size; 1333 md_timeval32_t timestamp; 1334 u_longlong_t revision; 1335 }; 1336 1337 struct md_hsp_t { 1338 mdhspname_t *hspnamep; 1339 u_int refcount; 1340 md_hs_t hotspares<>; 1341 }; 1342 1343 % 1344 %/* 1345 % * specific error info 1346 % */ 1347 % 1348 %/* 1349 % * simple errors 1350 % */ 1351 enum md_void_errno_t { 1352 MDE_NONE = 0, 1353 MDE_UNIT_NOT_FOUND, 1354 MDE_DUPDRIVE, 1355 MDE_INVAL_HSOP, 1356 MDE_NO_SET, /* no such set */ 1357 MDE_SET_DIFF, /* setname changed on command line */ 1358 MDE_BAD_RD_OPT, /* bad mirror read option */ 1359 MDE_BAD_WR_OPT, /* bad mirror write option */ 1360 MDE_BAD_PASS_NUM, /* bad mirror pass number */ 1361 MDE_BAD_INTERLACE, /* bad stripe interlace */ 1362 MDE_NO_HSPS, /* couldn't find any hotspare pools */ 1363 MDE_NOTENOUGH_DB, /* Too few replicas */ 1364 MDE_DELDB_NOTALLOWED, /* last replica in ds cannot be del in metadb */ 1365 MDE_DEL_VALIDDB_NOTALLOWED, /* last valid replica cannot be del */ 1366 MDE_SYSTEM_FILE, /* /etc/system file error */ 1367 MDE_MDDB_FILE, /* /etc/lvm/mddb.cf file error */ 1368 MDE_MDDB_CKSUM, /* /etc/lvm/mddb.cf checksum error */ 1369 MDE_VFSTAB_FILE, /* /etc/vfstab file error */ 1370 MDE_NOSLICE, /* metaslicename() with sliceno to big */ 1371 MDE_SYNTAX, /* metainit syntax error */ 1372 MDE_OPTION, /* metainit options error */ 1373 MDE_TAKE_OWN, /* take ownership failed */ 1374 MDE_NOT_DRIVENAME, /* not in drivename syntax */ 1375 MDE_RESERVED, /* device is reserved by another host */ 1376 MDE_DVERSION, /* driver version out of sync */ 1377 MDE_MVERSION, /* MDDB version out of sync */ 1378 MDE_TESTERROR, /* Test Error Message */ 1379 MDE_BAD_ORIG_NCOL, /* bad RAID original column count */ 1380 MDE_RAID_INVALID, /* attempt to use -k on invalid device */ 1381 MDE_MED_ERROR, /* mediator error */ 1382 MDE_TOOMANYMED, /* Too many mediators specified */ 1383 MDE_NOMED, /* No mediators */ 1384 MDE_ONLYNODENAME, /* Only the nodename is needed */ 1385 MDE_RAID_BAD_PW_CNT, /* bad prewrite count specified */ 1386 MDE_DEVID_TOOBIG, /* Devid size is greater than allowed */ 1387 MDE_NOPERM, /* No permission - not root */ 1388 MDE_NODEVID, /* No device id for given devt */ 1389 MDE_NOROOT, /* No root in /etc/mnttab */ 1390 MDE_EOF_TRANS, /* trans logging eof'd */ 1391 MDE_BAD_RESYNC_OPT, /* bad mirror resync option */ 1392 MDE_NOT_MN, /* option only valid within a multi-node set */ 1393 MDE_ABR_SET, /* invalid operation for ABR mirror */ 1394 MDE_INVAL_MNOP, /* Invalid operation on MN diskset */ 1395 MDE_MNSET_NOTRANS, /* Trans metadevice not supported in MN set */ 1396 MDE_MNSET_NORAID, /* RAID metadevice not supported in MN set */ 1397 MDE_FORCE_DEL_ALL_DRV, /* Must use -f flag to delete all drives */ 1398 MDE_STRIPE_TRUNC_SINGLE, /* single component stripe truncation */ 1399 MDE_STRIPE_TRUNC_MULTIPLE, /* multiple component stripe trun */ 1400 MDE_SMF_FAIL, /* service management facility error */ 1401 MDE_SMF_NO_SERVICE, /* service not enabled in SMF */ 1402 MDE_AMBIGUOUS_DEV, /* Ambiguous device specified */ 1403 MDE_NAME_IN_USE, /* Friendly name already in use. For */ 1404 /* instance name desired for hot spare pool */ 1405 /* is being used for a metadevice. */ 1406 MDE_ZONE_ADMIN, /* in a zone & no admin device */ 1407 MDE_NAME_ILLEGAL, /* illegal syntax for metadevice or hsp name */ 1408 MDE_MISSING_DEVID_DISK /* unable to find disk using devid */ 1409 }; 1410 1411 struct md_void_error_t { 1412 md_void_errno_t errnum; 1413 }; 1414 1415 % 1416 %/* 1417 % * system errors 1418 % */ 1419 struct md_sys_error_t { 1420 int errnum; 1421 }; 1422 1423 % 1424 %/* 1425 % * RPC errors 1426 % */ 1427 struct md_rpc_error_t { 1428 enum clnt_stat errnum; 1429 }; 1430 1431 % 1432 %/* 1433 % * device errors 1434 % */ 1435 enum md_dev_errno_t { 1436 MDE_INVAL_HS = 1, 1437 MDE_FIX_INVAL_STATE, 1438 MDE_FIX_INVAL_HS_STATE, 1439 MDE_NOT_META, 1440 MDE_IS_META, 1441 MDE_IS_SWAPPED, 1442 MDE_NAME_SPACE, 1443 MDE_IN_SHARED_SET, 1444 MDE_NOT_IN_SET, 1445 MDE_NOT_DISK, 1446 MDE_CANT_CONFIRM, 1447 MDE_INVALID_PART, 1448 MDE_HAS_MDDB, 1449 MDE_NO_DB, /* Replica not on device given */ 1450 MDE_CANTVERIFY_VTOC, 1451 MDE_NOT_LOCAL, 1452 MDE_DEVICES_NAME, 1453 MDE_REPCOMP_INVAL, /* replica slice not allowed in "set" metadevs */ 1454 MDE_REPCOMP_ONLY, /* only replica slice diskset replicas */ 1455 MDE_INV_ROOT, /* Invalid root device for this operation */ 1456 MDE_MULTNM, /* Multiple entries for device in namespace */ 1457 MDE_TOO_MANY_PARTS, /* dev has more than MD_MAX_PARTS partitions */ 1458 MDE_REPART_REPLICA, /* replica slice would move with repartitioning */ 1459 MDE_IS_DUMP, /* device already in use as dump device */ 1460 MDE_DISKNAMETOOLONG /* devid's not in use and diskname too long */ 1461 }; 1462 1463 struct md_dev_error_t { 1464 md_dev_errno_t errnum; 1465 md_dev64_t dev; /* 64 bit fixed size */ 1466 }; 1467 1468 % 1469 %/* 1470 % * overlap errors 1471 % */ 1472 enum md_overlap_errno_t { 1473 MDE_OVERLAP_MOUNTED = 1, 1474 MDE_OVERLAP_SWAP, 1475 MDE_OVERLAP_DUMP 1476 }; 1477 1478 % 1479 1480 #if !defined(_KERNEL) 1481 struct md_overlap_error_t { 1482 md_overlap_errno_t errnum; 1483 string where<>; 1484 string overlap<>; 1485 }; 1486 #else 1487 struct md_overlap_error_t { 1488 md_overlap_errno_t errnum; 1489 u_int xwhere; 1490 u_int xoverlap; 1491 }; 1492 #endif /* !_KERNEL */ 1493 1494 % 1495 %/* 1496 % * use errors 1497 % */ 1498 enum md_use_errno_t { 1499 MDE_IS_MOUNTED = 1, 1500 MDE_ALREADY, 1501 MDE_OVERLAP, 1502 MDE_SAME_DEVID 1503 }; 1504 1505 % 1506 #if !defined(_KERNEL) 1507 struct md_use_error_t { 1508 md_use_errno_t errnum; 1509 md_dev64_t dev; 1510 string where<>; 1511 }; 1512 #else 1513 struct md_use_error_t { 1514 md_use_errno_t errnum; 1515 md_dev64_t dev; 1516 u_int xwhere; 1517 }; 1518 #endif 1519 1520 % 1521 %/* 1522 % * metadevice errors 1523 % */ 1524 enum md_md_errno_t { 1525 MDE_INVAL_UNIT = 1, 1526 MDE_UNIT_NOT_SETUP, 1527 MDE_UNIT_ALREADY_SETUP, 1528 MDE_NOT_MM, 1529 MDE_NOT_ENOUGH_DBS, 1530 MDE_IS_SM, 1531 MDE_IS_OPEN, 1532 MDE_C_WITH_INVAL_SM, 1533 MDE_RESYNC_ACTIVE, 1534 MDE_LAST_SM_RE, 1535 MDE_MIRROR_FULL, 1536 MDE_IN_USE, 1537 MDE_SM_TOO_SMALL, 1538 MDE_NO_LABELED_SM, 1539 MDE_SM_OPEN_ERR, 1540 MDE_CANT_FIND_SM, 1541 MDE_LAST_SM, 1542 MDE_NO_READABLE_SM, 1543 MDE_SM_FAILED_COMPS, 1544 MDE_ILLEGAL_SM_STATE, 1545 MDE_RR_ALLOC_ERROR, 1546 MDE_MIRROR_OPEN_FAILURE, 1547 MDE_MIRROR_THREAD_FAILURE, 1548 MDE_GROW_DELAYED, 1549 MDE_NOT_MT, 1550 MDE_HS_IN_USE, 1551 MDE_HAS_LOG, 1552 MDE_UNKNOWN_TYPE, 1553 MDE_NOT_STRIPE, 1554 MDE_NOT_RAID, 1555 MDE_NROWS, 1556 MDE_NCOMPS, 1557 MDE_NSUBMIRS, 1558 MDE_BAD_STRIPE, 1559 MDE_BAD_MIRROR, 1560 MDE_BAD_TRANS, 1561 MDE_BAD_RAID, 1562 MDE_RAID_OPEN_FAILURE, 1563 MDE_RAID_THREAD_FAILURE, 1564 MDE_RAID_NEED_FORCE, 1565 MDE_NO_LOG, 1566 MDE_RAID_DOI, 1567 MDE_RAID_LAST_ERRED, 1568 MDE_RAID_NOT_OKAY, 1569 MDE_RENAME_BUSY, 1570 MDE_RENAME_SOURCE_BAD, 1571 MDE_RENAME_TARGET_BAD, 1572 MDE_RENAME_TARGET_UNRELATED, 1573 MDE_RENAME_CONFIG_ERROR, 1574 MDE_RENAME_ORDER, 1575 MDE_RECOVER_FAILED, 1576 MDE_NOT_SP, 1577 MDE_SP_NOSPACE, 1578 MDE_SP_BADWMREAD, 1579 MDE_SP_BADWMWRITE, 1580 MDE_SP_BADWMMAGIC, 1581 MDE_SP_BADWMCRC, 1582 MDE_SP_OVERLAP, 1583 MDE_SP_BAD_LENGTH, 1584 MDE_UNIT_TOO_LARGE, 1585 MDE_LOG_TOO_LARGE, 1586 MDE_SP_NOSP, 1587 MDE_IN_UNAVAIL_STATE 1588 }; 1589 1590 struct md_md_error_t { 1591 md_md_errno_t errnum; 1592 minor_t mnum; 1593 }; 1594 1595 % 1596 %/* 1597 % * component errors 1598 % */ 1599 enum md_comp_errno_t { 1600 MDE_CANT_FIND_COMP = 1, 1601 MDE_REPL_INVAL_STATE, 1602 MDE_COMP_TOO_SMALL, 1603 MDE_COMP_OPEN_ERR, 1604 MDE_RAID_COMP_ERRED, 1605 MDE_MAXIO, 1606 MDE_SP_COMP_OPEN_ERR 1607 }; 1608 1609 struct md_comp_error_t { 1610 md_comp_errno_t errnum; 1611 comp_t comp; 1612 }; 1613 1614 % 1615 %/* 1616 % * hotspare pool errors 1617 % */ 1618 enum md_hsp_errno_t { 1619 MDE_HSP_CREATE_FAILURE = 1, 1620 MDE_HSP_IN_USE, 1621 MDE_INVAL_HSP, 1622 MDE_HSP_BUSY, 1623 MDE_HSP_REF, 1624 MDE_HSP_ALREADY_SETUP, 1625 MDE_BAD_HSP, 1626 MDE_HSP_UNIT_TOO_LARGE 1627 }; 1628 1629 struct md_hsp_error_t { 1630 md_hsp_errno_t errnum; 1631 hsp_t hsp; 1632 }; 1633 1634 % 1635 %/* 1636 % * hotspare errors 1637 % */ 1638 enum md_hs_errno_t { 1639 MDE_HS_RESVD = 1, 1640 MDE_HS_CREATE_FAILURE, 1641 MDE_HS_INUSE, 1642 MDE_HS_UNIT_TOO_LARGE 1643 }; 1644 1645 struct md_hs_error_t { 1646 md_hs_errno_t errnum; 1647 hs_t hs; 1648 }; 1649 1650 % 1651 %/* 1652 % * MDDB errors 1653 % */ 1654 enum md_mddb_errno_t { 1655 MDE_TOOMANY_REPLICAS = 1, 1656 MDE_REPLICA_TOOSMALL, 1657 MDE_NOTVERIFIED, 1658 MDE_DB_INVALID, 1659 MDE_DB_EXISTS, 1660 MDE_DB_MASTER, 1661 MDE_DB_TOOSMALL, 1662 MDE_DB_NORECORD, 1663 MDE_DB_NOSPACE, 1664 MDE_DB_NOTNOW, 1665 MDE_DB_NODB, 1666 MDE_DB_NOTOWNER, 1667 MDE_DB_STALE, 1668 MDE_DB_TOOFEW, 1669 MDE_DB_TAGDATA, 1670 MDE_DB_ACCOK, 1671 MDE_DB_NTAGDATA, 1672 MDE_DB_ACCNOTOK, 1673 MDE_DB_NOLOCBLK, 1674 MDE_DB_NOLOCNMS, 1675 MDE_DB_NODIRBLK, 1676 MDE_DB_NOTAGREC, 1677 MDE_DB_NOTAG, 1678 MDE_DB_BLKRANGE 1679 }; 1680 1681 % 1682 struct md_mddb_error_t { 1683 md_mddb_errno_t errnum; 1684 minor_t mnum; /* associated metadevice */ 1685 set_t setno; 1686 u_int size; 1687 }; 1688 1689 % 1690 %/* 1691 % * diskset (ds) errors 1692 % */ 1693 enum md_ds_errno_t { 1694 MDE_DS_DUPHOST = 1, 1695 MDE_DS_NOTNODENAME, 1696 MDE_DS_SELFNOTIN, 1697 MDE_DS_NODEHASSET, 1698 MDE_DS_NODENOSET, 1699 MDE_DS_NOOWNER, 1700 MDE_DS_NOTOWNER, 1701 MDE_DS_NODEISNOTOWNER, 1702 MDE_DS_NODEINSET, 1703 MDE_DS_NODENOTINSET, 1704 MDE_DS_SETNUMBUSY, 1705 MDE_DS_SETNUMNOTAVAIL, 1706 MDE_DS_SETNAMEBUSY, 1707 MDE_DS_DRIVENOTCOMMON, 1708 MDE_DS_DRIVEINSET, 1709 MDE_DS_DRIVENOTINSET, 1710 MDE_DS_DRIVEINUSE, 1711 MDE_DS_DUPDRIVE, 1712 MDE_DS_INVALIDSETNAME, 1713 MDE_DS_HASDRIVES, 1714 MDE_DS_SIDENUMNOTAVAIL, 1715 MDE_DS_SETNAMETOOLONG, 1716 MDE_DS_NODENAMETOOLONG, 1717 MDE_DS_OHACANTDELSELF, 1718 MDE_DS_HOSTNOSIDE, 1719 MDE_DS_SETLOCKED, 1720 MDE_DS_ULKSBADKEY, 1721 MDE_DS_LKSBADKEY, 1722 MDE_DS_WRITEWITHSULK, 1723 MDE_DS_SETCLEANUP, 1724 MDE_DS_CANTDELSELF, 1725 MDE_DS_HASMED, 1726 MDE_DS_TOOMANYALIAS, 1727 MDE_DS_ISMED, 1728 MDE_DS_ISNOTMED, 1729 MDE_DS_INVALIDMEDNAME, 1730 MDE_DS_ALIASNOMATCH, 1731 MDE_DS_NOMEDONHOST, 1732 MDE_DS_CANTDELMASTER, 1733 MDE_DS_NOTINMEMBERLIST, 1734 MDE_DS_MNCANTDELSELF, 1735 MDE_DS_RPCVERSMISMATCH, 1736 MDE_DS_WITHDRAWMASTER, 1737 MDE_DS_COMMDCTL_SUSPEND_NYD, 1738 MDE_DS_COMMDCTL_SUSPEND_FAIL, 1739 MDE_DS_COMMDCTL_REINIT_FAIL, 1740 MDE_DS_COMMDCTL_RESUME_FAIL, 1741 MDE_DS_NOTNOW_RECONFIG, 1742 MDE_DS_NOTNOW_CMD, 1743 MDE_DS_COMMD_SEND_FAIL, 1744 MDE_DS_MASTER_ONLY, 1745 MDE_DS_DRIVENOTONHOST, 1746 MDE_DS_CANTRESNARF, 1747 MDE_DS_INSUFQUORUM, 1748 MDE_DS_EXTENDEDNM, 1749 MDE_DS_PARTIALSET, 1750 MDE_DS_SINGLEHOST, 1751 MDE_DS_AUTONOTSET, 1752 MDE_DS_INVALIDDEVID, 1753 MDE_DS_SETNOTIMP, 1754 MDE_DS_NOTSELFIDENTIFY 1755 }; 1756 1757 % 1758 #if !defined(_KERNEL) 1759 struct md_ds_error_t { 1760 md_ds_errno_t errnum; 1761 set_t setno; 1762 string node<>; 1763 string drive<>; 1764 }; 1765 #else /* _KERNEL */ 1766 struct md_ds_error_t { 1767 md_ds_errno_t errnum; 1768 set_t setno; 1769 u_int xnode; 1770 u_int xdrive; 1771 }; 1772 #endif /* !_KERNEL */ 1773 1774 % 1775 %/* 1776 % * fundamental error type 1777 % */ 1778 enum md_errclass_t { 1779 MDEC_VOID = 0, /* simple error */ 1780 MDEC_SYS, /* system errno */ 1781 MDEC_RPC, /* RPC errno */ 1782 MDEC_DEV, /* device error */ 1783 MDEC_USE, /* use error */ 1784 MDEC_MD, /* metadevice error */ 1785 MDEC_COMP, /* component error */ 1786 MDEC_HSP, /* hotspare pool error */ 1787 MDEC_HS, /* hotspare error */ 1788 MDEC_MDDB, /* metadevice database error */ 1789 MDEC_DS, /* diskset error */ 1790 MDEC_OVERLAP /* overlap error */ 1791 }; 1792 1793 % 1794 %/* 1795 % * error info 1796 % */ 1797 union md_error_info_t 1798 switch (md_errclass_t errclass) { 1799 case MDEC_VOID: 1800 md_void_error_t void_error; 1801 case MDEC_SYS: 1802 md_sys_error_t sys_error; 1803 case MDEC_RPC: 1804 md_rpc_error_t rpc_error; 1805 case MDEC_DEV: 1806 md_dev_error_t dev_error; 1807 case MDEC_USE: 1808 md_use_error_t use_error; 1809 case MDEC_MD: 1810 md_md_error_t md_error; 1811 case MDEC_COMP: 1812 md_comp_error_t comp_error; 1813 case MDEC_HSP: 1814 md_hsp_error_t hsp_error; 1815 case MDEC_HS: 1816 md_hs_error_t hs_error; 1817 case MDEC_MDDB: 1818 md_mddb_error_t mddb_error; 1819 case MDEC_DS: 1820 md_ds_error_t ds_error; 1821 case MDEC_OVERLAP: 1822 md_overlap_error_t overlap_error; 1823 }; 1824 1825 % 1826 #if !defined(_KERNEL) 1827 struct md_error_t { 1828 md_error_info_t info; /* specific info */ 1829 string host<>; /* hostname */ 1830 string extra<>; /* extra context info */ 1831 string name<>; /* file or device name */ 1832 }; 1833 #else /* _KERNEL */ 1834 struct md_error_t { 1835 md_error_info_t info; /* specific info */ 1836 u_int xhost; /* hostname */ 1837 u_int xextra; /* extra context info */ 1838 u_int xname; /* file or device name */ 1839 }; 1840 #endif /* !_KERNEL */ 1841 %#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 1842 %#pragma pack() 1843 %#endif 1844 1845 #ifdef RPC_HDR 1846 % 1847 %/* 1848 % * Null error constant 1849 % */ 1850 %#define MDNULLERROR {{MDEC_VOID}, NULL, NULL, NULL} 1851 #endif /* RPC_HDR */ 1852 1853 #ifdef RPC_XDR 1854 %/* 1855 % * Constant null error struct. 1856 % */ 1857 %const md_error_t mdnullerror = MDNULLERROR; 1858 #endif /* RPC_XDR */ 1859 1860 #ifdef RPC_HDR 1861 % 1862 %/* 1863 % * External reference to constant null error struct. (declared in mdiox_xdr.c) 1864 % */ 1865 %extern const md_error_t mdnullerror; 1866 % 1867 %/* 1868 % * External declarations 1869 % */ 1870 %extern void mdclrerror(md_error_t *ep); /* clear error */ 1871 %extern int mdstealerror(md_error_t *to, md_error_t *from); 1872 % 1873 %#define mdiserror(ep, num) (((ep)->info.errclass == MDEC_VOID) &&\ 1874 % ((ep)->info.md_error_info_t_u.void_error.errnum == (num))) 1875 %#define mdisok(ep) mdiserror(ep, MDE_NONE) 1876 % 1877 %#define mdissyserror(ep, num) (((ep)->info.errclass == MDEC_SYS) && \ 1878 % ((ep)->info.md_error_info_t_u.sys_error.errnum == (num))) 1879 %#define mdisrpcerror(ep, num) (((ep)->info.errclass == MDEC_RPC) && \ 1880 % ((ep)->info.md_error_info_t_u.rpc_error.errnum == (num))) 1881 %#define mdisdeverror(ep, num) (((ep)->info.errclass == MDEC_DEV) && \ 1882 % ((ep)->info.md_error_info_t_u.dev_error.errnum == (num))) 1883 %#define mdisuseerror(ep, num) (((ep)->info.errclass == MDEC_USE) && \ 1884 % ((ep)->info.md_error_info_t_u.use_error.errnum == (num))) 1885 %#define mdismderror(ep, num) (((ep)->info.errclass == MDEC_MD) && \ 1886 % ((ep)->info.md_error_info_t_u.md_error.errnum == (num))) 1887 %#define mdiscomperror(ep, num) (((ep)->info.errclass == MDEC_COMP) &&\ 1888 % ((ep)->info.md_error_info_t_u.comp_error.errnum == (num))) 1889 %#define mdishsperror(ep, num) (((ep)->info.errclass == MDEC_HSP) && \ 1890 % ((ep)->info.md_error_info_t_u.hsp_error.errnum == (num))) 1891 %#define mdishserror(ep, num) (((ep)->info.errclass == MDEC_HS) && \ 1892 % ((ep)->info.md_error_info_t_u.hs_error.errnum == (num))) 1893 %#define mdismddberror(ep, num) (((ep)->info.errclass == MDEC_MDDB) &&\ 1894 % ((ep)->info.md_error_info_t_u.mddb_error.errnum == (num))) 1895 %#define mdisdserror(ep, num) (((ep)->info.errclass == MDEC_DS) && \ 1896 % ((ep)->info.md_error_info_t_u.ds_error.errnum == (num))) 1897 %#define mdisoverlaperror(ep, num) \ 1898 % (((ep)->info.errclass == MDEC_OVERLAP) && \ 1899 % ((ep)->info.md_error_info_t_u.ds_error.errnum == (num))) 1900 % 1901 %#define mdanysyserror(ep) ((ep)->info.errclass == MDEC_SYS) 1902 %#define mdanyrpcerror(ep) ((ep)->info.errclass == MDEC_RPC) 1903 %#define mdanydeverror(ep) ((ep)->info.errclass == MDEC_DEV) 1904 %#define mdanyuseerror(ep) ((ep)->info.errclass == MDEC_USE) 1905 %#define mdanymderror(ep) ((ep)->info.errclass == MDEC_MD) 1906 %#define mdanycomperror(ep) ((ep)->info.errclass == MDEC_COMP) 1907 %#define mdanyhsperror(ep) ((ep)->info.errclass == MDEC_HSP) 1908 %#define mdanyhserror(ep) ((ep)->info.errclass == MDEC_HS) 1909 %#define mdanymddberror(ep) ((ep)->info.errclass == MDEC_MDDB) 1910 %#define mdanydserror(ep) ((ep)->info.errclass == MDEC_DS) 1911 %#define mdanyoverlaperror(ep) ((ep)->info.errclass == MDEC_OVERLAP) 1912 % 1913 #ifdef _KERNEL 1914 % 1915 %extern int mderror(md_error_t *ep, md_void_errno_t errnum); 1916 %extern int mdsyserror(md_error_t *ep, int errnum); 1917 %extern int mddeverror(md_error_t *ep, md_dev_errno_t errnum, 1918 % md_dev64_t dev); 1919 %extern int mdmderror(md_error_t *ep, md_md_errno_t errnum, minor_t mnum); 1920 %extern int mdcomperror(md_error_t *ep, md_comp_errno_t errnum, 1921 % minor_t mnum, md_dev64_t dev); 1922 %extern int mdhsperror(md_error_t *ep, md_hsp_errno_t errnum, hsp_t hsp); 1923 %extern int mdhserror(md_error_t *ep, md_hs_errno_t errnum, 1924 % hsp_t hsp, md_dev64_t dev); 1925 %extern int mdmddberror(md_error_t *ep, md_mddb_errno_t errnum, 1926 % minor_t mnum, set_t setno); 1927 %extern int mddbstatus2error(md_error_t *ep, int status, minor_t mnum, 1928 % set_t setno); 1929 % 1930 #else /* ! _KERNEL */ 1931 % 1932 %extern int mderror(md_error_t *ep, md_void_errno_t errnum, char *name); 1933 %extern int mdsyserror(md_error_t *ep, int errnum, char *name); 1934 %extern int mdrpcerror(md_error_t *ep, CLIENT *clntp, char *host, 1935 % char *extra); 1936 %extern int mdrpccreateerror(md_error_t *ep, char *host, char *extra); 1937 %extern int mddeverror(md_error_t *ep, md_dev_errno_t errnum, 1938 % md_dev64_t dev, char *name); 1939 %extern int mduseerror(md_error_t *ep, md_use_errno_t errnum, 1940 % md_dev64_t dev, char *where, char *name); 1941 %extern int mdmderror(md_error_t *ep, md_md_errno_t errnum, minor_t mnum, 1942 % char *name); 1943 %extern int mdcomperror(md_error_t *ep, md_comp_errno_t errnum, 1944 % minor_t mnum, md_dev64_t dev, char *name); 1945 %extern int mdhsperror(md_error_t *ep, md_hsp_errno_t errnum, hsp_t hsp, 1946 % char *name); 1947 %extern int mdhserror(md_error_t *ep, md_hs_errno_t errnum, 1948 % hsp_t hsp, md_dev64_t dev, char *name); 1949 %extern int mdmddberror(md_error_t *ep, md_mddb_errno_t errnum, 1950 % minor_t mnum, set_t setno, size_t size, char *name); 1951 %extern int mddserror(md_error_t *ep, md_ds_errno_t errnum, set_t setno, 1952 % char *node, char *drive, char *name); 1953 %extern int mdoverlaperror(md_error_t *ep, md_overlap_errno_t errnum, 1954 % char *overlap, char *where, char *name); 1955 % 1956 %extern void mderrorextra(md_error_t *ep, char *extra); 1957 % 1958 #endif /* ! _KERNEL */ 1959 #endif /* RPC_HDR */ 1960 1961 /* 1962 * common unit structure 1963 */ 1964 struct mdc_unit { 1965 u_longlong_t un_revision; /* revision # (keep this a longlong) */ 1966 md_types_t un_type; /* type of record */ 1967 md_status_t un_status; /* status flags */ 1968 int un_parent_res; /* parent reserve index */ 1969 int un_child_res; /* child reserve index */ 1970 minor_t un_self_id; /* metadevice unit number */ 1971 mddb_recid_t un_record_id; /* db record id */ 1972 uint_t un_size; /* db record size for unit structure */ 1973 ushort_t un_flag; /* configuration info */ 1974 diskaddr_t un_total_blocks; /* external # blocks in metadevice */ 1975 diskaddr_t un_actual_tb; /* actual # blocks in metadevice */ 1976 uint_t un_nhead; /* saved value of # heads */ 1977 uint_t un_nsect; /* saved value of # sectors */ 1978 ushort_t un_rpm; /* saved value of rpm's */ 1979 ushort_t un_wr_reinstruct; /* worse case write reinstruct */ 1980 ushort_t un_rd_reinstruct; /* worse case read reinstruct */ 1981 mddb_recid_t un_vtoc_id; /* vtoc db record id */ 1982 md_stackcap_t un_capabilities; /* subdevice capabilities */ 1983 md_parent_t un_parent; /* -1 none, -2 many, positive unit # */ 1984 uint_t un_user_flags; /* provided for userland */ 1985 }; 1986 typedef struct mdc_unit mdc_unit_t; 1987 1988 /* 1989 * For old 32 bit format use only 1990 */ 1991 %#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 1992 %#pragma pack(4) 1993 %#endif 1994 struct mdc_unit32_od { 1995 u_longlong_t un_revision; 1996 md_types_t un_type; 1997 md_status_t un_status; 1998 int un_parent_res; 1999 int un_child_res; 2000 minor_t un_self_id; 2001 mddb_recid_t un_record_id; 2002 uint_t un_size; 2003 ushort_t un_flag; 2004 daddr32_t un_total_blocks; /* external # blocks in metadevice */ 2005 daddr32_t un_actual_tb; /* actual # blocks in metadevice */ 2006 ushort_t un_nhead; 2007 ushort_t un_nsect; 2008 ushort_t un_rpm; 2009 ushort_t un_wr_reinstruct; 2010 ushort_t un_rd_reinstruct; 2011 mddb_recid_t un_vtoc_id; 2012 md_stackcap_t un_capabilities; 2013 md_parent_t un_parent; 2014 uint_t un_user_flags; 2015 }; 2016 typedef struct mdc_unit32_od mdc_unit32_od_t; 2017 2018 struct md_unit { 2019 mdc_unit_t c; /* common stuff */ 2020 }; 2021 typedef struct md_unit md_unit_t; 2022 2023 enum sp_status_t { 2024 MD_SP_CREATEPEND, /* soft partition creation in progress */ 2025 MD_SP_GROWPEND, /* attach operation in progress */ 2026 MD_SP_DELPEND, /* delete operation in progress */ 2027 MD_SP_OK, /* soft partition is stable */ 2028 MD_SP_ERR, /* soft partition is errored */ 2029 MD_SP_RECOVER, /* recovery operation in progess */ 2030 MD_SP_LAST /* always the last entry */ 2031 }; 2032 2033 /* soft partition offsets and lengths are specified in sectors */ 2034 typedef u_longlong_t sp_ext_offset_t; 2035 typedef u_longlong_t sp_ext_length_t; 2036 struct mp_ext { 2037 sp_ext_offset_t un_voff; /* virtual offset */ 2038 sp_ext_offset_t un_poff; /* physical offset */ 2039 sp_ext_length_t un_len; /* length of extent */ 2040 }; 2041 typedef struct mp_ext mp_ext_t; 2042 2043 /* 2044 * mp_unit32_od is for old 32 bit format only 2045 */ 2046 struct mp_unit32_od { 2047 mdc_unit32_od_t c; /* common unit structure */ 2048 mdkey_t un_key; /* namespace key */ 2049 dev32_t un_dev; /* device number */ 2050 sp_ext_offset_t un_start_blk; /* start block, incl reserved space */ 2051 sp_status_t un_status; /* sp status */ 2052 uint_t un_numexts; /* number of extents */ 2053 sp_ext_length_t un_length; /* total length (in sectors) */ 2054 /* extent array. NOTE: sized dynamically! */ 2055 mp_ext_t un_ext[1]; 2056 }; 2057 typedef struct mp_unit32_od mp_unit32_od_t; 2058 2059 /* 2060 * softpart unit structure 2061 */ 2062 struct mp_unit { 2063 mdc_unit_t c; /* common unit structure */ 2064 mdkey_t un_key; /* namespace key */ 2065 md_dev64_t un_dev; /* device number, 64 bit */ 2066 sp_ext_offset_t un_start_blk; /* start block, incl reserved space */ 2067 sp_status_t un_status; /* sp status */ 2068 uint_t un_numexts; /* number of extents */ 2069 sp_ext_length_t un_length; /* total length (in sectors) */ 2070 /* extent array. NOTE: sized dynamically! */ 2071 mp_ext_t un_ext[1]; 2072 }; 2073 typedef struct mp_unit mp_unit_t; 2074 2075 /* 2076 * ioctl structures used when passing ioctls via rpc.mdcommd 2077 */ 2078 struct md_driver { 2079 char md_drivername[MD_MAXDRVNM]; 2080 set_t md_setno; 2081 }; 2082 typedef struct md_driver md_driver_t; 2083 2084 %#define MD_DRIVER md_driver_t md_driver; 2085 #define MD_DRIVER md_driver_t md_driver; 2086 2087 struct md_set_params { 2088 MD_DRIVER 2089 md_error_t mde; 2090 minor_t mnum; 2091 md_types_t type; 2092 uint_t size; 2093 int options; 2094 uint64_t mdp; /* Contains pointer */ 2095 }; 2096 typedef struct md_set_params md_set_params_t; 2097 %#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 2098 %#pragma pack() 2099 %#endif 2100 2101 2102