7712 mandoc -Tlint does always exit with error code 0
[unleashed.git] / usr / src / uts / common / sys / lvm / mdiox.x
blob5e5c890e5318bdb77acb5b91303dab5cdaf9b076
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 % */
22 %/*
23 % * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24 % * Use is subject to license terms.
25 % */
27 %#pragma ident  "%Z%%M% %I%     %E% SMI"
29 %/*
30 % *     MDD interface definitions
31 % */
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
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
48 %/*
49 % * fundamental types
50 % */
52 %/*
53 % *
54 % * NOTE: THESE ARE ON-DISK VALUES DO NOT CHANGE THE ORDER
55 % */
56 enum mddb_type_t {
57         MDDB_ALL,
58         MDDB_NM_HDR,
59         MDDB_NM,
60         MDDB_SHR_NM,
61         MDDB_VTOC,
62         MDDB_USER,
63         MDDB_DID_NM_HDR,
64         MDDB_DID_NM,
65         MDDB_DID_SHR_NM,
66         MDDB_EFILABEL,
67         MDDB_FIRST_MODID = 1000
71 %/*
72 % * Configuration commands.
73 % */
74 enum mddb_cfgcmd_t {
75         MDDB_USEDEV,
76         MDDB_NEWDEV,
77         MDDB_DELDEV,
78         MDDB_GETDEV,
79         MDDB_ENDDEV,
80         MDDB_GETDRVRNAME,
81         MDDB_RELEASESET,
82         MDDB_NEWSIDE,
83         MDDB_DELSIDE,
84         MDDB_SETDID,
85         MDDB_LBINITTIME
89 %/*
90 % * Return codes from DB record operations.
91 % */
92 enum mddb_recstatus_t {
93         MDDB_NORECORD,
94         MDDB_NODATA,
95         MDDB_OK,
96         MDDB_STALE
101 % * Commands for DB accesses from user land.
102 % */
103 enum mddb_usercmd_t {
104         MD_DB_GETNEXTREC,
105         MD_DB_COMMIT_ONE,
106         MD_DB_COMMIT_MANY,
107         MD_DB_GETDATA,
108         MD_DB_DELETE,
109         MD_DB_CREATE,
110         MD_DB_GETSTATUS,
111         MD_DB_GETSIZE,
112         MD_DB_SETDATA,
113         MD_DB_MAKEID
118 % * MDDB_USER record subtypes, set records and drive records.
119 % * Node records (NR) used for Multinode Disksets.
120 % * The MDDB_UR_SR record subtype is associated with the structures
121 % * md_set_record and md_mnset_record.
122 % * The MDDB_UR_DR record subtype is associated with the structure
123 % * md_drive_record.
124 % * The MDDB_NR_DR record subtype is associated with the structure
125 % * md_mnnode_record.
126 % * The MDDB_UR_LR record subtype is associated with the structure
127 % * md_mn_changelog_record_t
128 % */
129 enum mddb_userrec_t {
130         MDDB_UR_ALL,
131         MDDB_UR_SR,
132         MDDB_UR_DR,
133         MDDB_UR_NR,
134         MDDB_UR_LR
139 % * MDDB_USER record get commands.
140 % */
141 enum md_ur_get_cmd_t {
142         MD_UR_GET_NEXT,
143         MD_UR_GET_WKEY
148 % * These are the options for mddb_createrec()
149 % */
150 enum md_create_rec_option_t {
151         MD_CRO_NOOPT            = 0x000,
152         MD_CRO_OPTIMIZE         = 0x001,
153         MD_CRO_32BIT            = 0x002,
154         MD_CRO_64BIT            = 0x004,
155         MD_CRO_STRIPE           = 0x008,
156         MD_CRO_MIRROR           = 0x010,
157         MD_CRO_RAID             = 0x020,
158         MD_CRO_SOFTPART         = 0x040,
159         MD_CRO_TRANS_MASTER     = 0x080,
160         MD_CRO_TRANS_LOG        = 0x100,
161         MD_CRO_HOTSPARE         = 0x200,
162         MD_CRO_HOTSPARE_POOL    = 0x400,
163         MD_CRO_CHANGELOG        = 0x800,
164         MD_CRO_FN               = 0x1000
169 % * This SKEW value is used to skew the sideno of
170 % * the share device names that are put into each
171 % * local set's namespace.  This will prevent the
172 % * wrong name to be picked up via a devno, when
173 % * we really wanted a local device name.
174 % */
175 const   SKEW = 1;
177 #ifdef  RPC_XDR
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 */
185 #endif  /* RPC_XDR */
187 const   MD_DRIVE_RECORD_REVISION = 0x00010000;
189 #ifdef RPC_HDR
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 */
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 */
212 #else /* _KERNEL */
213 struct md_drive_record {
214         u_int                   dr_revision;    /* revision level */
215         u_int                   dr_flags;       /* state flags */
216         mddb_recid_t            dr_selfid;      /* db record id */
217         md_timeval32_t          dr_ctime;       /* creation timestamp */
218         u_int                   dr_genid;       /* generation id */
219         u_int                   dr_next;        /* next ptr (Incore) */
220         mddb_recid_t            dr_nextrec;     /* next record id */
221         int                     dr_dbcnt;       /* # of replica's */
222         int                     dr_dbsize;      /* replica size */
223         mdkey_t                 dr_key;         /* namespace key */
225 #endif /* !_KERNEL */
227 #ifdef RPC_HDR
229 % * Actions that can be taken on a node record.
230 % * Used with routine upd_nr_flags.
231 % */
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 */
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;
257 #ifdef RPC_HDR
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 */
277 #if !defined(_KERNEL)
278 struct md_set_record {
279         u_int                   sr_revision;            /* revision level */
280         u_int                   sr_flags;               /* state flags */
281         mddb_recid_t            sr_selfid;              /* db record id */
282 #ifdef RPC_HDR
283         md_set_record           *sr_next;               /* next ptr (Incore) */
284 #endif  /* RPC_HDR */
285         set_t                   sr_setno;               /* set number */
286         md_set_nm_t             sr_setname;             /* setname */
287         md_timeval32_t          sr_ctime;               /* creation timestamp */
288         u_long                  sr_genid;               /* generation id */
289         md_node_nm_arr_t        sr_nodes;               /* array of nodenames */
290         md_drive_record         *sr_drivechain;         /* dr list (Incore) */
291         mddb_recid_t            sr_driverec;            /* first dr record id */
292         mhd_mhiargs_t           sr_mhiargs;             /* MH ioctl timeouts */
293         md_h_arr_t              sr_med;                 /* Mediator hosts */
295 #else /* _KERNEL */
296 struct md_set_record {
297         u_int                   sr_revision;            /* revision level */
298         u_int                   sr_flags;               /* state flags */
299         mddb_recid_t            sr_selfid;              /* db record id */
300 #ifdef RPC_HDR
301         u_int                   sr_next;                /* next ptr (Incore) */
302 #endif  /* RPC_HDR */
303         set_t                   sr_setno;               /* set number */
304         md_set_nm_t             sr_setname;             /* setname */
305         md_timeval32_t          sr_ctime;               /* creation timestamp */
306         u_int                   sr_genid;               /* generation id */
307         md_node_nm_arr_t        sr_nodes;               /* array of nodenames */
308         u_int                   sr_drivechain;          /* dr list (Incore) */
309         mddb_recid_t            sr_driverec;            /* first dr record id */
310         mhd_mhiargs_t           sr_mhiargs;             /* MH ioctl timeouts */
311         md_h_arr_t              sr_med;                 /* Mediator hosts */
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 */
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 */
341 #ifdef RPC_HDR
343 %#define        MD_SETOWNER_NO          0
344 %#define        MD_SETOWNER_YES         1
345 %#define        MD_SETOWNER_NONE        2
346 #endif  /* RPC_HDR */
349 %/* Gate key type */
350 struct  md_setkey_t {
351         string                  sk_host<>;
352         set_t                   sk_setno;
353         string                  sk_setname<>;
354         md_timeval32_t          sk_key;
355 #ifdef  RPC_HDR
356         struct md_setkey_t      *sk_next;
357 #endif  /* RPC_HDR */
361 %/* metadevice ID */
362 typedef minor_t         unit_t;
365 %/* component ID */
366 struct comp_t {
367         minor_t         mnum;           /* associated metadevice */
368         md_dev64_t      dev;
372 %/* hotspare pool ID */
373 typedef u_int           hsp_t;
375 #ifdef RPC_HDR
377 %#define        MD_HSP_NONE     ((hsp_t)~0U)
378 #endif  /* RPC_HDR */
381 %/* hotspare ID */
382 struct hs_t {
383         hsp_t           hsp;            /* associated hotspare pool */
384         md_dev64_t      dev;            /* device ID */
388 %/* mnum or hsp */
389 typedef u_int   minor_or_hsp_t;
393 % * name service stuff
394 % */
395 const   MD_MAXPREFIX = 127;
397 %#define        MD_MAX_CTDLEN   64
399 struct md_name_prefix {
400         u_char          pre_len;
401         char            pre_data[MD_MAXPREFIX];
404 const   MD_MAXSUFFIX = 40;
406 struct md_name_suffix {
407         u_char          suf_prefix;
408         u_char          suf_len;
409         char            suf_data[MD_MAXSUFFIX];
412 struct md_splitname {
413         md_name_prefix  sn_prefix;
414         md_name_suffix  sn_suffix;
417 #ifdef RPC_HDR
419 %#define        SPN_PREFIX(spn) ((spn)->sn_prefix)
420 %#define        SPN_SUFFIX(spn) ((spn)->sn_suffix)
421 #endif  /* RPC_HDR */
425 % * Number of bits to represent a setno
426 % * this gives us all info to define masks and shifts ...
427 % * Also used for minor #, hsp id, recid mask and shifts.
428 % */
429 const   MD_BITSSET =    5;
430 const   MD_DEFAULTSETS =        4;
432 #ifdef RPC_HDR
434 %#define        MD_MAXSETS      (1 << MD_BITSSET)
435 %#define        MD_SETMASK      (MD_MAXSETS - 1)
436 #endif  /* RPC_HDR */
440 % * Define a file descriptor for lockfd
441 % * when the lock is not held.
442 % */
443 const   MD_NO_LOCK = -2;
447 % * accumulated setname
448 % */
449 struct mdsetname_t {
450         string                  setname<>;      /* logical name */
451         set_t                   setno;          /* set number */
452 #ifdef RPC_HDR
453         struct md_set_desc      *setdesc;       /* Cache set/drive desc */
454         int                     lockfd;         /* used by meta_lock_* */
455 #endif /* RPC_HDR */
458 struct mdsetnamelist_t {
459         mdsetnamelist_t *next;
460         mdsetname_t     *sp;
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
472 %#define        MD_SLICE0               0
473 %#define        MD_SLICE6               6
474 %#define        MD_SLICE7               7
476 %#define        MD_MAX_PARTS            17
477 #endif  /* RPC_HDR */
479 struct mdname_t {
480 #ifdef RPC_HDR
481         struct mddrivename_t *drivenamep; /* back pointer to drive */
482 #endif /* RPC_HDR */
483         string          cname<>;        /* cannonical name */
484         string          bname<>;        /* block name */
485         string          rname<>;        /* raw name */
486         string          devicesname<>;  /* /devices name (or NULL) */
487         string          minor_name<>;   /* minor name with respect to devid */
488         md_dev64_t      dev;            /* major/minor (or NODEV64) */
489 #ifdef RPC_HDR
490         mdkey_t         key;            /* namespace key (or MD_KEYBAD) */
491 #endif /* RPC_HDR */
492         diskaddr_t      end_blk;        /* end of database replicas (or -1) */
493         diskaddr_t      start_blk;      /* usable start block (or -1) */
496 %/* name structure (old style) */
497 struct o_mdname_t {
498 #ifdef RPC_HDR
499         struct o_mddrivename_t *drivenamep; /* back pointer to drive */
500 #endif /* RPC_HDR */
501         string          cname<>;        /* cannonical name */
502         string          bname<>;        /* block name */
503         string          rname<>;        /* raw name */
504         string          devicesname<>;  /* /devices name (or NULL) */
505         dev_t           dev;            /* major/minor (or NODEV64) */
506 #ifdef RPC_HDR
507         mdkey_t         key;            /* namespace key (or MD_KEYBAD) */
508 #endif /* RPC_HDR */
509         daddr_t         end_blk;        /* end of database replicas (or -1) */
510         daddr_t         start_blk;      /* usable start block (or -1) */
513 struct mdnamelist_t {
514         mdnamelist_t    *next;
515         mdname_t        *namep;
520 % * drive name
521 % */
522 %/* name types */
523 enum mdnmtype_t {
524         MDT_UNKNOWN = 0,                /* unknown type */
525         MDT_ACCES,                      /* could not access device */
526         MDT_META,                       /* metadevice name */
527         MDT_COMP,                       /* regular device name */
528         MDT_FAST_META,                  /* metadevice name (partial) */
529         MDT_FAST_COMP                   /* regular device name (partial) */
532 %/* metadevice types */
533 enum md_types_t {
534         MD_UNDEFINED = 0,
535         MD_DEVICE,
536         MD_METAMIRROR,
537         MD_METATRANS,
538         MD_METARAID,
539         MD_METASP
542 %/* SVM general device types
543 % *
544 % * META_DEVICE refers to any SVM metadevice
545 % * LOGICAL_DEVICE refers to any underlying physical device
546 % * HSP_DEVICE refers to a hotspare pool
547 % *
548 % * In the past, the device type can be determined via
549 % * the device name (such as d10, c1t1d1s1).  With
550 % * the friendly name implementation, it is not possible
551 % * to determine from the device name.  In the code,
552 % * whereever the device type is obvious that type will be
553 % * used explicitly otherwise 'UNKNOWN' will be used and
554 % * specific SVM lookup routines will be called to determine
555 % * the device type associated with the name.
556 % */
557 enum meta_device_type_t {
558         UNKNOWN = 0,
559         META_DEVICE,
560         HSP_DEVICE,
561         LOGICAL_DEVICE
562 }; 
564 #ifdef RPC_HDR
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 */
578 %/* generic device info */
579 struct mdgeom_t {
580         u_int           ncyl;
581         u_int           nhead;
582         u_int           nsect;
583         u_int           rpm;
584         u_int           write_reinstruct;
585         u_int           read_reinstruct;
586         u_int           blk_sz;
589 %/* generic device info (old style) */
590 struct o_mdgeom_t {
591         u_int           ncyl;
592         u_int           nhead;
593         u_int           nsect;
594         u_int           rpm;
595         u_int           write_reinstruct;
596         u_int           read_reinstruct;
599 struct mdcinfo_t {
600         char            cname[16];      /* controller driver name */
601         mhd_ctlrtype_t  ctype;          /* controller type */
602         u_int           cnum;           /* controller instance */
603         u_int           tray;           /* SSA100 tray */
604         u_int           bus;            /* SSA100 bus */
605         u_longlong_t    wwn;            /* SSA100 World Wide Name */
606         char            dname[16];      /* disk driver name */
607         u_int           unit;           /* disk instance */
608         u_int           maxtransfer;    /* max I/O size (in blocks) */
611 struct mdpart_t {
612         diskaddr_t      start;          /* start block */
613         diskaddr_t      size;           /* size of partition (in blocks) */
614         u_short         tag;            /* ID tag of partition */
615         u_short         flag;           /* permission flags */
616         diskaddr_t      label;          /* size of disk label (or 0) */
619 %/* partition information (old style) */
620 struct o_mdpart_t {
621         daddr_t         start;          /* start block */
622         daddr_t         size;           /* size of partition (in blocks) */
623         u_short         tag;            /* ID tag of partition */
624         u_short         flag;           /* permission flags */
625         daddr_t         label;          /* size of disk label (or 0) */
628 struct mdvtoc_t {
629         u_int           nparts;
630         diskaddr_t      first_lba;      /* for efi devices only */
631         diskaddr_t      last_lba;       /* for efi devices only */
632         diskaddr_t      lbasize;        /* for efi devices only */
633         mdpart_t        parts[MD_MAX_PARTS];    /* room for i386 too */
634         char            *typename;      /* disk type (or NULL) */
637 %/* vtoc information (old style) */
638 struct o_mdvtoc_t {
639         char            *typename;      /* disk type (or NULL) */
640         u_int           nparts;
641         o_mdpart_t      parts[16];      /* room for i386 too */
645 % * List of drivename cnames per side,
646 % * also the driver name, mnum (for slice 7).
647 % */
648 struct mdsidenames_t {
649         mdsidenames_t   *next;
650         side_t          sideno;
651         minor_t         mnum;
652         string          dname<>;
653         string          cname<>;
656 struct mddrivename_t {
657 #ifdef RPC_HDR
658         /*
659          * the following string is not used but is left in place so that
660          * it is not necessary to version the rpc interface that passes
661          * this structure.
662          */
663         string          not_used<>;
664 #endif  /* RPC_HDR */
665         string          cname<>;        /* canonical drive name */
666         string          rname<>;        /* raw name */
667         mdnmtype_t      type;           /* type of drive */
668         string          devid<>;        /* Device Id of the drive */
669         int             errnum;         /* errno for type == MDT_ACCES */
670         mdgeom_t        geom;           /* disk geometry */
671         mdcinfo_t       cinfo;          /* controller info */
672         mdvtoc_t        vtoc;           /* volume table of contents info */
673         mdname_t        parts<>;        /* partitions in drive */
674         mdsidenames_t   *side_names;    /* list of names per side */
675         mdkey_t         side_names_key; /* key used to store the side names*/
677         string          miscname<>;     /* metadevice misc name */
678 #ifdef RPC_HDR
679         struct md_common_t *unitp;      /* metadevice unit structure */
680 #endif  /* RPC_HDR */
684 % * old version of mddrivename_t that contains an old version of mdgeom_t,
685 % * mdvtoc_t and mdname_t (prefixed _o).
686 % */
687 struct o_mddrivename_t {
688 #ifdef RPC_HDR
689         string          cachenm<>;      /* name used for cache lookups */
690 #endif  /* RPC_HDR */
691         string          cname<>;        /* canonical drive name */
692         string          rname<>;        /* raw name */
693         mdnmtype_t      type;           /* type of drive */
694         int             errnum;         /* errno for type == MDT_ACCES */
695         o_mdgeom_t      geom;           /* disk geometry (old style) */
696         mdcinfo_t       cinfo;          /* controller info */
697         o_mdvtoc_t      vtoc;           /* vtoc info (old style) */
698         o_mdname_t      parts<>;        /* partitions in drive (old style) */
699         mdsidenames_t   *side_names;    /* list of names per side */
700         mdkey_t         side_names_key; /* key used to store the side names*/
702         string          miscname<>;     /* metadevice misc name */
703 #ifdef RPC_HDR
704         struct md_common_t *unitp;      /* metadevice unit structure */
705 #endif  /* RPC_HDR */
707 struct mddrivenamelist_t {
708         mddrivenamelist_t *next;
709         mddrivename_t   *drivenamep;
714 % * replica struct
715 % */
716 typedef u_int   replica_flags_t;
717 #ifdef RPC_HDR
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
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 */
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
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"
768 #endif  /* RPC_HDR */
771  * Refering to r_blkno and r_nblk:
772  * A replica will always be smaller than 1 Terabyte, so no need to
773  * change the ondisk structure to 64 bits.
774  */
775 struct md_replica_t {
776         mdname_t                *r_namep;
777         replica_flags_t         r_flags;
778         daddr_t                 r_blkno;
779         daddr_t                 r_nblk;
780         ddi_devid_t             r_devid;
781         char                    r_driver_name[MD_MAXDRVNM];
782         char                    r_minor_name[MDDB_MINOR_NAME_MAX];
785 struct md_replica_recerr_t {
786         int                     r_li;
787         int                     r_flags;
788         daddr32_t               r_blkno;
789         minor_t                 r_mnum;
790         char                    r_driver_name[MD_MAXDRVNM];
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
801 % */
802 struct md_drive_desc {
803         md_timeval32_t          dd_ctime;               /* creation time */
804         u_long                  dd_genid;               /* generation id */
805         u_int                   dd_flags;               /* state flags */
806         md_drive_desc           *dd_next;               /* next drive */
807         mddrivename_t           *dd_dnp;                /* drive name ptr */
808         int                     dd_dbcnt;               /* # of replicas */
809         int                     dd_dbsize;              /* size of replica */
814 % * set/drive structs exposed by the library routines (old style)
815 % */
816 struct o_md_drive_desc {
817         md_timeval32_t          dd_ctime;               /* creation time */
818         u_long                  dd_genid;               /* generation id */
819         u_int                   dd_flags;               /* state flags */
820         o_md_drive_desc         *dd_next;               /* next drive */
821         o_mddrivename_t         *dd_dnp;                /* drive name ptr */
822         int                     dd_dbcnt;               /* # of replicas */
823         int                     dd_dbsize;              /* size of replica */
826 struct md_mnnode_desc {
827         md_timeval32_t          nd_ctime;               /* creation time */
828         u_long                  nd_genid;               /* generation id */
829         u_int                   nd_flags;               /* state flags */
830         md_mnnode_desc          *nd_next;               /* next node */
831         md_mnnode_nm_t          nd_nodename;            /* name of node */
832         u_int                   nd_nodeid;              /* id of node */
833         md_mnnode_nm_t          nd_priv_ic;             /* priv interconnect */
834                                                         /* nodename */
837 struct md_set_desc {
838         md_timeval32_t          sd_ctime;               /* creation time */
839         u_long                  sd_genid;               /* generation id */
840         set_t                   sd_setno;               /* set number */
841         u_int                   sd_flags;               /* state flags */
842         md_node_nm_arr_t        sd_nodes;               /* array of nodenames */
843                                                         /* for !MN_disksets */
844         int                     sd_isown[MD_MAXSIDES];  /* bool for is owner? */
845         md_h_arr_t              sd_med;                 /* Mediator hosts */
846         md_drive_desc           *sd_drvs;               /* drive list */
847         u_int                   sd_mn_am_i_master;
848         u_int                   sd_mn_numnodes;         /* # of nodes in list */
849         md_mnnode_desc          *sd_nodelist;           /* MN node list */
850                                                         /* for MN_disksets */
851         md_node_nm_t            sd_mn_master_nodenm;    /* Master node name */
852         u_int                   sd_mn_master_nodeid;    /* Master node id */
853         md_mnnode_desc          *sd_mn_mynode;          /* shortcut to me */
854         md_mnnode_desc          *sd_mn_masternode;      /* shortcut to master */
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.
877 % */
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.
883 % */
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
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
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 */
912 % * set description (old style)
913 % */
914 struct o_md_set_desc {
915         md_timeval32_t          sd_ctime;               /* creation time */
916         u_long                  sd_genid;               /* generation id */
917         set_t                   sd_setno;               /* set number */
918         u_int                   sd_flags;               /* state flags */
919         md_node_nm_arr_t        sd_nodes;               /* array of nodenames */
920         int                     sd_isown[MD_MAXSIDES];  /* bool for is owner? */
921         md_h_arr_t              sd_med;                 /* Mediator hosts */
922         o_md_drive_desc         *sd_drvs;               /* drive list */
927 % * hotspare pool name
928 % */
929 struct mdhspname_t {
930         string          hspname<>;      /* hotspare pool name */
931         hsp_t           hsp;            /* number */
933 #ifdef RPC_HDR
934         struct md_hsp_t *unitp;         /* hotspare pool unit structure */
935 #endif  /* RPC_HDR */
938 struct mdhspnamelist_t {
939         mdhspnamelist_t *next;
940         mdhspname_t     *hspnamep;
945 % *     generic metadevice descriptions for status and init
946 % */
950 % * following used with un_status
951 % * bottom 16 bits are global definitions
952 % * top 16 bits are defined by sub device
953 % */
954 typedef u_int   md_status_t;
955 #ifdef RPC_HDR
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 */
962 % * following are used with un_parent
963 % *     MD_NO_PARENT    - Not a sub-device.
964 % *     MD_MULTI_PARENT - A sub-device with one or more parents, like a log.
965 % *     other           - A sub-device with only one parent, like a submirror.
966 % *                       The number is the parent's unit number.
967 % */
968 typedef unit_t  md_parent_t;
969 #ifdef RPC_HDR
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 */
976 typedef u_int   md_stackcap_t;
977 #ifdef RPC_HDR
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 */
985 #endif  /* RPC_HDR */
987 /* common to all metadevices */
988 struct md_common_t {
989         mdname_t        *namep;
990         md_types_t      type;
991         md_status_t     state;
992         md_stackcap_t   capabilities;
993         md_parent_t     parent;
994         diskaddr_t      size;
995         u_long          user_flags;
996         u_longlong_t    revision;
1001 % *     stripe
1002 % */
1004  * ioctl stuff
1005  */
1006 struct ms_params_t {
1007         int             change_hsp_id;
1008         hsp_t           hsp_id;
1012  * unit structure
1013  */
1014 typedef u_int   comp_state_t;
1015 #ifdef RPC_HDR
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 */
1027 struct md_comp_t {
1028         mdname_t        *compnamep;
1029         mdname_t        *hsnamep;
1030         comp_state_t    state;
1031         u_int           lasterrcnt;
1032         md_timeval32_t  timestamp;
1035 struct md_row_t {
1036         diskaddr_t      interlace;
1037         diskaddr_t      row_size;
1038         md_comp_t       comps<>;
1041 struct md_stripe_t {
1042         md_common_t     common;
1043         mdhspname_t     *hspnamep;
1044         md_row_t        rows<>;
1049 % *     soft partition
1050 % */
1051 typedef uint64_t        xsp_offset_t;
1052 typedef uint64_t        xsp_length_t;
1053 typedef u_int           xsp_status_t;
1055 %#define        SP_INIT         0x0001
1056 %#define        SP_OK           0x0002
1057 %#define        SP_LASTERR      0x0004
1060  * unit structure
1061  */
1063 struct md_sp_ext_t {
1064         xsp_offset_t    voff;
1065         xsp_offset_t    poff;
1066         xsp_length_t    len;
1069 struct md_sp_t {
1070         md_common_t     common;
1071         mdname_t        *compnamep;     /* name of this component */
1072         xsp_status_t    status;         /* state of this soft partition */
1073         md_sp_ext_t     ext<>;
1078 % *     mirror
1079 % */
1081  * ioctl stuff
1082  */
1083 enum mm_wr_opt_t {
1084         WR_PARALLEL = 0,        /* write submirrors in parallel */
1085         WR_SERIAL               /* write submirrors one at a time */
1088 enum mm_rd_opt_t {
1089         RD_LOAD_BAL = 0,        /* read submirrors roundrobin */
1090         RD_GEOMETRY,            /* read submirrors geometrically */
1091         RD_FIRST                /* read first submirror */
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;
1108  * unit structure
1109  */
1110 typedef u_int   sm_state_t;
1111 #ifdef RPC_HDR
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;
1128 #ifdef RPC_HDR
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;
1136         sm_state_t      state;
1137         sm_flags_t      flags;
1138         md_timeval32_t  timestamp;
1141 #ifdef RPC_HDR
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 */
1156 const   NMIRROR = 4;
1157 struct md_mirror_t {
1158         md_common_t     common;
1159         mm_rd_opt_t     read_option;
1160         mm_wr_opt_t     write_option;
1161         mm_pass_num_t   pass_num;
1162         int             percent_done;
1163         int             percent_dirty;
1164         md_submirror_t  submirrors[NMIRROR];
1170 % *     trans
1171 % */
1173 % * unit structure
1174 % */
1175 typedef u_int   mt_flags_t;
1176 #ifdef RPC_HDR
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;
1189 #ifdef RPC_HDR
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 */
1200 struct md_trans_t {
1201         md_common_t     common;
1202         mdname_t        *masternamep;
1203         mdname_t        *lognamep;
1204         mt_flags_t      flags;
1205         md_timeval32_t  timestamp;
1206         mt_l_error_t    log_error;
1207         md_timeval32_t log_timestamp;
1208         daddr_t         log_size;
1209         mt_debug_t      debug;
1216 % *     RAID
1217 % */
1219  * ioctl stuff
1220  */
1221 struct mr_params_t {
1222         int             change_hsp_id;
1223         hsp_t           hsp_id;
1227  * unit structure
1228  */
1229 enum rcs_state_t {
1230         RCS_UNUSED = 0x0,
1231         RCS_INIT = 0x1,
1232         RCS_OKAY = 0x2,
1233         RCS_ERRED = 0x4,
1234         RCS_LAST_ERRED = 0x8,
1235         RCS_RESYNC = 0x10,
1236         RCS_INIT_ERRED = 0x20,
1237         RCS_REGEN = 0x40
1240 typedef u_int   rcs_flags_t;
1241 #ifdef RPC_HDR
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 {
1257         mdname_t        *colnamep;
1258         mdname_t        *hsnamep;
1259         rcs_state_t     state;
1260         rcs_flags_t     flags;
1261         md_timeval32_t  timestamp;
1264 enum rus_state_t {
1265         RUS_UNUSED = 0x0,
1266         RUS_INIT = 0x1,
1267         RUS_OKAY = 0x2,
1268         RUS_ERRED = 0x4,
1269         RUS_LAST_ERRED = 0x8,
1270         RUS_DOI = 0x10,
1271         RUS_REGEN = 0x20
1274 typedef u_int   md_riflags_t;
1275 #ifdef RPC_HDR
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;
1289 struct md_raid_t {
1290         md_common_t     common;
1291         rus_state_t     state;
1292         md_timeval32_t  timestamp;
1293         diskaddr_t      interlace;
1294         diskaddr_t      column_size;
1295         size_t          orig_ncol;
1296         mdhspname_t     *hspnamep;
1297         md_riflags_t    resync_flags;
1298         int             percent_dirty;
1299         int             percent_done;
1300         int             pw_count;
1301         md_raidcol_t    cols<>;
1306 % *     shared
1307 % */
1309  * unit structure
1310  */
1311 struct md_shared_t {
1312         md_common_t     common;
1317 % *     hotspare
1318 % */
1320  * ioctl stuff
1321  */
1322 enum hotspare_states_t {
1323         HSS_UNUSED, HSS_AVAILABLE, HSS_RESERVED, HSS_BROKEN
1327  * unit structure
1328  */
1329 struct md_hs_t {
1330         mdname_t        *hsnamep;
1331         hotspare_states_t state;
1332         diskaddr_t      size;
1333         md_timeval32_t  timestamp;
1334         u_longlong_t    revision;
1337 struct md_hsp_t {
1338         mdhspname_t     *hspnamep;
1339         u_int           refcount;
1340         md_hs_t         hotspares<>;
1345 % * specific error info
1346 % */
1349 % * simple errors
1350 % */
1351 enum md_void_errno_t {
1352         MDE_NONE = 0,
1353         MDE_UNIT_NOT_FOUND,
1354         MDE_DUPDRIVE,
1355         MDE_INVAL_HSOP,
1356         MDE_NO_SET,             /* no such set */
1357         MDE_SET_DIFF,           /* setname changed on command line */
1358         MDE_BAD_RD_OPT,         /* bad mirror read option */
1359         MDE_BAD_WR_OPT,         /* bad mirror write option */
1360         MDE_BAD_PASS_NUM,       /* bad mirror pass number */
1361         MDE_BAD_INTERLACE,      /* bad stripe interlace */
1362         MDE_NO_HSPS,            /* couldn't find any hotspare pools */
1363         MDE_NOTENOUGH_DB,       /* Too few replicas */
1364         MDE_DELDB_NOTALLOWED,   /* last replica in ds cannot be del in metadb */
1365         MDE_DEL_VALIDDB_NOTALLOWED,     /* last valid replica cannot be del */
1366         MDE_SYSTEM_FILE,        /* /etc/system file error */
1367         MDE_MDDB_FILE,          /* /etc/lvm/mddb.cf file error */
1368         MDE_MDDB_CKSUM,         /* /etc/lvm/mddb.cf checksum error */
1369         MDE_VFSTAB_FILE,        /* /etc/vfstab file error */
1370         MDE_NOSLICE,            /* metaslicename() with sliceno to big */
1371         MDE_SYNTAX,             /* metainit syntax error */
1372         MDE_OPTION,             /* metainit options error */
1373         MDE_TAKE_OWN,           /* take ownership failed */
1374         MDE_NOT_DRIVENAME,      /* not in drivename syntax */
1375         MDE_RESERVED,           /* device is reserved by another host */
1376         MDE_DVERSION,           /* driver version out of sync */
1377         MDE_MVERSION,           /* MDDB version out of sync */
1378         MDE_TESTERROR,          /* Test Error Message */
1379         MDE_BAD_ORIG_NCOL,      /* bad RAID original column count */
1380         MDE_RAID_INVALID,       /* attempt to use -k on invalid device */
1381         MDE_MED_ERROR,          /* mediator error */
1382         MDE_TOOMANYMED,         /* Too many mediators specified */
1383         MDE_NOMED,              /* No mediators */
1384         MDE_ONLYNODENAME,       /* Only the nodename is needed */
1385         MDE_RAID_BAD_PW_CNT,    /* bad prewrite count specified */
1386         MDE_DEVID_TOOBIG,       /* Devid size is greater than allowed */
1387         MDE_NOPERM,             /* No permission - not root */
1388         MDE_NODEVID,            /* No device id for given devt */
1389         MDE_NOROOT,             /* No root in /etc/mnttab */
1390         MDE_EOF_TRANS,          /* trans logging eof'd */
1391         MDE_BAD_RESYNC_OPT,     /* bad mirror resync option */
1392         MDE_NOT_MN,             /* option only valid within a multi-node set */
1393         MDE_ABR_SET,            /* invalid operation for ABR mirror */
1394         MDE_INVAL_MNOP,         /* Invalid operation on MN diskset */
1395         MDE_MNSET_NOTRANS,      /* Trans metadevice not supported in MN set */
1396         MDE_MNSET_NORAID,       /* RAID metadevice not supported in MN set */
1397         MDE_FORCE_DEL_ALL_DRV,  /* Must use -f flag to delete all drives */
1398         MDE_STRIPE_TRUNC_SINGLE,        /* single component stripe truncation */
1399         MDE_STRIPE_TRUNC_MULTIPLE,      /* multiple component stripe trun */
1400         MDE_SMF_FAIL,           /* service management facility error */
1401         MDE_SMF_NO_SERVICE,     /* service not enabled in SMF */
1402         MDE_AMBIGUOUS_DEV,      /* Ambiguous device specified */
1403         MDE_NAME_IN_USE,        /* Friendly name already in use.  For */
1404                                 /* instance name desired for hot spare pool */
1405                                 /* is being used for a metadevice. */
1406         MDE_ZONE_ADMIN,         /* in a zone & no admin device */
1407         MDE_NAME_ILLEGAL,       /* illegal syntax for metadevice or hsp name */
1408         MDE_MISSING_DEVID_DISK  /* unable to find disk using devid */
1411 struct md_void_error_t {
1412         md_void_errno_t         errnum;
1417 % * system errors
1418 % */
1419 struct md_sys_error_t {
1420         int                     errnum;
1425 % * RPC errors
1426 % */
1427 struct md_rpc_error_t {
1428         enum clnt_stat          errnum;
1433 % * device errors
1434 % */
1435 enum md_dev_errno_t {
1436         MDE_INVAL_HS = 1,
1437         MDE_FIX_INVAL_STATE,
1438         MDE_FIX_INVAL_HS_STATE,
1439         MDE_NOT_META,
1440         MDE_IS_META,
1441         MDE_IS_SWAPPED,
1442         MDE_NAME_SPACE,
1443         MDE_IN_SHARED_SET,
1444         MDE_NOT_IN_SET,
1445         MDE_NOT_DISK,
1446         MDE_CANT_CONFIRM,
1447         MDE_INVALID_PART,
1448         MDE_HAS_MDDB,
1449         MDE_NO_DB,              /* Replica not on device given */
1450         MDE_CANTVERIFY_VTOC,
1451         MDE_NOT_LOCAL,
1452         MDE_DEVICES_NAME,
1453         MDE_REPCOMP_INVAL,      /* replica slice not allowed in "set" metadevs */
1454         MDE_REPCOMP_ONLY,       /* only replica slice diskset replicas */
1455         MDE_INV_ROOT,           /* Invalid root device for this operation */
1456         MDE_MULTNM,             /* Multiple entries for device in namespace */
1457         MDE_TOO_MANY_PARTS,     /* dev has more than MD_MAX_PARTS partitions */
1458         MDE_REPART_REPLICA,     /* replica slice would move with repartitioning */
1459         MDE_IS_DUMP,            /* device already in use as dump device */
1460         MDE_DISKNAMETOOLONG     /* devid's not in use and diskname too long */
1463 struct md_dev_error_t {
1464         md_dev_errno_t          errnum;
1465         md_dev64_t              dev;    /* 64 bit fixed size */
1470 % * overlap errors
1471 % */
1472 enum md_overlap_errno_t {
1473         MDE_OVERLAP_MOUNTED = 1,
1474         MDE_OVERLAP_SWAP,
1475         MDE_OVERLAP_DUMP
1480 #if !defined(_KERNEL)
1481 struct md_overlap_error_t {
1482         md_overlap_errno_t      errnum;
1483         string                  where<>;
1484         string                  overlap<>;
1486 #else
1487 struct md_overlap_error_t {
1488         md_overlap_errno_t      errnum;
1489         u_int                   xwhere;
1490         u_int                   xoverlap;
1492 #endif /* !_KERNEL */
1496 % * use errors
1497 % */
1498 enum md_use_errno_t {
1499         MDE_IS_MOUNTED = 1,
1500         MDE_ALREADY,
1501         MDE_OVERLAP,
1502         MDE_SAME_DEVID
1506 #if !defined(_KERNEL)
1507 struct md_use_error_t {
1508         md_use_errno_t          errnum;
1509         md_dev64_t              dev;
1510         string                  where<>;
1512 #else
1513 struct md_use_error_t {
1514         md_use_errno_t          errnum;
1515         md_dev64_t              dev;
1516         u_int                   xwhere;
1518 #endif
1522 % * metadevice errors
1523 % */
1524 enum md_md_errno_t {
1525         MDE_INVAL_UNIT = 1,
1526         MDE_UNIT_NOT_SETUP,
1527         MDE_UNIT_ALREADY_SETUP,
1528         MDE_NOT_MM,
1529         MDE_NOT_ENOUGH_DBS,
1530         MDE_IS_SM,
1531         MDE_IS_OPEN,
1532         MDE_C_WITH_INVAL_SM,
1533         MDE_RESYNC_ACTIVE,
1534         MDE_LAST_SM_RE,
1535         MDE_MIRROR_FULL,
1536         MDE_IN_USE,
1537         MDE_SM_TOO_SMALL,
1538         MDE_NO_LABELED_SM,
1539         MDE_SM_OPEN_ERR,
1540         MDE_CANT_FIND_SM,
1541         MDE_LAST_SM,
1542         MDE_NO_READABLE_SM,
1543         MDE_SM_FAILED_COMPS,
1544         MDE_ILLEGAL_SM_STATE,
1545         MDE_RR_ALLOC_ERROR,
1546         MDE_MIRROR_OPEN_FAILURE,
1547         MDE_MIRROR_THREAD_FAILURE,
1548         MDE_GROW_DELAYED,
1549         MDE_NOT_MT,
1550         MDE_HS_IN_USE,
1551         MDE_HAS_LOG,
1552         MDE_UNKNOWN_TYPE,
1553         MDE_NOT_STRIPE,
1554         MDE_NOT_RAID,
1555         MDE_NROWS,
1556         MDE_NCOMPS,
1557         MDE_NSUBMIRS,
1558         MDE_BAD_STRIPE,
1559         MDE_BAD_MIRROR,
1560         MDE_BAD_TRANS,
1561         MDE_BAD_RAID,
1562         MDE_RAID_OPEN_FAILURE,
1563         MDE_RAID_THREAD_FAILURE,
1564         MDE_RAID_NEED_FORCE,
1565         MDE_NO_LOG,
1566         MDE_RAID_DOI,
1567         MDE_RAID_LAST_ERRED,
1568         MDE_RAID_NOT_OKAY,
1569         MDE_RENAME_BUSY,
1570         MDE_RENAME_SOURCE_BAD,
1571         MDE_RENAME_TARGET_BAD,
1572         MDE_RENAME_TARGET_UNRELATED,
1573         MDE_RENAME_CONFIG_ERROR,
1574         MDE_RENAME_ORDER,
1575         MDE_RECOVER_FAILED,
1576         MDE_NOT_SP,
1577         MDE_SP_NOSPACE,
1578         MDE_SP_BADWMREAD,
1579         MDE_SP_BADWMWRITE,
1580         MDE_SP_BADWMMAGIC,
1581         MDE_SP_BADWMCRC,
1582         MDE_SP_OVERLAP,
1583         MDE_SP_BAD_LENGTH,
1584         MDE_UNIT_TOO_LARGE,
1585         MDE_LOG_TOO_LARGE,
1586         MDE_SP_NOSP,
1587         MDE_IN_UNAVAIL_STATE
1590 struct md_md_error_t {
1591         md_md_errno_t           errnum;
1592         minor_t                 mnum;
1597 % * component errors
1598 % */
1599 enum md_comp_errno_t {
1600         MDE_CANT_FIND_COMP = 1,
1601         MDE_REPL_INVAL_STATE,
1602         MDE_COMP_TOO_SMALL,
1603         MDE_COMP_OPEN_ERR,
1604         MDE_RAID_COMP_ERRED,
1605         MDE_MAXIO,
1606         MDE_SP_COMP_OPEN_ERR
1609 struct md_comp_error_t {
1610         md_comp_errno_t         errnum;
1611         comp_t                  comp;
1616 % * hotspare pool errors
1617 % */
1618 enum md_hsp_errno_t {
1619         MDE_HSP_CREATE_FAILURE = 1,
1620         MDE_HSP_IN_USE,
1621         MDE_INVAL_HSP,
1622         MDE_HSP_BUSY,
1623         MDE_HSP_REF,
1624         MDE_HSP_ALREADY_SETUP,
1625         MDE_BAD_HSP,
1626         MDE_HSP_UNIT_TOO_LARGE
1629 struct md_hsp_error_t {
1630         md_hsp_errno_t          errnum;
1631         hsp_t                   hsp;
1636 % * hotspare errors
1637 % */
1638 enum md_hs_errno_t {
1639         MDE_HS_RESVD = 1,
1640         MDE_HS_CREATE_FAILURE,
1641         MDE_HS_INUSE,
1642         MDE_HS_UNIT_TOO_LARGE
1645 struct md_hs_error_t {
1646         md_hs_errno_t           errnum;
1647         hs_t                    hs;
1652 % * MDDB errors
1653 % */
1654 enum md_mddb_errno_t {
1655         MDE_TOOMANY_REPLICAS = 1,
1656         MDE_REPLICA_TOOSMALL,
1657         MDE_NOTVERIFIED,
1658         MDE_DB_INVALID,
1659         MDE_DB_EXISTS,
1660         MDE_DB_MASTER,
1661         MDE_DB_TOOSMALL,
1662         MDE_DB_NORECORD,
1663         MDE_DB_NOSPACE,
1664         MDE_DB_NOTNOW,
1665         MDE_DB_NODB,
1666         MDE_DB_NOTOWNER,
1667         MDE_DB_STALE,
1668         MDE_DB_TOOFEW,
1669         MDE_DB_TAGDATA,
1670         MDE_DB_ACCOK,
1671         MDE_DB_NTAGDATA,
1672         MDE_DB_ACCNOTOK,
1673         MDE_DB_NOLOCBLK,
1674         MDE_DB_NOLOCNMS,
1675         MDE_DB_NODIRBLK,
1676         MDE_DB_NOTAGREC,
1677         MDE_DB_NOTAG,
1678         MDE_DB_BLKRANGE
1682 struct md_mddb_error_t {
1683         md_mddb_errno_t         errnum;
1684         minor_t                 mnum;           /* associated metadevice */
1685         set_t                   setno;
1686         u_int                   size;
1691 % * diskset (ds) errors
1692 % */
1693 enum md_ds_errno_t {
1694         MDE_DS_DUPHOST = 1,
1695         MDE_DS_NOTNODENAME,
1696         MDE_DS_SELFNOTIN,
1697         MDE_DS_NODEHASSET,
1698         MDE_DS_NODENOSET,
1699         MDE_DS_NOOWNER,
1700         MDE_DS_NOTOWNER,
1701         MDE_DS_NODEISNOTOWNER,
1702         MDE_DS_NODEINSET,
1703         MDE_DS_NODENOTINSET,
1704         MDE_DS_SETNUMBUSY,
1705         MDE_DS_SETNUMNOTAVAIL,
1706         MDE_DS_SETNAMEBUSY,
1707         MDE_DS_DRIVENOTCOMMON,
1708         MDE_DS_DRIVEINSET,
1709         MDE_DS_DRIVENOTINSET,
1710         MDE_DS_DRIVEINUSE,
1711         MDE_DS_DUPDRIVE,
1712         MDE_DS_INVALIDSETNAME,
1713         MDE_DS_HASDRIVES,
1714         MDE_DS_SIDENUMNOTAVAIL,
1715         MDE_DS_SETNAMETOOLONG,
1716         MDE_DS_NODENAMETOOLONG,
1717         MDE_DS_OHACANTDELSELF,
1718         MDE_DS_HOSTNOSIDE,
1719         MDE_DS_SETLOCKED,
1720         MDE_DS_ULKSBADKEY,
1721         MDE_DS_LKSBADKEY,
1722         MDE_DS_WRITEWITHSULK,
1723         MDE_DS_SETCLEANUP,
1724         MDE_DS_CANTDELSELF,
1725         MDE_DS_HASMED,
1726         MDE_DS_TOOMANYALIAS,
1727         MDE_DS_ISMED,
1728         MDE_DS_ISNOTMED,
1729         MDE_DS_INVALIDMEDNAME,
1730         MDE_DS_ALIASNOMATCH,
1731         MDE_DS_NOMEDONHOST,
1732         MDE_DS_CANTDELMASTER,
1733         MDE_DS_NOTINMEMBERLIST,
1734         MDE_DS_MNCANTDELSELF,
1735         MDE_DS_RPCVERSMISMATCH,
1736         MDE_DS_WITHDRAWMASTER,
1737         MDE_DS_COMMDCTL_SUSPEND_NYD,
1738         MDE_DS_COMMDCTL_SUSPEND_FAIL,
1739         MDE_DS_COMMDCTL_REINIT_FAIL,
1740         MDE_DS_COMMDCTL_RESUME_FAIL,
1741         MDE_DS_NOTNOW_RECONFIG,
1742         MDE_DS_NOTNOW_CMD,
1743         MDE_DS_COMMD_SEND_FAIL,
1744         MDE_DS_MASTER_ONLY,
1745         MDE_DS_DRIVENOTONHOST,
1746         MDE_DS_CANTRESNARF,
1747         MDE_DS_INSUFQUORUM,
1748         MDE_DS_EXTENDEDNM,
1749         MDE_DS_PARTIALSET,
1750         MDE_DS_SINGLEHOST,
1751         MDE_DS_AUTONOTSET,
1752         MDE_DS_INVALIDDEVID,
1753         MDE_DS_SETNOTIMP,
1754         MDE_DS_NOTSELFIDENTIFY
1758 #if !defined(_KERNEL)
1759 struct md_ds_error_t {
1760         md_ds_errno_t           errnum;
1761         set_t                   setno;
1762         string                  node<>;
1763         string                  drive<>;
1765 #else /* _KERNEL */
1766 struct md_ds_error_t {
1767         md_ds_errno_t           errnum;
1768         set_t                   setno;
1769         u_int                   xnode;
1770         u_int                   xdrive;
1772 #endif /* !_KERNEL */
1776 % * fundamental error type
1777 % */
1778 enum md_errclass_t {
1779         MDEC_VOID = 0,  /* simple error */
1780         MDEC_SYS,       /* system errno */
1781         MDEC_RPC,       /* RPC errno */
1782         MDEC_DEV,       /* device error */
1783         MDEC_USE,       /* use error */
1784         MDEC_MD,        /* metadevice error */
1785         MDEC_COMP,      /* component error */
1786         MDEC_HSP,       /* hotspare pool error */
1787         MDEC_HS,        /* hotspare error */
1788         MDEC_MDDB,      /* metadevice database error */
1789         MDEC_DS,        /* diskset error */
1790         MDEC_OVERLAP    /* overlap error */
1795 % * error info
1796 % */
1797 union md_error_info_t
1798 switch (md_errclass_t   errclass) {
1799 case MDEC_VOID:
1800         md_void_error_t         void_error;
1801 case MDEC_SYS:
1802         md_sys_error_t          sys_error;
1803 case MDEC_RPC:
1804         md_rpc_error_t          rpc_error;
1805 case MDEC_DEV:
1806         md_dev_error_t          dev_error;
1807 case MDEC_USE:
1808         md_use_error_t          use_error;
1809 case MDEC_MD:
1810         md_md_error_t           md_error;
1811 case MDEC_COMP:
1812         md_comp_error_t         comp_error;
1813 case MDEC_HSP:
1814         md_hsp_error_t          hsp_error;
1815 case MDEC_HS:
1816         md_hs_error_t           hs_error;
1817 case MDEC_MDDB:
1818         md_mddb_error_t         mddb_error;
1819 case MDEC_DS:
1820         md_ds_error_t           ds_error;
1821 case MDEC_OVERLAP:
1822         md_overlap_error_t      overlap_error;
1826 #if !defined(_KERNEL)
1827 struct md_error_t {
1828         md_error_info_t         info;           /* specific info */
1829         string                  host<>;         /* hostname */
1830         string                  extra<>;        /* extra context info */
1831         string                  name<>;         /* file or device name */
1833 #else /* _KERNEL */
1834 struct md_error_t {
1835         md_error_info_t         info;           /* specific info */
1836         u_int                   xhost;          /* hostname */
1837         u_int                   xextra; /* extra context info */
1838         u_int                   xname;          /* file or device name */
1840 #endif /* !_KERNEL */
1841 %#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
1842 %#pragma pack()
1843 %#endif
1845 #ifdef  RPC_HDR
1848 % * Null error constant
1849 % */
1850 %#define        MDNULLERROR             {{MDEC_VOID}, NULL, NULL, NULL}
1851 #endif  /* RPC_HDR */
1853 #ifdef RPC_XDR
1855 % * Constant null error struct.
1856 % */
1857 %const          md_error_t              mdnullerror = MDNULLERROR;
1858 #endif  /* RPC_XDR */
1860 #ifdef RPC_HDR
1863 % * External reference to constant null error struct. (declared in mdiox_xdr.c)
1864 % */
1865 %extern const   md_error_t              mdnullerror;
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);
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)
1913 #ifdef  _KERNEL
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);
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,
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);
1956 %extern void    mderrorextra(md_error_t *ep, char *extra);
1958 #endif  /* ! _KERNEL */
1959 #endif  /* RPC_HDR */
1962  * common unit structure
1963  */
1964 struct mdc_unit {
1965         u_longlong_t    un_revision;    /* revision # (keep this a longlong) */
1966         md_types_t      un_type;        /* type of record */
1967         md_status_t     un_status;      /* status flags */
1968         int             un_parent_res; /* parent reserve index */
1969         int             un_child_res;   /* child reserve index */
1970         minor_t         un_self_id;     /* metadevice unit number */
1971         mddb_recid_t    un_record_id;   /* db record id */
1972         uint_t          un_size;        /* db record size for unit structure */
1973         ushort_t        un_flag;        /* configuration info */
1974         diskaddr_t      un_total_blocks; /* external # blocks in metadevice */
1975         diskaddr_t      un_actual_tb;   /* actual # blocks in metadevice */
1976         uint_t          un_nhead;       /* saved value of # heads */
1977         uint_t          un_nsect;       /* saved value of # sectors */
1978         ushort_t        un_rpm;         /* saved value of rpm's */
1979         ushort_t        un_wr_reinstruct; /* worse case write reinstruct */
1980         ushort_t        un_rd_reinstruct; /* worse case read reinstruct */
1981         mddb_recid_t    un_vtoc_id;     /* vtoc db record id */
1982         md_stackcap_t   un_capabilities; /* subdevice capabilities */
1983         md_parent_t     un_parent;      /* -1 none, -2 many, positive unit # */
1984         uint_t          un_user_flags;  /* provided for userland */
1986 typedef struct mdc_unit mdc_unit_t;
1989  * For old 32 bit format use only
1990  */
1991 %#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
1992 %#pragma pack(4)
1993 %#endif
1994 struct mdc_unit32_od {
1995         u_longlong_t    un_revision;
1996         md_types_t      un_type;
1997         md_status_t     un_status;
1998         int             un_parent_res;
1999         int             un_child_res;
2000         minor_t         un_self_id;
2001         mddb_recid_t    un_record_id;
2002         uint_t          un_size;
2003         ushort_t        un_flag;
2004         daddr32_t       un_total_blocks; /* external # blocks in metadevice */
2005         daddr32_t       un_actual_tb;   /* actual # blocks in metadevice */
2006         ushort_t        un_nhead;
2007         ushort_t        un_nsect;
2008         ushort_t        un_rpm;
2009         ushort_t        un_wr_reinstruct;
2010         ushort_t        un_rd_reinstruct;
2011         mddb_recid_t    un_vtoc_id;
2012         md_stackcap_t   un_capabilities;
2013         md_parent_t     un_parent;
2014         uint_t          un_user_flags;
2016 typedef struct mdc_unit32_od mdc_unit32_od_t;
2018 struct md_unit {
2019         mdc_unit_t      c;      /* common stuff */
2021 typedef struct md_unit md_unit_t;
2023 enum sp_status_t {
2024         MD_SP_CREATEPEND,       /* soft partition creation in progress */
2025         MD_SP_GROWPEND,         /* attach operation in progress */
2026         MD_SP_DELPEND,          /* delete operation in progress */
2027         MD_SP_OK,               /* soft partition is stable */
2028         MD_SP_ERR,              /* soft partition is errored */
2029         MD_SP_RECOVER,          /* recovery operation in progess */
2030         MD_SP_LAST              /* always the last entry */
2033 /* soft partition offsets and lengths are specified in sectors */
2034 typedef u_longlong_t    sp_ext_offset_t;
2035 typedef u_longlong_t    sp_ext_length_t;
2036 struct mp_ext {
2037         sp_ext_offset_t un_voff;        /* virtual offset */
2038         sp_ext_offset_t un_poff;        /* physical offset */
2039         sp_ext_length_t un_len;         /* length of extent */
2041 typedef struct mp_ext mp_ext_t;
2044  * mp_unit32_od is for old 32 bit format only
2045  */
2046 struct mp_unit32_od {
2047         mdc_unit32_od_t c;              /* common unit structure */
2048         mdkey_t         un_key;         /* namespace key */
2049         dev32_t         un_dev;         /* device number */
2050         sp_ext_offset_t un_start_blk;   /* start block, incl reserved space */
2051         sp_status_t     un_status;      /* sp status */
2052         uint_t          un_numexts;     /* number of extents */
2053         sp_ext_length_t un_length;      /* total length (in sectors) */
2054         /* extent array.  NOTE: sized dynamically! */
2055         mp_ext_t un_ext[1];
2057 typedef struct mp_unit32_od mp_unit32_od_t;
2060  * softpart unit structure
2061  */
2062 struct mp_unit {
2063         mdc_unit_t      c;              /* common unit structure */
2064         mdkey_t         un_key;         /* namespace key */
2065         md_dev64_t      un_dev;         /* device number, 64 bit */
2066         sp_ext_offset_t un_start_blk;   /* start block, incl reserved space */
2067         sp_status_t     un_status;      /* sp status */
2068         uint_t          un_numexts;     /* number of extents */
2069         sp_ext_length_t un_length;      /* total length (in sectors) */
2070         /* extent array.  NOTE: sized dynamically! */
2071         mp_ext_t un_ext[1];
2073 typedef struct mp_unit mp_unit_t;
2076  * ioctl structures used when passing ioctls via rpc.mdcommd
2077  */
2078 struct md_driver {
2079         char    md_drivername[MD_MAXDRVNM];
2080         set_t   md_setno;
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 {
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 */
2096 typedef struct md_set_params md_set_params_t;
2097 %#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
2098 %#pragma pack()
2099 %#endif