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.
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.
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]
23 % * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
24 % * Use is subject to license terms.
27 %#pragma ident "%Z%%M% %I% %E% SMI"
30 % * MDD interface definitions
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>
40 %#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
42 % * NOTE: can't change these structures so make sure they are packed
54 % * NOTE: THESE ARE ON-DISK VALUES DO NOT CHANGE THE ORDER
67 MDDB_FIRST_MODID = 1000
72 % * Configuration commands.
90 % * Return codes from DB record operations.
92 enum mddb_recstatus_t {
101 % * Commands for DB accesses from user land.
103 enum mddb_usercmd_t {
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
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
129 enum mddb_userrec_t {
139 % * MDDB_USER record get commands.
141 enum md_ur_get_cmd_t {
148 % * These are the options for mddb_createrec()
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,
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,
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.
179 %/* Start - Avoid duplicate definitions, but get the xdr calls right */
181 #include "meta_arr.x"
183 %/* End - Avoid duplicate definitions, but get the xdr calls right */
187 const MD_DRIVE_RECORD_REVISION = 0x00010000;
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
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 */
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 */
225 #endif /* !_KERNEL */
229 % * Actions that can be taken on a node record.
230 % * Used with routine upd_nr_flags.
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 */
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 */
253 const MD_MNNODE_RECORD_REVISION = 0x00000100;
255 const MD_SET_RECORD_REVISION = 0x00010000;
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 | \
273 % MD_SR_UNRSLV_REPLICATED | \
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 */
283 md_set_record *sr_next; /* next ptr (Incore) */
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 */
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 */
301 u_int sr_next; /* next ptr (Incore) */
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 */
313 #endif /* !_KERNEL */
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 */
320 md_set_record *sr_next; /* next ptr (Incore) */
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 */
328 /* first node always */
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 */
343 %#define MD_SETOWNER_NO 0
344 %#define MD_SETOWNER_YES 1
345 %#define MD_SETOWNER_NONE 2
354 md_timeval32_t sk_key;
356 struct md_setkey_t *sk_next;
362 typedef minor_t unit_t;
367 minor_t mnum; /* associated metadevice */
372 %/* hotspare pool ID */
377 %#define MD_HSP_NONE ((hsp_t)~0U)
383 hsp_t hsp; /* associated hotspare pool */
384 md_dev64_t dev; /* device ID */
389 typedef u_int minor_or_hsp_t;
393 % * name service stuff
395 const MD_MAXPREFIX = 127;
397 %#define MD_MAX_CTDLEN 64
399 struct md_name_prefix {
401 char pre_data[MD_MAXPREFIX];
404 const MD_MAXSUFFIX = 40;
406 struct md_name_suffix {
409 char suf_data[MD_MAXSUFFIX];
412 struct md_splitname {
413 md_name_prefix sn_prefix;
414 md_name_suffix sn_suffix;
419 %#define SPN_PREFIX(spn) ((spn)->sn_prefix)
420 %#define SPN_SUFFIX(spn) ((spn)->sn_suffix)
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.
429 const MD_BITSSET = 5;
430 const MD_DEFAULTSETS = 4;
434 %#define MD_MAXSETS (1 << MD_BITSSET)
435 %#define MD_SETMASK (MD_MAXSETS - 1)
440 % * Define a file descriptor for lockfd
441 % * when the lock is not held.
443 const MD_NO_LOCK = -2;
447 % * accumulated setname
450 string setname<>; /* logical name */
451 set_t setno; /* set number */
453 struct md_set_desc *setdesc; /* Cache set/drive desc */
454 int lockfd; /* used by meta_lock_* */
458 struct mdsetnamelist_t {
459 mdsetnamelist_t *next;
468 %#define MD_FULLNAME_ONLY 0x0
469 %#define MD_BASICNAME_OK 0x1
470 %#define MD_BYPASS_DAEMON 0x2
476 %#define MD_MAX_PARTS 17
481 struct mddrivename_t *drivenamep; /* back pointer to drive */
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) */
490 mdkey_t key; /* namespace key (or MD_KEYBAD) */
492 diskaddr_t end_blk; /* end of database replicas (or -1) */
493 diskaddr_t start_blk; /* usable start block (or -1) */
496 %/* name structure (old style) */
499 struct o_mddrivename_t *drivenamep; /* back pointer to drive */
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) */
507 mdkey_t key; /* namespace key (or MD_KEYBAD) */
509 daddr_t end_blk; /* end of database replicas (or -1) */
510 daddr_t start_blk; /* usable start block (or -1) */
513 struct mdnamelist_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) */
532 %/* metadevice types */
542 %/* SVM general device types
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
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.
557 enum meta_device_type_t {
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"
578 %/* generic device info */
584 u_int write_reinstruct;
585 u_int read_reinstruct;
589 %/* generic device info (old style) */
595 u_int write_reinstruct;
596 u_int read_reinstruct;
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) */
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) */
619 %/* partition information (old style) */
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) */
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) */
637 %/* vtoc information (old style) */
639 char *typename; /* disk type (or NULL) */
641 o_mdpart_t parts[16]; /* room for i386 too */
645 % * List of drivename cnames per side,
646 % * also the driver name, mnum (for slice 7).
648 struct mdsidenames_t {
656 struct mddrivename_t {
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
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*/
677 string miscname<>; /* metadevice misc name */
679 struct md_common_t *unitp; /* metadevice unit structure */
684 % * old version of mddrivename_t that contains an old version of mdgeom_t,
685 % * mdvtoc_t and mdname_t (prefixed _o).
687 struct o_mddrivename_t {
689 string cachenm<>; /* name used for cache lookups */
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*/
702 string miscname<>; /* metadevice misc name */
704 struct md_common_t *unitp; /* metadevice unit structure */
707 struct mddrivenamelist_t {
708 mddrivenamelist_t *next;
709 mddrivename_t *drivenamep;
716 typedef u_int replica_flags_t;
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 */
740 % * These are used in de_flags only
741 % * Do not change these values, they are stored on-disk
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 */
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))
759 % * See meta_prbits() in SUNWmd/lib/libmeta/meta_print.c for a description of
760 % * the way this is used
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"
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.
775 struct md_replica_t {
777 replica_flags_t r_flags;
781 char r_driver_name[MD_MAXDRVNM];
782 char r_minor_name[MDDB_MINOR_NAME_MAX];
785 struct md_replica_recerr_t {
790 char r_driver_name[MD_MAXDRVNM];
793 struct md_replicalist_t {
794 md_replicalist_t *rl_next;
795 md_replica_t *rl_repp;
800 % * set/drive structs exposed by the library routines
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 */
814 % * set/drive structs exposed by the library routines (old style)
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 */
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 */
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 */
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.
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)
870 % * Define to determine if diskset is a Auto-Take diskset.
872 %#define MD_ATSET_DESC(sd) (((sd)->sd_flags & MD_SR_AUTO_TAKE) ? 1 : 0)
875 % * Define to set the alive flag for a node. A node is alive if it
876 % * is in the multi_node membership list.
878 %#define MD_MN_NODE_ALIVE 0x0001
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.
884 %#define MD_MN_NODE_OWN 0x0002
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
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
905 % * Define for invalid node id. Used specifically to set mn set record
906 % * master nodeid to invalid when no master can be determined.
908 %#define MD_MN_INVALID_NID 0xfffffffful /* invalid node id */
912 % * set description (old style)
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 */
927 % * hotspare pool name
930 string hspname<>; /* hotspare pool name */
931 hsp_t hsp; /* number */
934 struct md_hsp_t *unitp; /* hotspare pool unit structure */
938 struct mdhspnamelist_t {
939 mdhspnamelist_t *next;
940 mdhspname_t *hspnamep;
945 % * generic metadevice descriptions for status and init
950 % * following used with un_status
951 % * bottom 16 bits are global definitions
952 % * top 16 bits are defined by sub device
954 typedef u_int md_status_t;
957 %#define MD_UN_GROW_PENDING 0x0008 /* grow mirror pending */
958 %#define MD_UN_BEING_RESET 0x0040 /* reset at snarf time */
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.
968 typedef unit_t md_parent_t;
971 %#define MD_NO_PARENT 0xffffffffu
972 %#define MD_MULTI_PARENT 0xfffffffeu
973 %#define MD_HAS_PARENT(p) ((p) != MD_NO_PARENT)
976 typedef u_int md_stackcap_t;
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 */
987 /* common to all metadevices */
992 md_stackcap_t capabilities;
996 u_longlong_t revision;
1006 struct ms_params_t {
1014 typedef u_int comp_state_t;
1017 %#define CS_OKAY 0x0001
1018 %#define CS_ERRED 0x0002
1019 %#define CS_RESYNC 0x0004
1020 %#define CS_LAST_ERRED 0x0008
1022 %/* interlace values (in bytes) */
1023 %#define MININTERLACE (16 * 512)
1024 %#define MAXINTERLACE (100 * 1024 * 1024)
1025 #endif /* RPC_HDR */
1028 mdname_t *compnamep;
1032 md_timeval32_t timestamp;
1036 diskaddr_t interlace;
1037 diskaddr_t row_size;
1041 struct md_stripe_t {
1043 mdhspname_t *hspnamep;
1051 typedef uint64_t xsp_offset_t;
1052 typedef uint64_t xsp_length_t;
1053 typedef u_int xsp_status_t;
1055 %#define SP_INIT 0x0001
1056 %#define SP_OK 0x0002
1057 %#define SP_LASTERR 0x0004
1063 struct md_sp_ext_t {
1071 mdname_t *compnamep; /* name of this component */
1072 xsp_status_t status; /* state of this soft partition */
1084 WR_PARALLEL = 0, /* write submirrors in parallel */
1085 WR_SERIAL /* write submirrors one at a time */
1089 RD_LOAD_BAL = 0, /* read submirrors roundrobin */
1090 RD_GEOMETRY, /* read submirrors geometrically */
1091 RD_FIRST /* read first submirror */
1094 typedef short mm_pass_num_t;
1095 const MD_PASS_DEFAULT = 1;
1096 const MD_PASS_MAX = 9;
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;
1110 typedef u_int sm_state_t;
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 */
1127 typedef u_int sm_flags_t;
1130 %#define MD_SM_RESYNC_TARGET 0x0001
1131 %#define MD_SM_FAILFAST 0x0002
1132 #endif /* RPC_HDR */
1134 struct md_submirror_t {
1135 mdname_t *submirnamep;
1138 md_timeval32_t timestamp;
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 | \
1154 #endif /* RPC_HDR */
1157 struct md_mirror_t {
1159 mm_rd_opt_t read_option;
1160 mm_wr_opt_t write_option;
1161 mm_pass_num_t pass_num;
1164 md_submirror_t submirrors[NMIRROR];
1175 typedef u_int mt_flags_t;
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 */
1188 typedef u_int mt_l_error_t;
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 */
1198 typedef u_int mt_debug_t; /* values in md_trans.h */
1202 mdname_t *masternamep;
1205 md_timeval32_t timestamp;
1206 mt_l_error_t log_error;
1207 md_timeval32_t log_timestamp;
1221 struct mr_params_t {
1234 RCS_LAST_ERRED = 0x8,
1236 RCS_INIT_ERRED = 0x20,
1240 typedef u_int rcs_flags_t;
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 */
1256 struct md_raidcol_t {
1261 md_timeval32_t timestamp;
1269 RUS_LAST_ERRED = 0x8,
1274 typedef u_int md_riflags_t;
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 */
1288 const MD_RAID_MIN = 3;
1292 md_timeval32_t timestamp;
1293 diskaddr_t interlace;
1294 diskaddr_t column_size;
1296 mdhspname_t *hspnamep;
1297 md_riflags_t resync_flags;
1301 md_raidcol_t cols<>;
1311 struct md_shared_t {
1322 enum hotspare_states_t {
1323 HSS_UNUSED, HSS_AVAILABLE, HSS_RESERVED, HSS_BROKEN
1331 hotspare_states_t state;
1333 md_timeval32_t timestamp;
1334 u_longlong_t revision;
1338 mdhspname_t *hspnamep;
1340 md_hs_t hotspares<>;
1345 % * specific error info
1351 enum md_void_errno_t {
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 */
1411 struct md_void_error_t {
1412 md_void_errno_t errnum;
1419 struct md_sys_error_t {
1427 struct md_rpc_error_t {
1428 enum clnt_stat errnum;
1435 enum md_dev_errno_t {
1437 MDE_FIX_INVAL_STATE,
1438 MDE_FIX_INVAL_HS_STATE,
1449 MDE_NO_DB, /* Replica not on device given */
1450 MDE_CANTVERIFY_VTOC,
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 */
1463 struct md_dev_error_t {
1464 md_dev_errno_t errnum;
1465 md_dev64_t dev; /* 64 bit fixed size */
1472 enum md_overlap_errno_t {
1473 MDE_OVERLAP_MOUNTED = 1,
1480 #if !defined(_KERNEL)
1481 struct md_overlap_error_t {
1482 md_overlap_errno_t errnum;
1487 struct md_overlap_error_t {
1488 md_overlap_errno_t errnum;
1492 #endif /* !_KERNEL */
1498 enum md_use_errno_t {
1506 #if !defined(_KERNEL)
1507 struct md_use_error_t {
1508 md_use_errno_t errnum;
1513 struct md_use_error_t {
1514 md_use_errno_t errnum;
1522 % * metadevice errors
1524 enum md_md_errno_t {
1527 MDE_UNIT_ALREADY_SETUP,
1532 MDE_C_WITH_INVAL_SM,
1543 MDE_SM_FAILED_COMPS,
1544 MDE_ILLEGAL_SM_STATE,
1546 MDE_MIRROR_OPEN_FAILURE,
1547 MDE_MIRROR_THREAD_FAILURE,
1562 MDE_RAID_OPEN_FAILURE,
1563 MDE_RAID_THREAD_FAILURE,
1564 MDE_RAID_NEED_FORCE,
1567 MDE_RAID_LAST_ERRED,
1570 MDE_RENAME_SOURCE_BAD,
1571 MDE_RENAME_TARGET_BAD,
1572 MDE_RENAME_TARGET_UNRELATED,
1573 MDE_RENAME_CONFIG_ERROR,
1587 MDE_IN_UNAVAIL_STATE
1590 struct md_md_error_t {
1591 md_md_errno_t errnum;
1597 % * component errors
1599 enum md_comp_errno_t {
1600 MDE_CANT_FIND_COMP = 1,
1601 MDE_REPL_INVAL_STATE,
1604 MDE_RAID_COMP_ERRED,
1606 MDE_SP_COMP_OPEN_ERR
1609 struct md_comp_error_t {
1610 md_comp_errno_t errnum;
1616 % * hotspare pool errors
1618 enum md_hsp_errno_t {
1619 MDE_HSP_CREATE_FAILURE = 1,
1624 MDE_HSP_ALREADY_SETUP,
1626 MDE_HSP_UNIT_TOO_LARGE
1629 struct md_hsp_error_t {
1630 md_hsp_errno_t errnum;
1638 enum md_hs_errno_t {
1640 MDE_HS_CREATE_FAILURE,
1642 MDE_HS_UNIT_TOO_LARGE
1645 struct md_hs_error_t {
1646 md_hs_errno_t errnum;
1654 enum md_mddb_errno_t {
1655 MDE_TOOMANY_REPLICAS = 1,
1656 MDE_REPLICA_TOOSMALL,
1682 struct md_mddb_error_t {
1683 md_mddb_errno_t errnum;
1684 minor_t mnum; /* associated metadevice */
1691 % * diskset (ds) errors
1693 enum md_ds_errno_t {
1701 MDE_DS_NODEISNOTOWNER,
1703 MDE_DS_NODENOTINSET,
1705 MDE_DS_SETNUMNOTAVAIL,
1707 MDE_DS_DRIVENOTCOMMON,
1709 MDE_DS_DRIVENOTINSET,
1712 MDE_DS_INVALIDSETNAME,
1714 MDE_DS_SIDENUMNOTAVAIL,
1715 MDE_DS_SETNAMETOOLONG,
1716 MDE_DS_NODENAMETOOLONG,
1717 MDE_DS_OHACANTDELSELF,
1722 MDE_DS_WRITEWITHSULK,
1726 MDE_DS_TOOMANYALIAS,
1729 MDE_DS_INVALIDMEDNAME,
1730 MDE_DS_ALIASNOMATCH,
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,
1743 MDE_DS_COMMD_SEND_FAIL,
1745 MDE_DS_DRIVENOTONHOST,
1752 MDE_DS_INVALIDDEVID,
1754 MDE_DS_NOTSELFIDENTIFY
1758 #if !defined(_KERNEL)
1759 struct md_ds_error_t {
1760 md_ds_errno_t errnum;
1766 struct md_ds_error_t {
1767 md_ds_errno_t errnum;
1772 #endif /* !_KERNEL */
1776 % * fundamental error type
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 */
1797 union md_error_info_t
1798 switch (md_errclass_t errclass) {
1800 md_void_error_t void_error;
1802 md_sys_error_t sys_error;
1804 md_rpc_error_t rpc_error;
1806 md_dev_error_t dev_error;
1808 md_use_error_t use_error;
1810 md_md_error_t md_error;
1812 md_comp_error_t comp_error;
1814 md_hsp_error_t hsp_error;
1816 md_hs_error_t hs_error;
1818 md_mddb_error_t mddb_error;
1820 md_ds_error_t ds_error;
1822 md_overlap_error_t overlap_error;
1826 #if !defined(_KERNEL)
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 */
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 */
1840 #endif /* !_KERNEL */
1841 %#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
1848 % * Null error constant
1850 %#define MDNULLERROR {{MDEC_VOID}, NULL, NULL, NULL}
1851 #endif /* RPC_HDR */
1855 % * Constant null error struct.
1857 %const md_error_t mdnullerror = MDNULLERROR;
1858 #endif /* RPC_XDR */
1863 % * External reference to constant null error struct. (declared in mdiox_xdr.c)
1865 %extern const md_error_t mdnullerror;
1868 % * External declarations
1870 %extern void mdclrerror(md_error_t *ep); /* clear error */
1871 %extern int mdstealerror(md_error_t *to, md_error_t *from);
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)
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)))
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)
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,
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,
1930 #else /* ! _KERNEL */
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,
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,
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,
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);
1956 %extern void mderrorextra(md_error_t *ep, char *extra);
1958 #endif /* ! _KERNEL */
1959 #endif /* RPC_HDR */
1962 * common unit structure
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 */
1986 typedef struct mdc_unit mdc_unit_t;
1989 * For old 32 bit format use only
1991 %#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
1994 struct mdc_unit32_od {
1995 u_longlong_t un_revision;
1997 md_status_t un_status;
2001 mddb_recid_t un_record_id;
2004 daddr32_t un_total_blocks; /* external # blocks in metadevice */
2005 daddr32_t un_actual_tb; /* actual # blocks in metadevice */
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;
2016 typedef struct mdc_unit32_od mdc_unit32_od_t;
2019 mdc_unit_t c; /* common stuff */
2021 typedef struct md_unit md_unit_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 */
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;
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 */
2041 typedef struct mp_ext mp_ext_t;
2044 * mp_unit32_od is for old 32 bit format only
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! */
2057 typedef struct mp_unit32_od mp_unit32_od_t;
2060 * softpart unit structure
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! */
2073 typedef struct mp_unit mp_unit_t;
2076 * ioctl structures used when passing ioctls via rpc.mdcommd
2079 char md_drivername[MD_MAXDRVNM];
2082 typedef struct md_driver md_driver_t;
2084 %#define MD_DRIVER md_driver_t md_driver;
2085 #define MD_DRIVER md_driver_t md_driver;
2087 struct md_set_params {
2094 uint64_t mdp; /* Contains pointer */
2096 typedef struct md_set_params md_set_params_t;
2097 %#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4