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% */ 56enum 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% */ 74enum 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% */ 92enum 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% */ 103enum 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% */ 129enum 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% */ 141enum 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% */ 150enum 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% */ 175const 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 187const 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) 200struct 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 */ 213struct 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 240struct 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 253const MD_MNNODE_RECORD_REVISION = 0x00000100; 254 255const 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) 278struct 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 */ 296struct 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 315struct 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 */ 350struct 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 */ 362typedef minor_t unit_t; 363 364% 365%/* component ID */ 366struct comp_t { 367 minor_t mnum; /* associated metadevice */ 368 md_dev64_t dev; 369}; 370 371% 372%/* hotspare pool ID */ 373typedef 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 */ 382struct hs_t { 383 hsp_t hsp; /* associated hotspare pool */ 384 md_dev64_t dev; /* device ID */ 385}; 386 387% 388%/* mnum or hsp */ 389typedef u_int minor_or_hsp_t; 390 391% 392%/* 393% * name service stuff 394% */ 395const MD_MAXPREFIX = 127; 396% 397%#define MD_MAX_CTDLEN 64 398 399struct md_name_prefix { 400 u_char pre_len; 401 char pre_data[MD_MAXPREFIX]; 402}; 403 404const MD_MAXSUFFIX = 40; 405% 406struct md_name_suffix { 407 u_char suf_prefix; 408 u_char suf_len; 409 char suf_data[MD_MAXSUFFIX]; 410}; 411 412struct 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% */ 429const MD_BITSSET = 5; 430const 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% */ 443const MD_NO_LOCK = -2; 444 445% 446%/* 447% * accumulated setname 448% */ 449struct 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 458struct 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 479struct 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) */ 497struct 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 513struct mdnamelist_t { 514 mdnamelist_t *next; 515 mdname_t *namep; 516}; 517 518% 519%/* 520% * drive name 521% */ 522%/* name types */ 523enum 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 */ 533enum 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% */ 557enum 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 */ 579struct 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) */ 590struct 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 599struct 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 611struct 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) */ 620struct 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 628struct 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) */ 638struct 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% */ 648struct mdsidenames_t { 649 mdsidenames_t *next; 650 side_t sideno; 651 minor_t mnum; 652 string dname<>; 653 string cname<>; 654}; 655 656struct 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% */ 687struct 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}; 707struct mddrivenamelist_t { 708 mddrivenamelist_t *next; 709 mddrivename_t *drivenamep; 710}; 711 712% 713%/* 714% * replica struct 715% */ 716typedef 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 */ 775struct 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 785struct 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 793struct 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% */ 802struct 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% */ 816struct 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 826struct 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 837struct 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% */ 914struct 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% */ 929struct 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 938struct 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% */ 954typedef 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% */ 968typedef 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 976typedef 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 */ 988struct 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 */ 1006struct ms_params_t { 1007 int change_hsp_id; 1008 hsp_t hsp_id; 1009}; 1010 1011/* 1012 * unit structure 1013 */ 1014typedef 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 1027struct 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 1035struct md_row_t { 1036 diskaddr_t interlace; 1037 diskaddr_t row_size; 1038 md_comp_t comps<>; 1039}; 1040 1041struct 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% */ 1051typedef uint64_t xsp_offset_t; 1052typedef uint64_t xsp_length_t; 1053typedef 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 1063struct md_sp_ext_t { 1064 xsp_offset_t voff; 1065 xsp_offset_t poff; 1066 xsp_length_t len; 1067}; 1068 1069struct 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 */ 1083enum mm_wr_opt_t { 1084 WR_PARALLEL = 0, /* write submirrors in parallel */ 1085 WR_SERIAL /* write submirrors one at a time */ 1086}; 1087 1088enum 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 1094typedef short mm_pass_num_t; 1095const MD_PASS_DEFAULT = 1; 1096const MD_PASS_MAX = 9; 1097 1098struct 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 */ 1110typedef 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 1127typedef 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 1134struct 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 1156const NMIRROR = 4; 1157struct 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% */ 1175typedef 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 1188typedef 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 1198typedef u_int mt_debug_t; /* values in md_trans.h */ 1199 1200struct 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 */ 1221struct mr_params_t { 1222 int change_hsp_id; 1223 hsp_t hsp_id; 1224}; 1225 1226/* 1227 * unit structure 1228 */ 1229enum 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 1240typedef 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 1256struct 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 1264enum 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 1274typedef 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 1288const MD_RAID_MIN = 3; 1289struct 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 */ 1311struct md_shared_t { 1312 md_common_t common; 1313}; 1314 1315% 1316%/* 1317% * hotspare 1318% */ 1319/* 1320 * ioctl stuff 1321 */ 1322enum hotspare_states_t { 1323 HSS_UNUSED, HSS_AVAILABLE, HSS_RESERVED, HSS_BROKEN 1324}; 1325 1326/* 1327 * unit structure 1328 */ 1329struct 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 1337struct 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% */ 1351enum 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 1411struct md_void_error_t { 1412 md_void_errno_t errnum; 1413}; 1414 1415% 1416%/* 1417% * system errors 1418% */ 1419struct md_sys_error_t { 1420 int errnum; 1421}; 1422 1423% 1424%/* 1425% * RPC errors 1426% */ 1427struct md_rpc_error_t { 1428 enum clnt_stat errnum; 1429}; 1430 1431% 1432%/* 1433% * device errors 1434% */ 1435enum 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 1463struct 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% */ 1472enum 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) 1481struct md_overlap_error_t { 1482 md_overlap_errno_t errnum; 1483 string where<>; 1484 string overlap<>; 1485}; 1486#else 1487struct 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% */ 1498enum 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) 1507struct md_use_error_t { 1508 md_use_errno_t errnum; 1509 md_dev64_t dev; 1510 string where<>; 1511}; 1512#else 1513struct 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% */ 1524enum 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 1590struct md_md_error_t { 1591 md_md_errno_t errnum; 1592 minor_t mnum; 1593}; 1594 1595% 1596%/* 1597% * component errors 1598% */ 1599enum 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 1609struct md_comp_error_t { 1610 md_comp_errno_t errnum; 1611 comp_t comp; 1612}; 1613 1614% 1615%/* 1616% * hotspare pool errors 1617% */ 1618enum 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 1629struct md_hsp_error_t { 1630 md_hsp_errno_t errnum; 1631 hsp_t hsp; 1632}; 1633 1634% 1635%/* 1636% * hotspare errors 1637% */ 1638enum 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 1645struct md_hs_error_t { 1646 md_hs_errno_t errnum; 1647 hs_t hs; 1648}; 1649 1650% 1651%/* 1652% * MDDB errors 1653% */ 1654enum 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% 1682struct 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% */ 1693enum 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) 1759struct md_ds_error_t { 1760 md_ds_errno_t errnum; 1761 set_t setno; 1762 string node<>; 1763 string drive<>; 1764}; 1765#else /* _KERNEL */ 1766struct 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% */ 1778enum 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% */ 1797union md_error_info_t 1798switch (md_errclass_t errclass) { 1799case MDEC_VOID: 1800 md_void_error_t void_error; 1801case MDEC_SYS: 1802 md_sys_error_t sys_error; 1803case MDEC_RPC: 1804 md_rpc_error_t rpc_error; 1805case MDEC_DEV: 1806 md_dev_error_t dev_error; 1807case MDEC_USE: 1808 md_use_error_t use_error; 1809case MDEC_MD: 1810 md_md_error_t md_error; 1811case MDEC_COMP: 1812 md_comp_error_t comp_error; 1813case MDEC_HSP: 1814 md_hsp_error_t hsp_error; 1815case MDEC_HS: 1816 md_hs_error_t hs_error; 1817case MDEC_MDDB: 1818 md_mddb_error_t mddb_error; 1819case MDEC_DS: 1820 md_ds_error_t ds_error; 1821case MDEC_OVERLAP: 1822 md_overlap_error_t overlap_error; 1823}; 1824 1825% 1826#if !defined(_KERNEL) 1827struct 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 */ 1834struct 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 */ 1964struct 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}; 1986typedef 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 1994struct 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}; 2016typedef struct mdc_unit32_od mdc_unit32_od_t; 2017 2018struct md_unit { 2019 mdc_unit_t c; /* common stuff */ 2020}; 2021typedef struct md_unit md_unit_t; 2022 2023enum 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 */ 2034typedef u_longlong_t sp_ext_offset_t; 2035typedef u_longlong_t sp_ext_length_t; 2036struct 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}; 2041typedef struct mp_ext mp_ext_t; 2042 2043/* 2044 * mp_unit32_od is for old 32 bit format only 2045 */ 2046struct 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}; 2057typedef struct mp_unit32_od mp_unit32_od_t; 2058 2059/* 2060 * softpart unit structure 2061 */ 2062struct 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}; 2073typedef struct mp_unit mp_unit_t; 2074 2075/* 2076 * ioctl structures used when passing ioctls via rpc.mdcommd 2077 */ 2078struct md_driver { 2079 char md_drivername[MD_MAXDRVNM]; 2080 set_t md_setno; 2081}; 2082typedef 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 2087struct 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}; 2096typedef 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