meta.h revision 689378828864261307402c292d53738db4d8ae8b
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (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 2005 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"
/* 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
/*
* 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
/*
* 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
/*
* 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") */
/* 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);
/* 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 */
md_error_t *ep);
extern int is_metaname(char *uname);
extern int is_hspname(char *uname);
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);
md_error_t *ep);
mdhspname_t *hspnp);
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_error_t *ep);
/* 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);
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);
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 *, md_error_t *);
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 */
md_error_t *ep);
/* 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);
/* 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 */
extern void mdmn_abort(void);
/* meta_import.c */
int bsize);
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;
/* Values for set descriptor flags */
#define MD_IM_SET_INVALID 0x01
#define MD_IM_SET_REPLICATED 0x02
typedef struct md_im_set_desc {
struct md_im_set_desc *mis_next;
int mis_flags;
int mis_oldsetno;
int mis_active_replicas;
md_im_names_t *, int);
extern int meta_get_set_info(mddrivenamelist_t *,
md_im_set_desc_t **, int, md_error_t *);
extern int meta_imp_set(md_im_set_desc_t *,
char *, int, bool_t, md_error_t *);
/* 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);
/* Values for set descriptor flags */
#define MD_IM_SET_INVALID 0x01
/* 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);
#ifdef __cplusplus
}
#endif
#endif /* _META_H */