meta.h revision 1cd3f00b0fdef8e9aa4ccb455928844f9aa3d2cd
/*
* 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
#pragma ident "%Z%%M% %I% %E% SMI"
#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
*/
#define METACONFTMP "/etc/lvm/md.cf.new"
#define META_DBCONF "/etc/lvm/mddb.cf"
#define META_DBCONFTMP "/etc/lvm/mddb.cf.new"
#define META_MNSET_NODELIST "/var/run/nodelist"
#define METADEVPATH "/etc/lvm/devpath"
#define METALOGENV "MD_LOG"
#define METAPKGROOT "/usr"
#define ADMSPECIAL "/dev/md/admin"
#define MDB_STR "metadevice state database"
#define META_LONGDISKNAME_STR "<long disk name>"
/* default database size (4MB) */
#define MD_DBSIZE (8192)
/* default Multinode database size (16MB) */
#define MD_MN_DBSIZE (32768)
/* disk label size */
#define VTOC_SIZE (16)
/* maximum ctd name size (in # of digits) for printing out */
#define CTD_FORMAT_LEN 6
/* Recommend timeout in seconds for RPC client creation. */
#define MD_CLNT_CREATE_TOUT (60)
/*
* 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.
*/
#define MD_CLNT_CREATE_SUBTIMEOUT (5)
/*
* metaclust verbosity levels and what they are for. Messages upto MC_LOG2
* will also be logged in syslog.
*/
#define MC_LOG0 0 /* special class. log messages regardless of */
/* 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
*/
typedef uint_t mdprtopts_t;
#define PRINT_SHORT 0x00000001
#define PRINT_SUBDEVS 0x00000002
#define PRINT_HEADER 0x00000004
#define PRINT_DEBUG 0x00000008
#define PRINT_TIMES 0x00000010
#define PRINT_SETSTAT 0x00000020
#define PRINT_SETSTAT_ONLY 0x00000040
#define PRINT_FAST 0x00000080
#define PRINT_DEVID 0x00000100
#define PRINT_LARGEDEVICES 0x00000200
#define PRINT_FN 0x00000400
/*
* for meta_devadm options
*/
typedef uint_t mddevopts_t;
#define DEV_VERBOSE 0x00000001
#define DEV_NOACTION 0x00000002
#define DEV_LOG 0x00000004
#define DEV_RELOAD 0x00000008
#define DEV_UPDATE 0x00000010
/*
* return values for meta_devadm operations
*/
#define METADEVADM_SUCCESS 0
#define METADEVADM_ERR 1
#define METADEVADM_DEVIDINVALID 2
#define METADEVADM_DSKNAME_ERR 3
#define METADEVADM_DISKMOVE 4
/*
* return values for the splitname function
*/
#define METASPLIT_SUCCESS 0
#define METASPLIT_LONGPREFIX 1
#define METASPLIT_LONGDISKNAME 2
/*
* meta_check* options
*/
typedef uint_t mdchkopts_t;
/*
* meta_check_inuse options
*/
typedef uint_t mdinuseopts_t;
/*
* meta* force options
*/
typedef uint_t mdforceopts_t;
/*
* meta* options
*/
typedef uint_t mdcmdopts_t;
/*
* meta_tab* definitions
*/
#define TAB_ARG_ALLOC 5
#define TAB_LINE_ALLOC 10
typedef uint_t mdinittypes_t;
#define TAB_UNKNOWN 0x0000
#define TAB_MDDB 0x0001
#define TAB_HSP 0x0002
#define TAB_STRIPE 0x0004
#define TAB_MIRROR 0x0008
#define TAB_RAID 0x0010
#define TAB_TRANS 0x0020
#define TAB_SP 0x0040
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 {
struct md_disk_status_list *next;
/*
* 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 {
struct mndiskset_membershiplist *next;
/*
* client pool for rpc calls to mdcommd
*/
typedef struct md_mn_client_list {
struct md_mn_client_list *mcl_next;
/*
* 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 {
MD_RESYNC_START = 1,
/*
* 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
*/
#define TAKE_FORCE 0x0001
#define TAKE_USETAG 0x0002
#define TAKE_USEIT 0x0004
#define TAKE_IMP 0x0008
#define TAKE_RETAKE 0x0010
/*
* ignore gettext for lint so we check printf args
*/
#ifdef __lint
#define dgettext(d, s) s
#define gettext(s) s
#endif
/*
*/
#define META_SMF_CORE 0x01
#define META_SMF_DISKSET 0x02
#define META_SMF_MN_DISKSET 0x04
#define META_SMF_ALL 0xFF
/*
* rpc.mdcommd for MN disksets.
*/
#define DB_ADDSIDENMS_NO_BCAST 0
#define DB_ADDSIDENMS_BCAST 1
/*
* 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.
*/
#define COMMDCTL_SUSPEND 1
#define COMMDCTL_RESUME 2
#define COMMDCTL_REINIT 3
/*
* 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;
struct md_mnsr_node *mmn_next;
/*
* 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;
#define EV_ALLOBJS (~0ULL)
#define EV_ALLSETS ((set_t)(~0))
#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 */
#define MD_IM_REPLICA_SCANNED (0x01)
#define MD_IM_REPLICA_VALID (0x02)
typedef struct md_im_replica_info {
struct md_im_replica_info *mir_next;
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 */
#define MD_IM_DISK_AVAILABLE 0x00
#define MD_IM_DISK_NOT_AVAILABLE 0x01
/* Values for set descriptor flags */
#define MD_IM_SET_INVALID 0x10
#define MD_IM_SET_REPLICATED 0x20
/* Values for mis_partial */
#define MD_IM_COMPLETE_DISKSET 0x04
#define MD_IM_PARTIAL_DISKSET 0x08
typedef struct md_im_set_desc {
struct md_im_set_desc *mis_next;
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 */
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 */
#define META_INDENT 4
/* Flags for metaimport reporting */
#define META_IMP_REPORT 0x0001
#define META_IMP_VERBOSE 0x0002
#define META_IMP_PASS1 0x1000
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_1 */
#define MD_MN_COPY_TO_ONDISK 0x0001
#define MD_MN_COPY_TO_INCORE 0x0002
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 MD_DISP_STDERR 0x0000
#define MD_IGNORE_STDERR 0x0001
#define MD_DRYRUN 0x0002
#define MD_RETRY_BUSY 0x0004
#define MD_NOLOG 0x0008
#define MD_PANIC_WHEN_INCONSISTENT 0x0010
/* define for initall_context argument for meta_mn_send_command() */
#define NO_CONTEXT_STRING NULL
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 */