/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _META_H
#define _META_H
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <libgen.h>
#include <locale.h>
#include <time.h>
#include <assert.h>
#include <stdarg.h>
#include <signal.h>
#include <devid.h>
#include <sys/sysmacros.h>
#include <sys/efi_partition.h>
#include <meta_basic.h>
#include <mdiox.h>
#include <metamed.h>
#ifdef __cplusplus
extern "C" {
#endif
/* debug malloc include */
#ifdef DEBUG_MALLOC
#ifdef _REENTRANT
#endif
#endif
/*
* useful macros
*/
#ifndef min
#define min(x, y) (((x) < (y)) ? (x) : (y))
#endif
#ifndef max
#define max(x, y) (((x) > (y)) ? (x) : (y))
#endif
#ifndef rounddown
#define rounddown(x, y) (((x) / (y)) * (y))
#endif
/*
* external names
*/
/* default database size (4MB) */
/* default Multinode database size (16MB) */
/* disk label size */
/* EFI geometry data */
/* maximum ctd name size (in # of digits) for printing out */
/* Recommend timeout in seconds for RPC client creation. */
/*
* If event needs to be checked during wait of MD_CLNT_CREATE_TOUT,
* spin checking for event and then waiting for MD_CLNT_CREATE_SUBTIMEOUT
* seconds until MD_CLNT_CREATE_TOUT seconds are used.
*/
/*
* metaclust verbosity levels and what they are for. Messages upto MC_LOG2
* will also be logged in syslog.
*/
/* debug level */
/* intended for use in loops walking mn sets */
/* intended for use in loops walking devices */
/* or in libmeta routines */
/*
* for meta_print* options
*/
/*
* for meta_devadm options
*/
/*
* return values for meta_devadm operations
*/
#define METADEVADM_SUCCESS 0
/*
* return values for the splitname function
*/
#define METASPLIT_SUCCESS 0
/*
* meta_check* options
*/
/*
* meta_check_inuse options
*/
/*
* meta* force options
*/
/*
* meta* options
*/
/*
* meta_tab* definitions
*/
typedef struct {
char *context;
char *cname;
int argc;
char **argv;
typedef struct {
char *filename;
char *data;
} md_tab_t;
/*
* disk status definitions
*/
typedef struct md_disk_status_list {
/*
* module name list used by meta_patch_root & meta_systemfile
*/
struct modname {
char *name;
};
/*
* list to be used for printing Device Relocation Information
*/
typedef struct mddevid_t {
char *ctdname;
} mddevid_t;
/*
* Multi-Node Diskset List
*
* we either store the IP address of the private interconnect or its name
* in the msl_node_addr member
*/
typedef struct mndiskset_membershiplist {
/*
* client pool for rpc calls to mdcommd
*/
typedef struct md_mn_client_list {
/*
* Resync thread manipulation commands.
*
* The resync thread can now be started, blocked, unblocked or killed.
* This typedef specifies the action to be taken by meta_resync.c
* routines.
*/
typedef enum {
/*
* rpc.metad macro definitions.
*/
{ \
}
{ \
}
{ \
}
{ \
}
{ \
}
/*
* This typedef specifies the signature of a function that
* meta_client_create_retry can use to establish an rpc connection.
* private is used to pass data from the caller of meta_client_create_retry
* to clnt_create_func.
*/
void *private,
/* definition of the table for the different message types */
typedef struct md_mn_msg_tbl_entry {
void (*mte_handler)
int (*mte_smgen)
/*
* Flags for the take command
*/
/*
* ignore gettext for lint so we check printf args
*/
#ifdef __lint
#define dgettext(d, s) s
#define gettext(s) s
#endif
/*
*/
/*
* rpc.mdcommd for MN disksets.
*/
#define DB_ADDSIDENMS_NO_BCAST 0
/*
* Defines and structures to support rpc.mdcommd.
* RPC routines in rpc.metad will be used to suspend, resume
* and reinitialize the rpc.mdcommd running on that node.
* These actions are needed when the nodelist is changing.
*/
/*
* Defines used when joining a node to a MN diskset.
* A MN diskset is stale if < 50% mddbs are available when the first node
* joins the set. A MN diskset is stale when 50% mddbs are available when
* the first node joins the set if the mediator is unable to provide an
* extra vote.
* Once a MN set is marked stale, it stays in the stale state (even if > 50%
* mddbs are available) until all nodes are withdrawn from the diskset.
* Any new nodes joining a stale MN diskset are marked stale regardless of
* the availability of mddbs in order to keep the diskset consistent across
* all nodes.
*
* If a reconfig cycle is underway, set the reconfig flag so that rpc.metad
* clnt_locks are not enforced. Since the reconfig cycle has locked out the
* meta* commands, this is safe to do.
*/
/*
* Structure used during reconfig step2 to aid in sychronization
* of the drives in a diskset.
*/
typedef struct md_mnsr_node {
int mmn_numdrives;
/*
* meta events definitions ("meta_notify.h")
*/
/*
* event flags
* meta_notify_createq(), (EXISTERR, PERMANENT)
* meta_notify_getev(), (WAIT)
* meta_notify_getevlist() (WAIT)
*/
/*
* events are always associated with an underlying object
* This object is of one of the following types.
*/
typedef enum md_ev_objtype_t {
EVO_EMPTY = 0,
} ev_obj_t;
/*
* Specific events are sent upon state changes
* in the underlying devices or when sent by
* user applications. These events have a unique
* type. These types map to kernel event types (sys/md_notify.h)
*
*/
typedef enum md_ev_id_t {
EV_UNK = 0,
} evid_t;
#if !defined(_KERNEL)
#endif /* _KERNEL */
typedef struct md_ev {
} md_ev_t;
typedef struct md_evlist {
} md_evlist_t;
/* end of meta event definitions ("meta_notify.h") */
typedef struct md_im_names {
int min_count;
char **min_names;
/* Values for replica info status */
typedef struct md_im_replica_info {
int mir_status;
int mir_flags;
typedef struct md_im_drive_info {
void *mid_devid;
void *mid_o_devid;
int mid_devid_sz;
int mid_o_devid_sz;
int mid_available;
char *mid_driver_name;
char *mid_devname;
int overlapped_disk;
/* Values for mid_available */
/* Values for set descriptor flags */
/* Values for mis_partial */
typedef struct md_im_set_desc {
int mis_flags;
int mis_oldsetno;
int mis_active_replicas;
int mis_partial;
/* meta_admin.c */
/* meta_attach.c */
md_error_t *ep);
/* meta_check.c */
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
/* meta_db.c */
char *minor_name);
extern void meta_devid_encode_str_free(char *devidstr);
extern int meta_devid_decode_str(char *devidstr,
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
extern int meta_get_replica_names(mdsetname_t *,
/* meta_db_balance.c */
md_error_t *ep);
/* metadevstamp.c */
md_error_t *ep);
md_error_t *ep);
/* meta_error.c */
char *name);
/* PRINTFLIKE2 */
/* PRINTFLIKE2 */
/* PRINTFLIKE1 */
/* PRINTFLIKE1 */
extern void md_eprintf(const char *fmt, ...);
/* meta_getdevs.c */
md_error_t *ep);
md_error_t *ep);
extern int meta_deviceid_to_nmlist(char *search_path,
/* meta_hotspares.c */
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
/* meta_init.c */
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
/* meta_mdcf.c */
/* meta_med.c */
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
/* meta_mem.c */
#ifdef _DEBUG_MALLOC_INC
#else /* ! _DEBUG_MALLOC_INC */
extern char *Strdup(char *p);
extern void Free(void *p);
#endif /* ! _DEBUG_MALLOC_INC */
/* meta_metad.c */
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
char *orig_devname, char **ret_devname,
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
extern void meta_conv_drvname_new2old(o_mddrivename_t *,
mddrivename_t *);
extern void meta_conv_drvname_old2new(o_mddrivename_t *,
mddrivename_t *);
extern void meta_conv_drvdesc_new2old(o_md_drive_desc *,
md_drive_desc *);
extern void meta_conv_drvdesc_old2new(o_md_drive_desc *,
md_drive_desc *);
extern void free_olddrvdesc(o_md_drive_desc *);
extern void free_newdrvdesc(md_drive_desc *);
extern char *meta_get_devid(char *);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
/* meta_metad_subr.c */
md_error_t *ep);
extern void sr_validate(void);
extern int metad_isautotakebyname(char *setname);
md_error_t *ep);
extern void sr_cache_flush(int flushnames);
/* meta_mh.c */
extern mhd_mhiargs_t defmhiargs;
md_error_t *ep);
md_error_t *ep);
extern int meta_status_own(char *sname,
md_error_t *ep);
md_error_t *ep);
/* meta_mirror.c */
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
extern int meta_mirror_anycomp_is_err(mdsetname_t *,
mdnamelist_t *);
/* meta_mirror_resync.c */
md_error_t *ep);
extern void *meta_mn_mirror_resync_all(void *arg);
extern void meta_mirror_resync_kill_all(void);
extern void meta_mirror_resync_block_all(void);
extern void meta_mirror_resync_unblock_all(void);
/* meta_mount.c */
md_error_t *);
/* meta_name.c */
extern int meta_is_all(char *uname);
extern int is_metaname(char *uname);
extern int meta_is_none(char *uname);
extern int is_hspname(char *uname);
extern void parse_device(mdsetname_t *, char *, char **, char **);
extern void metaflushdrivenames(void);
extern char *metadiskname(char *name);
md_error_t *ep);
md_error_t *ep);
mddrivename_t *dnp);
mddrivename_t *dnp);
md_error_t *ep);
md_error_t *ep);
mdhspname_t *hspnp);
extern void metaflushmetanames(void);
extern void metaflushnames(int flush_sr_cache);
/* meta_nameinfo.c */
md_error_t *ep);
md_error_t *);
md_error_t *ep);
extern void metaflushctlrcache(void);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
/* meta_namespace.c */
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_mkdev_params_t *, md_error_t *);
md_error_t *);
/* meta_patch.c */
md_error_t *ep);
/* meta_patch_root.c */
/* meta_print.c */
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
/* meta_raid.c */
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
extern diskaddr_t meta_default_raid_interlace(void);
md_error_t *ep);
/* meta_raid_resync.c */
md_error_t *ep);
/* meta_repartition.c */
/* meta_replace.c */
md_error_t *ep);
/* meta_reset.c */
md_error_t *ep);
/* meta_resync.c */
md_error_t *ep);
/* meta_set.c */
md_error_t *ep);
md_error_t *ep);
extern int meta_is_devid_in_anyset(void *devid,
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
extern char *mynode(void);
extern int meta_reconfig_choose_master();
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
/* meta_set_drv.c */
extern int meta_make_sidenmlist(mdsetname_t *,
mddrivename_t *, int imp_flag,
md_error_t *ep);
/* meta_set_hst.c */
md_error_t *ep);
md_error_t *ep);
/* meta_set_med.c */
/* meta_set_tkr.c */
md_error_t *ep);
/* meta_setup.c */
extern char *myname;
extern int metasyslog;
extern hrtime_t start_time;
md_error_t *ep);
extern void md_post_sig(int sig);
extern int md_got_sig(void);
extern int md_which_sig(void);
extern void md_rb_sig_handling_on(void);
/* meta_smf.c */
extern int meta_smf_getmask();
/* meta_sp.c */
md_error_t *ep);
md_error_t *ep);
extern int meta_sp_get_number_of_possible_sps(
extern int meta_sp_get_number_of_possible_sps_on_drive(
extern void *meta_mn_sp_update_abr(void *arg);
/* meta_stat.c */
extern void metaflushstatcache(void);
/* meta_stripe.c */
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
extern diskaddr_t meta_default_stripe_interlace(void);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
extern int meta_stripe_anycomp_is_err(mdsetname_t *,
mdnamelist_t *);
/* meta_systemfile.c */
/* meta_tab.c */
/* meta_trans.c */
md_error_t *ep);
md_error_t *ep);
extern char *mt_l_error_to_action(
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
/* meta_userflags.c */
/* metarpcopen.c */
md_error_t *ep);
extern void metarpccloseall(void);
md_error_t *ep);
/* metasplitname.c */
/* meta_notify.c */
md_error_t *ep);
md_error_t *ep);
mdcmdopts_t, md_error_t *);
mdcmdopts_t, md_error_t *);
/* meta_se_notify.c */
/* metgetroot.c */
md_error_t *ep);
/* meta_time.c */
/* meta_devadm.c */
md_error_t *ep);
md_error_t *ep);
/* meta_mn_comm.c */
md_error_t *ep);
long timeout);
extern void mdmn_abort(void);
/* meta_import.c */
int bsize);
void *, int);
md_error_t *ep);
md_error_t *ep);
void *old_devid);
/*
* pnm_rec is used to store the mapping from keys in the NM namespace
* to actual physical devices. The current name of a physical device, used
* by a set that can be imported, can be retrieved by matching the did_key
* (deviceID entry) in the DID_SHR_NM namespace to the min_devid_key in the
* DID_NM namespace(the did_key to the min_key). Then matching the min_key
* in the DID_NM namespace to the n_key in the NM namespace.
*
* n_name is defined to be an array, so that only one malloc is needed for the
* entire datastructure.
*/
typedef struct pnm_rec {
} pnm_rec_t;
/* Indentation value for metaimport output */
/* Flags for metaimport reporting */
md_im_names_t *, int);
extern int meta_get_and_report_set_info(
int, uint_t, int *, int,
md_im_drive_info_t *, md_error_t *);
extern void free_pnm_rec_list(pnm_rec_t **);
extern int meta_imp_set(md_im_set_desc_t *,
char *, int, bool_t, md_error_t *);
extern int clnt_imp_adddrvs(char *hostname,
/* Flags for direction in copy_msg_2 */
extern int meta_read_nodelist(int *nodecnt,
md_error_t *ep);
/* meta_mn_subr.c */
/* defines for flags argument for meta_mn_send_command() */
/* define for initall_context argument for meta_mn_send_command() */
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
md_error_t *ep);
extern int meta_mn_singlenode(void);
md_error_t *ep);
/* meta_set_prv.c */
md_error_t *ep);
/* meta_statconcise.c */
extern char *meta_get_raid_col_state(rcs_state_t);
extern char *meta_get_stripe_state(comp_state_t);
extern char *meta_get_hs_state(hotspare_states_t);
md_timeval32_t *, md_error_t *);
#ifdef __cplusplus
}
#endif
#endif /* _META_H */