/* * 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 * or http://www.opensolaris.org/os/licensing. * 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 _DSW_H #define _DSW_H #ifdef __cplusplus extern "C" { #endif /* * Miscellaneous defines */ #define DSW_BITS 8 /* # of bits in a byte */ #define DSW_SIZE 64 /* fba's in a DSW chunk */ /* * Ioctl definitions */ #define _D_(x) (('D'<<16)|('W'<<8)|(x)) #define DSWIOC_ENABLE _D_(1) /* Configure DSW pair */ #define DSWIOC_RESUME _D_(2) /* Resume a DSW pair */ #define DSWIOC_SUSPEND _D_(3) /* Suspend a DSW pair */ #define DSWIOC_COPY _D_(4) /* Copy DSW volume over its pair */ #define DSWIOC_BITMAP _D_(5) /* Get bitmap */ #define DSWIOC_STAT _D_(6) /* Get state of shadow */ #define DSWIOC_DISABLE _D_(7) /* Deconfigure DSW pair */ #define DSWIOC_SHUTDOWN _D_(8) /* Suspend all DSW pairs */ #define DSWIOC_ABORT _D_(9) /* Abort Copy of DSW pair */ #define DSWIOC_VERSION _D_(10) /* DataShadow version */ #define DSWIOC_RESET _D_(11) /* Reset DataShadow set */ #define DSWIOC_OFFLINE _D_(12) /* Offline volumes */ #define DSWIOC_WAIT _D_(13) /* Wait for copy to complete */ #define DSWIOC_LIST _D_(14) /* List current kernel shadow groups */ #define DSWIOC_ACOPY _D_(15) /* Copy DSW volumes over their pairs */ #define DSWIOC_EXPORT _D_(16) /* Export the shadow volume */ #define DSWIOC_IMPORT _D_(17) /* Import shadow volume */ #define DSWIOC_JOIN _D_(18) /* Rejoin previously exported shadow */ #define DSWIOC_COPYP _D_(19) /* Set and get copy parameters */ #define DSWIOC_OCREAT _D_(20) /* Create overflow volume */ #define DSWIOC_OATTACH _D_(21) /* Attach overflow volume */ #define DSWIOC_ODETACH _D_(22) /* Detach overflow volume */ #define DSWIOC_OLIST _D_(23) /* List overflow volumes */ #define DSWIOC_OSTAT _D_(24) /* Stat overflow volume */ #define DSWIOC_SBITSSET _D_(25) /* Get # of bits set in shadow bitmap */ #define DSWIOC_CBITSSET _D_(26) /* Get # of bits set in copy bitmap */ #define DSWIOC_LISTLEN _D_(27) /* length of DSWIOC_LIST data */ #define DSWIOC_OLISTLEN _D_(28) /* length of DSWIOC_OLIST data */ #define DSWIOC_SEGMENT _D_(29) /* Get segemented bitmaps */ #define DSWIOC_MOVEGRP _D_(30) /* Move set from one group to another */ #define DSWIOC_CLIST _D_(31) /* get list of resource groups */ #define DSWIOC_GLIST _D_(32) /* get list of groups */ #define DSWIOC_CHANGETAG _D_(33) /* change the cluster tag of a set */ #define DSWIOC_OSTAT2 _D_(34) /* Stat overflow volume enhanced */ /* * Config and status flags */ #define DSW_GOLDEN 0x0001 /* the set is independent */ #define DSW_COPYINGP 0x0100 /* Copy in progress */ #define DSW_COPYINGM 0x0200 /* Copying master to shadow */ #define DSW_COPYINGS 0x0400 /* Copying shadow to master */ #define DSW_COPYING 0x0600 /* Copying, may be in progress */ #define DSW_COPY_FLAGS 0x0700 /* Copy flags */ #define DSW_COPYINGX 0x0800 /* Copy exit requested */ #define DSW_OFFLINE 0xf000 /* An underlying volume offline */ #define DSW_BMPOFFLINE 0x1000 /* Bitmap volume offline */ #define DSW_SHDOFFLINE 0x2000 /* Shadow volume offline */ #define DSW_MSTOFFLINE 0x4000 /* Master volume offline */ #define DSW_OVROFFLINE 0x8000 /* Overflow volume offline */ #define DSW_TREEMAP 0x10000 /* Shadow volume accessed by an index */ #define DSW_OVERFLOW 0x20000 /* Shadow volume has overflowed */ #define DSW_SHDEXPORT 0x40000 /* Shadow volume has been exported */ #define DSW_SHDIMPORT 0x80000 /* Shadow volume has been imported */ #define DSW_VOVERFLOW 0x100000 /* Shadow volume using overflow vol */ #define DSW_HANGING 0x200000 /* Hanging master structure */ #define DSW_CFGOFFLINE 0x400000 /* config db is offline */ #define DSW_OVRHDRDRTY 0x800000 /* Overflow header dirty */ #define DSW_RESIZED 0x1000000 /* mst_size != shd_size */ #define DSW_FRECLAIM 0x2000000 /* force the reclaim of an ovr vol */ /* * used for SNMP trap only. * These flags help distinguish between enable and resume, * suspend and disable. * Note that DSW_HANGING is set for both suspend and disable */ #define DSW_SNMP_CLR 0 /* no flag is set */ #define DSW_SNMP_DISABLE 1 /* Set is disabled */ #define DSW_SNMP_SUSPEND 2 /* Set is suspended */ #define DSW_SNMP_ENABLE 3 /* Set is enabled */ #define DSW_SNMP_RESUME 4 /* Set is resumed */ #define DSW_SNMP_OVER_ATTACH 5 /* overflow attached */ #define DSW_SNMP_OVER_DETACH 6 /* overflow detached */ #define DSW_SNMP_UPDATE 7 /* update operation */ #define DSW_SNMP_COPIED 8 /* copy operation */ /* Overflow volume flags */ #define IIO_OFFLINE 0x0001 /* Volume is offline */ #define IIO_HDR_WRTN 0x0002 /* Header written */ #define IIO_CNTR_INVLD 0x0004 /* Overflow counters invalid */ #define IIO_VOL_UPDATE 0x0008 /* Performing group update */ #define DSW_NAMELEN 64 /* NSC_MAXPATH - don't change without */ /* amending header version number */ #define DSWDEV "/dev/ii" #define II_IMPORTED_SHADOW "" /* * Configuration parameter defines * ii_bitmap, ii_throttle_unit, ii_throttle_delay */ #define II_KMEM 0 /* Load/store on resume/suspend, in memory */ #define II_WTHRU 1 /* Read/write bitmap thru to bitmap volume */ #define II_FWC 2 /* Read/write bitmap to FWC, else WTHRU */ #define MIN_THROTTLE_UNIT 100 /* Min. number of units to transfer */ #define MAX_THROTTLE_UNIT 60000 /* Max. number of units to transfer */ #define MIN_THROTTLE_DELAY 2 /* Min. delay between unit transfer */ #define MAX_THROTTLE_DELAY 10000 /* Max. delay between unit transfer */ /* * DSW user config structure */ typedef struct dsw_config_s { spcs_s_info_t status; char master_vol[DSW_NAMELEN]; char shadow_vol[DSW_NAMELEN]; char bitmap_vol[DSW_NAMELEN]; char cluster_tag[DSW_NAMELEN]; char group_name[DSW_NAMELEN]; int flag; } dsw_config_t; /* * DSW segmented bitmap I/O structure */ typedef struct dsw_segment_s { spcs_s_info_t status; char shadow_vol[DSW_NAMELEN]; unsigned seg_number; /* 32KB Segment number to start at */ unsigned char *shd_bitmap; /* pointer to shadow bitmap */ int shd_size; /* size of shadow bitmap */ unsigned char *cpy_bitmap; /* pointer to copy bitmap */ int cpy_size; /* size of copy bitmap */ unsigned char *idx_bitmap; /* pointer to index table */ int idx_size; /* size of index table */ } dsw_segment_t; /* * DSW user bitmap structure */ typedef struct dsw_bitmap_s { spcs_s_info_t status; char shadow_vol[DSW_NAMELEN]; unsigned char *shd_bitmap; /* pointer to shadow bitmap */ uint64_t shd_size; /* size of shadow bitmap */ uint64_t copy_size; /* size of copy bitmap */ unsigned char *copy_bitmap; /* pointer to copy bitmap */ } dsw_bitmap_t; /* * DSW general ioctl structure */ typedef struct dsw_ioctl_s { spcs_s_info_t status; char shadow_vol[DSW_NAMELEN]; int flags; pid_t pid; } dsw_ioctl_t; /* * DSW general atomic ioctl structure operating on several Image sets */ typedef struct dsw_aioctl_s { spcs_s_info_t status; int flags; int count; pid_t pid; char shadow_vol[DSW_NAMELEN]; /* start of list of image sets */ } dsw_aioctl_t; /* * DSW stat ioctl structure */ typedef struct dsw_stat_s { spcs_s_info_t status; char shadow_vol[DSW_NAMELEN]; int stat; uint64_t size; char overflow_vol[DSW_NAMELEN]; uint64_t shdsize; uint64_t shdused; char group_name[DSW_NAMELEN]; char cluster_tag[DSW_NAMELEN]; uint64_t mtime; } dsw_stat_t; /* * DSW version ioctl structure */ typedef struct dsw_version_s { spcs_s_info_t status; int major; /* Major release number */ int minor; /* Minor release number */ int micro; /* Micro release number */ int baseline; /* Baseline revision number */ } dsw_version_t; /* * DSW get bits set in bitmap structure */ typedef struct dsw_bitsset_s { spcs_s_info_t status; char shadow_vol[DSW_NAMELEN]; uint64_t tot_size; /* total number of bits in map */ uint64_t tot_set; /* number of bitmap bits set */ } dsw_bitsset_t; /* * DSW list ioctl structure */ typedef struct dsw_list_s { spcs_s_info_t status; int list_size; /* number of elements in list */ int list_used; /* number of elements returned */ dsw_config_t *list; } dsw_list_t; /* * DSW copy parameter structure */ typedef struct dsw_copyp_s { spcs_s_info_t status; char shadow_vol[DSW_NAMELEN]; int copy_unit; int copy_delay; } dsw_copyp_t; /* * DSW ostat ioctl structure */ typedef struct dsw_ostat_s { spcs_s_info_t status; char overflow_vol[DSW_NAMELEN]; int drefcnt; uint64_t used; uint64_t unused; uint64_t nchunks; int crefcnt; int flags; int hversion; int hmagic; } dsw_ostat_t; /* * DSW move group structure */ typedef struct dsw_movegrp_s { spcs_s_info_t status; char shadow_vol[DSW_NAMELEN]; char new_group[DSW_NAMELEN]; } dsw_movegrp_t; /* * II_PIT_PROPS structure */ typedef struct pit_props_s { int iirc; int mstid; int shdid; int bmpid; int ovrid; char group[DSW_NAMELEN]; char cluster[DSW_NAMELEN]; int has_overflow; int flags; uint64_t size; int64_t shdchks; int64_t copybits; int64_t shdbits; } pit_props_t; /* * II_PIT_UPDATE structure */ typedef struct pit_update_s { int iirc; char direction; } pit_update_t; #ifdef _KERNEL /* * 32 bit versions of ioctl structures */ typedef struct dsw_config32_s { spcs_s_info32_t status; char master_vol[DSW_NAMELEN]; char shadow_vol[DSW_NAMELEN]; char bitmap_vol[DSW_NAMELEN]; char cluster_tag[DSW_NAMELEN]; char group_name[DSW_NAMELEN]; int flag; } dsw_config32_t; /* * DSW segmented bitmap I/O structure */ typedef struct dsw_segment32_s { spcs_s_info32_t status; char shadow_vol[DSW_NAMELEN]; uint32_t seg_number; uint32_t shd_bitmap; int shd_size; uint32_t cpy_bitmap; int cpy_size; uint32_t idx_bitmap; int idx_size; } dsw_segment32_t; /* * DSW user bitmap structure */ typedef struct dsw_bitmap32_s { spcs_s_info32_t status; char shadow_vol[DSW_NAMELEN]; uint32_t shd_bitmap; /* 32 bit pointer value */ uint64_t shd_size; uint64_t copy_size; uint32_t copy_bitmap; /* 32 bit pointer value */ } dsw_bitmap32_t; typedef struct dsw_ioctl32_s { spcs_s_info32_t status; char shadow_vol[DSW_NAMELEN]; int flags; pid_t pid; } dsw_ioctl32_t; typedef struct dsw_stat32_s { spcs_s_info32_t status; char shadow_vol[DSW_NAMELEN]; int stat; uint64_t size; char overflow_vol[DSW_NAMELEN]; uint64_t shdsize; uint64_t shdused; char group_name[DSW_NAMELEN]; char cluster_tag[DSW_NAMELEN]; uint64_t mtime; } dsw_stat32_t; typedef struct dsw_version32_s { spcs_s_info32_t status; int major; /* Major release number */ int minor; /* Minor release number */ int micro; /* Micro release number */ int baseline; /* Baseline revision number */ } dsw_version32_t; typedef struct dsw_bitsset32_s { spcs_s_info32_t status; char shadow_vol[DSW_NAMELEN]; uint64_t tot_size; /* total number of bits in map */ uint64_t tot_set; /* number of bitmap bits set */ } dsw_bitsset32_t; typedef struct dsw_list32_s { spcs_s_info32_t status; int list_size; int list_used; uint32_t list; } dsw_list32_t; typedef struct dsw_aioctl32_s { spcs_s_info32_t status; int flags; int count; pid_t pid; char shadow_vol[DSW_NAMELEN]; /* start of list of image sets */ } dsw_aioctl32_t; typedef struct dsw_copyp32_s { spcs_s_info32_t status; char shadow_vol[DSW_NAMELEN]; int copy_unit; int copy_delay; } dsw_copyp32_t; typedef struct dsw_ostat32_s { spcs_s_info32_t status; char overflow_vol[DSW_NAMELEN]; int drefcnt; uint64_t used; uint64_t unused; uint64_t nchunks; int crefcnt; int flags; int hversion; int hmagic; } dsw_ostat32_t; /* * DSW move group structure */ typedef struct dsw_movegrp32_s { spcs_s_info32_t status; char shadow_vol[DSW_NAMELEN]; char new_group[DSW_NAMELEN]; } dsw_movegrp32_t; #endif /* _KERNEL */ /* dsw_copy dsw_ioctl_t flag bits */ #define CV_BMP_ONLY 0x00000001 /* copy only chunks flagged by bitmap */ #define CV_SHD2MST 0x00000002 /* copy shadow to master */ #define CV_LOCK_PID 0x00000004 /* On copy/update, lock PIT by PID */ #define CV_CLR_BMP 0x00000010 /* clear bits in bit map during copy */ #define CV_IS_CLUSTER 0x00000020 /* struct refers to cluster */ #define CV_IS_GROUP 0x00000040 /* struct refers to group (cpy/upd) */ #define CV_SIBLING 0x00010000 /* internal copy_on_write flag */ /* nsc_control commands */ #define II_CONTROL(x) ('I' << 24 | 'I' << 16 | (x)) /* 0x49490000 */ #define II_PIT_COPY II_CONTROL(1) /* Perform an II Copy */ #define II_PIT_UPDATE II_CONTROL(2) /* Perform an II Update */ #define II_PIT_ABORT II_CONTROL(3) /* Perform an II Abort */ #define II_PIT_WAIT II_CONTROL(4) /* Perform an II Wait */ #define II_PIT_PROPS II_CONTROL(5) /* Perform an II Properties */ #ifdef __cplusplus } #endif #endif /* _DSW_H */