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  */
  21 /*
  22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 #ifndef _DSW_H
  27 #define _DSW_H
  28 
  29 #ifdef __cplusplus
  30 extern "C" {
  31 #endif
  32 
  33 /*
  34  * Miscellaneous defines
  35  */
  36 
  37 #define DSW_BITS        8       /* # of bits in a byte */
  38 #define DSW_SIZE        64      /* fba's in a DSW chunk */
  39 
  40 
  41 /*
  42  * Ioctl definitions
  43  */
  44 
  45 #define _D_(x)                  (('D'<<16)|('W'<<8)|(x))
  46 
  47 #define DSWIOC_ENABLE           _D_(1)  /* Configure DSW pair */
  48 #define DSWIOC_RESUME           _D_(2)  /* Resume a DSW pair */
  49 #define DSWIOC_SUSPEND          _D_(3)  /* Suspend a DSW pair */
  50 #define DSWIOC_COPY             _D_(4)  /* Copy DSW volume over its pair */
  51 #define DSWIOC_BITMAP           _D_(5)  /* Get bitmap */
  52 #define DSWIOC_STAT             _D_(6)  /* Get state of shadow */
  53 #define DSWIOC_DISABLE          _D_(7)  /* Deconfigure DSW pair */
  54 #define DSWIOC_SHUTDOWN         _D_(8)  /* Suspend all DSW pairs */
  55 #define DSWIOC_ABORT            _D_(9)  /* Abort Copy of DSW pair */
  56 #define DSWIOC_VERSION          _D_(10) /* DataShadow version */
  57 #define DSWIOC_RESET            _D_(11) /* Reset DataShadow set */
  58 #define DSWIOC_OFFLINE          _D_(12) /* Offline volumes */
  59 #define DSWIOC_WAIT             _D_(13) /* Wait for copy to complete */
  60 #define DSWIOC_LIST             _D_(14) /* List current kernel shadow groups */
  61 #define DSWIOC_ACOPY            _D_(15) /* Copy DSW volumes over their pairs */
  62 #define DSWIOC_EXPORT           _D_(16) /* Export the shadow volume */
  63 #define DSWIOC_IMPORT           _D_(17) /* Import shadow volume */
  64 #define DSWIOC_JOIN             _D_(18) /* Rejoin previously exported shadow */
  65 #define DSWIOC_COPYP            _D_(19) /* Set and get copy parameters */
  66 #define DSWIOC_OCREAT           _D_(20) /* Create overflow volume */
  67 #define DSWIOC_OATTACH          _D_(21) /* Attach overflow volume */
  68 #define DSWIOC_ODETACH          _D_(22) /* Detach overflow volume */
  69 #define DSWIOC_OLIST            _D_(23) /* List overflow volumes */
  70 #define DSWIOC_OSTAT            _D_(24) /* Stat overflow volume */
  71 #define DSWIOC_SBITSSET         _D_(25) /* Get # of bits set in shadow bitmap */
  72 #define DSWIOC_CBITSSET         _D_(26) /* Get # of bits set in copy bitmap */
  73 #define DSWIOC_LISTLEN          _D_(27) /* length of DSWIOC_LIST data */
  74 #define DSWIOC_OLISTLEN         _D_(28) /* length of DSWIOC_OLIST data */
  75 #define DSWIOC_SEGMENT          _D_(29) /* Get segemented bitmaps */
  76 #define DSWIOC_MOVEGRP          _D_(30) /* Move set from one group to another */
  77 #define DSWIOC_CLIST            _D_(31) /* get list of resource groups */
  78 #define DSWIOC_GLIST            _D_(32) /* get list of groups */
  79 #define DSWIOC_CHANGETAG        _D_(33) /* change the cluster tag of a set */
  80 #define DSWIOC_OSTAT2           _D_(34) /* Stat overflow volume enhanced */
  81 
  82 /*
  83  * Config and status flags
  84  */
  85 
  86 #define DSW_GOLDEN      0x0001          /* the set is independent */
  87 
  88 #define DSW_COPYINGP    0x0100          /* Copy in progress */
  89 #define DSW_COPYINGM    0x0200          /* Copying master to shadow */
  90 #define DSW_COPYINGS    0x0400          /* Copying shadow to master */
  91 #define DSW_COPYING     0x0600          /* Copying, may be in progress */
  92 #define DSW_COPY_FLAGS  0x0700          /* Copy flags */
  93 #define DSW_COPYINGX    0x0800          /* Copy exit requested */
  94 #define DSW_OFFLINE     0xf000          /* An underlying volume offline */
  95 #define DSW_BMPOFFLINE  0x1000          /* Bitmap volume offline */
  96 #define DSW_SHDOFFLINE  0x2000          /* Shadow volume offline */
  97 #define DSW_MSTOFFLINE  0x4000          /* Master volume offline */
  98 #define DSW_OVROFFLINE  0x8000          /* Overflow volume offline */
  99 #define DSW_TREEMAP     0x10000         /* Shadow volume accessed by an index */
 100 #define DSW_OVERFLOW    0x20000         /* Shadow volume has overflowed */
 101 #define DSW_SHDEXPORT   0x40000         /* Shadow volume has been exported */
 102 #define DSW_SHDIMPORT   0x80000         /* Shadow volume has been imported */
 103 #define DSW_VOVERFLOW   0x100000        /* Shadow volume using overflow vol */
 104 #define DSW_HANGING     0x200000        /* Hanging master structure  */
 105 #define DSW_CFGOFFLINE  0x400000        /* config db is offline */
 106 #define DSW_OVRHDRDRTY  0x800000        /* Overflow header dirty */
 107 #define DSW_RESIZED     0x1000000       /* mst_size != shd_size */
 108 #define DSW_FRECLAIM    0x2000000       /* force the reclaim of an ovr vol */
 109 
 110 /*
 111  * used for SNMP trap only.
 112  * These flags help distinguish between enable and resume,
 113  * suspend and disable.
 114  * Note that DSW_HANGING is set for both suspend and disable
 115  */
 116 #define DSW_SNMP_CLR            0       /* no flag is set       */
 117 #define DSW_SNMP_DISABLE        1       /* Set is disabled      */
 118 #define DSW_SNMP_SUSPEND        2       /* Set is suspended     */
 119 #define DSW_SNMP_ENABLE         3       /* Set is enabled       */
 120 #define DSW_SNMP_RESUME         4       /* Set is resumed       */
 121 #define DSW_SNMP_OVER_ATTACH    5       /* overflow attached    */
 122 #define DSW_SNMP_OVER_DETACH    6       /* overflow detached    */
 123 #define DSW_SNMP_UPDATE         7       /* update operation     */
 124 #define DSW_SNMP_COPIED         8       /* copy operation       */
 125 
 126         /* Overflow volume flags */
 127 #define IIO_OFFLINE     0x0001          /* Volume is offline */
 128 #define IIO_HDR_WRTN    0x0002          /* Header written */
 129 #define IIO_CNTR_INVLD  0x0004          /* Overflow counters invalid */
 130 #define IIO_VOL_UPDATE  0x0008          /* Performing group update */
 131 
 132 #define DSW_NAMELEN     64              /* NSC_MAXPATH - don't change without */
 133                                         /* amending header version number */
 134 
 135 #define DSWDEV          "/dev/ii"
 136 #define II_IMPORTED_SHADOW "<imported_shadow>"
 137 
 138 /*
 139  * Configuration parameter defines
 140  * ii_bitmap, ii_throttle_unit, ii_throttle_delay
 141  */
 142 #define II_KMEM         0       /* Load/store on resume/suspend, in memory */
 143 #define II_WTHRU        1       /* Read/write bitmap thru to bitmap volume */
 144 #define II_FWC          2       /* Read/write bitmap to FWC, else WTHRU */
 145 
 146 #define MIN_THROTTLE_UNIT       100     /* Min. number of units to transfer */
 147 #define MAX_THROTTLE_UNIT       60000   /* Max. number of units to transfer */
 148 #define MIN_THROTTLE_DELAY      2       /* Min. delay between unit transfer */
 149 #define MAX_THROTTLE_DELAY      10000   /* Max. delay between unit transfer */
 150 
 151 /*
 152  * DSW user config structure
 153  */
 154 
 155 typedef struct dsw_config_s {
 156         spcs_s_info_t status;
 157         char master_vol[DSW_NAMELEN];
 158         char shadow_vol[DSW_NAMELEN];
 159         char bitmap_vol[DSW_NAMELEN];
 160         char cluster_tag[DSW_NAMELEN];
 161         char group_name[DSW_NAMELEN];
 162         int flag;
 163 } dsw_config_t;
 164 
 165 /*
 166  * DSW segmented bitmap I/O structure
 167  */
 168 typedef struct dsw_segment_s {
 169         spcs_s_info_t status;
 170         char shadow_vol[DSW_NAMELEN];
 171         unsigned seg_number;            /* 32KB Segment number to start at */
 172         unsigned char   *shd_bitmap;            /* pointer to shadow bitmap */
 173         int     shd_size;                       /* size of shadow bitmap */
 174         unsigned char   *cpy_bitmap;            /* pointer to copy bitmap */
 175         int     cpy_size;                       /* size of copy bitmap */
 176         unsigned char   *idx_bitmap;            /* pointer to index table */
 177         int     idx_size;                       /* size of index table */
 178 } dsw_segment_t;
 179 
 180 /*
 181  * DSW user bitmap structure
 182  */
 183 
 184 typedef struct dsw_bitmap_s {
 185         spcs_s_info_t status;
 186         char shadow_vol[DSW_NAMELEN];
 187         unsigned char   *shd_bitmap;            /* pointer to shadow bitmap */
 188         uint64_t shd_size;                      /* size of shadow bitmap */
 189         uint64_t copy_size;                     /* size of copy bitmap */
 190         unsigned char   *copy_bitmap;           /* pointer to copy bitmap */
 191 } dsw_bitmap_t;
 192 
 193 
 194 /*
 195  * DSW general ioctl structure
 196  */
 197 
 198 typedef struct dsw_ioctl_s {
 199         spcs_s_info_t status;
 200         char shadow_vol[DSW_NAMELEN];
 201         int flags;
 202         pid_t pid;
 203 } dsw_ioctl_t;
 204 
 205 
 206 /*
 207  * DSW general atomic ioctl structure operating on several Image sets
 208  */
 209 
 210 typedef struct dsw_aioctl_s {
 211         spcs_s_info_t status;
 212         int flags;
 213         int count;
 214         pid_t pid;
 215         char shadow_vol[DSW_NAMELEN];   /* start of list of image sets */
 216 } dsw_aioctl_t;
 217 
 218 
 219 /*
 220  * DSW stat ioctl structure
 221  */
 222 
 223 typedef struct dsw_stat_s {
 224         spcs_s_info_t status;
 225         char shadow_vol[DSW_NAMELEN];
 226         int stat;
 227         uint64_t size;
 228         char overflow_vol[DSW_NAMELEN];
 229         uint64_t shdsize;
 230         uint64_t shdused;
 231         char group_name[DSW_NAMELEN];
 232         char cluster_tag[DSW_NAMELEN];
 233         uint64_t mtime;
 234 } dsw_stat_t;
 235 
 236 
 237 /*
 238  * DSW version ioctl structure
 239  */
 240 
 241 typedef struct dsw_version_s {
 242         spcs_s_info_t status;
 243         int major;                      /* Major release number */
 244         int minor;                      /* Minor release number */
 245         int micro;                      /* Micro release number */
 246         int baseline;                   /* Baseline revision number */
 247 } dsw_version_t;
 248 
 249 /*
 250  * DSW get bits set in bitmap structure
 251  */
 252 
 253 typedef struct dsw_bitsset_s {
 254         spcs_s_info_t status;
 255         char    shadow_vol[DSW_NAMELEN];
 256         uint64_t tot_size;              /* total number of bits in map */
 257         uint64_t tot_set;               /* number of bitmap bits set */
 258 } dsw_bitsset_t;
 259 
 260 
 261 /*
 262  * DSW list ioctl structure
 263  */
 264 
 265 typedef struct dsw_list_s {
 266         spcs_s_info_t status;
 267         int list_size;                  /* number of elements in list */
 268         int list_used;                  /* number of elements returned */
 269         dsw_config_t *list;
 270 } dsw_list_t;
 271 
 272 /*
 273  * DSW copy parameter structure
 274  */
 275 
 276 typedef struct dsw_copyp_s {
 277         spcs_s_info_t status;
 278         char shadow_vol[DSW_NAMELEN];
 279         int copy_unit;
 280         int copy_delay;
 281 } dsw_copyp_t;
 282 
 283 /*
 284  * DSW ostat ioctl structure
 285  */
 286 
 287 typedef struct dsw_ostat_s {
 288         spcs_s_info_t status;
 289         char overflow_vol[DSW_NAMELEN];
 290         int drefcnt;
 291         uint64_t used;
 292         uint64_t unused;
 293         uint64_t nchunks;
 294         int crefcnt;
 295         int flags;
 296         int hversion;
 297         int hmagic;
 298 } dsw_ostat_t;
 299 
 300 /*
 301  * DSW move group structure
 302  */
 303 
 304 typedef struct dsw_movegrp_s {
 305         spcs_s_info_t status;
 306         char shadow_vol[DSW_NAMELEN];
 307         char new_group[DSW_NAMELEN];
 308 } dsw_movegrp_t;
 309 
 310 /*
 311  * II_PIT_PROPS structure
 312  */
 313 typedef struct pit_props_s {
 314         int iirc;
 315         int mstid;
 316         int shdid;
 317         int bmpid;
 318         int ovrid;
 319         char group[DSW_NAMELEN];
 320         char cluster[DSW_NAMELEN];
 321         int  has_overflow;
 322         int  flags;
 323         uint64_t  size;
 324         int64_t  shdchks;
 325         int64_t  copybits;
 326         int64_t  shdbits;
 327 } pit_props_t;
 328 
 329 /*
 330  * II_PIT_UPDATE structure
 331  */
 332 typedef struct pit_update_s {
 333         int iirc;
 334         char direction;
 335 } pit_update_t;
 336 
 337 #ifdef _KERNEL
 338 /*
 339  * 32 bit versions of ioctl structures
 340  */
 341 
 342 typedef struct dsw_config32_s {
 343         spcs_s_info32_t status;
 344         char master_vol[DSW_NAMELEN];
 345         char shadow_vol[DSW_NAMELEN];
 346         char bitmap_vol[DSW_NAMELEN];
 347         char cluster_tag[DSW_NAMELEN];
 348         char group_name[DSW_NAMELEN];
 349         int flag;
 350 } dsw_config32_t;
 351 
 352 /*
 353  * DSW segmented bitmap I/O structure
 354  */
 355 typedef struct dsw_segment32_s {
 356         spcs_s_info32_t status;
 357         char shadow_vol[DSW_NAMELEN];
 358         uint32_t seg_number;
 359         uint32_t shd_bitmap;
 360         int      shd_size;
 361         uint32_t cpy_bitmap;
 362         int      cpy_size;
 363         uint32_t idx_bitmap;
 364         int      idx_size;
 365 } dsw_segment32_t;
 366 
 367 /*
 368  * DSW user bitmap structure
 369  */
 370 
 371 typedef struct dsw_bitmap32_s {
 372         spcs_s_info32_t status;
 373         char shadow_vol[DSW_NAMELEN];
 374         uint32_t shd_bitmap;            /* 32 bit pointer value */
 375         uint64_t shd_size;
 376         uint64_t copy_size;
 377         uint32_t copy_bitmap;           /* 32 bit pointer value */
 378 } dsw_bitmap32_t;
 379 
 380 typedef struct dsw_ioctl32_s {
 381         spcs_s_info32_t status;
 382         char shadow_vol[DSW_NAMELEN];
 383         int flags;
 384         pid_t pid;
 385 } dsw_ioctl32_t;
 386 
 387 typedef struct dsw_stat32_s {
 388         spcs_s_info32_t status;
 389         char shadow_vol[DSW_NAMELEN];
 390         int stat;
 391         uint64_t size;
 392         char overflow_vol[DSW_NAMELEN];
 393         uint64_t shdsize;
 394         uint64_t shdused;
 395         char group_name[DSW_NAMELEN];
 396         char cluster_tag[DSW_NAMELEN];
 397         uint64_t mtime;
 398 } dsw_stat32_t;
 399 
 400 typedef struct dsw_version32_s {
 401         spcs_s_info32_t status;
 402         int major;                      /* Major release number */
 403         int minor;                      /* Minor release number */
 404         int micro;                      /* Micro release number */
 405         int baseline;                   /* Baseline revision number */
 406 } dsw_version32_t;
 407 
 408 typedef struct dsw_bitsset32_s {
 409         spcs_s_info32_t status;
 410         char    shadow_vol[DSW_NAMELEN];
 411         uint64_t        tot_size;       /* total number of bits in map */
 412         uint64_t        tot_set;        /* number of bitmap bits set */
 413 } dsw_bitsset32_t;
 414 
 415 typedef struct dsw_list32_s {
 416         spcs_s_info32_t status;
 417         int list_size;
 418         int list_used;
 419         uint32_t list;
 420 } dsw_list32_t;
 421 
 422 typedef struct dsw_aioctl32_s {
 423         spcs_s_info32_t status;
 424         int flags;
 425         int count;
 426         pid_t pid;
 427         char shadow_vol[DSW_NAMELEN];   /* start of list of image sets */
 428 } dsw_aioctl32_t;
 429 
 430 typedef struct dsw_copyp32_s {
 431         spcs_s_info32_t status;
 432         char shadow_vol[DSW_NAMELEN];
 433         int copy_unit;
 434         int copy_delay;
 435 } dsw_copyp32_t;
 436 
 437 typedef struct dsw_ostat32_s {
 438         spcs_s_info32_t status;
 439         char overflow_vol[DSW_NAMELEN];
 440         int drefcnt;
 441         uint64_t used;
 442         uint64_t unused;
 443         uint64_t nchunks;
 444         int crefcnt;
 445         int flags;
 446         int hversion;
 447         int hmagic;
 448 } dsw_ostat32_t;
 449 
 450 /*
 451  * DSW move group structure
 452  */
 453 
 454 typedef struct dsw_movegrp32_s {
 455         spcs_s_info32_t status;
 456         char shadow_vol[DSW_NAMELEN];
 457         char new_group[DSW_NAMELEN];
 458 } dsw_movegrp32_t;
 459 
 460 #endif  /* _KERNEL */
 461 
 462 /* dsw_copy dsw_ioctl_t flag bits */
 463 #define CV_BMP_ONLY     0x00000001      /* copy only chunks flagged by bitmap */
 464 #define CV_SHD2MST      0x00000002      /* copy shadow to master */
 465 #define CV_LOCK_PID     0x00000004      /* On copy/update, lock PIT by PID */
 466 #define CV_CLR_BMP      0x00000010      /* clear bits in bit map during copy */
 467 #define CV_IS_CLUSTER   0x00000020      /* struct refers to cluster */
 468 #define CV_IS_GROUP     0x00000040      /* struct refers to group (cpy/upd) */
 469 #define CV_SIBLING      0x00010000      /* internal copy_on_write flag */
 470 
 471 /* nsc_control commands */
 472 
 473 #define II_CONTROL(x)   ('I' << 24 | 'I' << 16 | (x))       /* 0x49490000 */
 474 
 475 #define II_PIT_COPY     II_CONTROL(1)   /* Perform an II Copy */
 476 #define II_PIT_UPDATE   II_CONTROL(2)   /* Perform an II Update */
 477 #define II_PIT_ABORT    II_CONTROL(3)   /* Perform an II Abort */
 478 #define II_PIT_WAIT     II_CONTROL(4)   /* Perform an II Wait */
 479 #define II_PIT_PROPS    II_CONTROL(5)   /* Perform an II Properties */
 480 
 481 #ifdef __cplusplus
 482 }
 483 #endif
 484 
 485 #endif  /* _DSW_H */