home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 March B / SCO_CASTOR4RRT.iso / vxvm / root.2 / usr / include / volipc.h / volipc
Text File  |  1998-08-19  |  43KB  |  985 lines

  1. /*
  2.  * Copyright (c) 1998 The Santa Cruz Operation, Inc.. All Rights Reserved. 
  3.  *                                                                         
  4.  *        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF THE               
  5.  *                   SANTA CRUZ OPERATION INC.                             
  6.  *                                                                         
  7.  *   The copyright notice above does not evidence any actual or intended   
  8.  *   publication of such source code.                                      
  9.  */
  10.  
  11. /* @(#)lib.vxvm:libvxvm/common/libvxvm/volipc.h    1.2 3/3/97 04:27:40 - lib.vxvm:libvxvm/common/libvxvm/volipc.h */
  12. #ident    "@(#)lib.vxvm:libvxvm/common/libvxvm/volipc.h    1.2"
  13.  
  14. /*
  15.  * Copyright(C)1996 VERITAS Software Corporation.  ALL RIGHTS RESERVED.
  16.  * UNPUBLISHED -- RIGHTS RESERVED UNDER THE COPYRIGHT
  17.  * LAWS OF THE UNITED STATES.  USE OF A COPYRIGHT NOTICE
  18.  * IS PRECAUTIONARY ONLY AND DOES NOT IMPLY PUBLICATION
  19.  * OR DISCLOSURE.
  20.  * 
  21.  * THIS SOFTWARE CONTAINS CONFIDENTIAL INFORMATION AND
  22.  * TRADE SECRETS OF VERITAS SOFTWARE.  USE, DISCLOSURE,
  23.  * OR REPRODUCTION IS PROHIBITED WITHOUT THE PRIOR
  24.  * EXPRESS WRITTEN PERMISSION OF VERITAS SOFTWARE.
  25.  * 
  26.  *               RESTRICTED RIGHTS LEGEND
  27.  * USE, DUPLICATION, OR DISCLOSURE BY THE GOVERNMENT IS
  28.  * SUBJECT TO RESTRICTIONS AS SET FORTH IN SUBPARAGRAPH
  29.  * (C) (1) (ii) OF THE RIGHTS IN TECHNICAL DATA AND
  30.  * COMPUTER SOFTWARE CLAUSE AT DFARS 252.227-7013.
  31.  *               VERITAS SOFTWARE
  32.  * 1600 PLYMOUTH STREET, MOUNTAIN VIEW, CA 94043
  33.  */
  34.  
  35. #ifndef _VOLIPC_H
  36. #define _VOLIPC_H
  37.  
  38. #include <vxvm/voldefs.h>
  39. #include <vxvm/voldefault.h>
  40. #include <vxvm/volioctl.h>
  41. #include <vxvm/volerrno.h>
  42. #include <volintf.h>
  43.  
  44. /*
  45.  * volipc.h - vold/client communication header file
  46.  *
  47.  * A mounted stream is used as the rendezvous point for vold/client IPC.
  48.  * After rendezvous, all messages back and forth are preceded by a long
  49.  * that specifies the number of bytes that are contained in the message
  50.  * (not including the length).  The first long in the message contains
  51.  * a frame start magic number.  The last long contains a frame end magic
  52.  * number.
  53.  */
  54.  
  55.  
  56. /* mounted stream or named pipe rendezvous points */
  57. #ifndef VOLD_REQUEST_FILE
  58. #define    VOLD_REQUEST_FILE    "/etc/vx/vold_request"    /* normal file */
  59. #endif
  60. #ifndef VOLD_DIAG_FILE
  61. #define VOLD_DIAG_FILE        "/etc/vx/vold_diag"    /* file for diag mode */
  62. #endif
  63.  
  64. /* socket IPC rendezvous ports */
  65. #ifndef VOLD_REQUEST_IP_PORT
  66. #define VOLD_REQUEST_IP_PORT    "volmgr_request"    /* normal port */
  67. #endif
  68. #ifndef VOLD_DIAG_IP_PORT
  69. #define VOLD_DIAG_IP_PORT    "volmgr_diag"        /* port for diag mode */
  70. #endif
  71.  
  72. /*
  73.  * pseudo-names used to get the diag and request portals
  74.  *
  75.  * These names can be passed to vol_set_rendezvous(), on the client
  76.  * side, or to vold_add_portal(), on the vold side.  These functions
  77.  * interpret these names to imply the IP ports or files listed above.
  78.  */
  79. #define VOLD_REQUEST_PORTAL    "*request*"    /* normal request portal */
  80. #define VOLD_DIAG_PORTAL    "*diag*"    /* diag mode request portal */
  81.  
  82. /*
  83.  * path to daemon binaries
  84.  */
  85.  
  86. #define VOLD_PATH    "/sbin/vxconfigd"    /* pathname of vold */
  87. #define VOLIOD_PATH    "/sbin/vxiod"        /* pathname of voliod */
  88.  
  89. /*
  90.  * values and structures that are used for both sides of the interface
  91.  * between /dev/volcontrol and /dev/volconfig.
  92.  */
  93.  
  94. /*
  95.  * volume manager operation codes
  96.  *
  97.  * Operations for which no response is expected are flagged with
  98.  * "no response".
  99.  */
  100. typedef enum volop {        /* volume manager command number */
  101.     MIN_VOLOP,        /* sentinel value, must be first */
  102.     VOLOP_CONNECT,        /* connection request, no response */
  103.     VOLOP_VOL_DIAG,        /* diagnostic request */
  104.     VOLOP_VOL_INFO,        /* obtain vold info */
  105.     VOLOP_VOL_ID,        /* get configuration id */
  106.     VOLOP_VOL_TRANS,    /* start a transaction */
  107.     VOLOP_VOL_COMMIT,    /* commit a transaction */
  108.     VOLOP_VOL_CRETRY,    /* retry of a commit */
  109.     VOLOP_VOL_CACK,        /* acknowledge commit completion, no response */
  110.     VOLOP_VOL_ABORT,    /* abort a transaction */
  111.     VOLOP_SD_CREAT,        /* create a subdisk */
  112.     VOLOP_PLEX_CREAT,    /* create a plex */
  113.     VOLOP_VOL_CREAT,    /* create a volume */
  114.     VOLOP_SD_DELETE,    /* delete a subdisk */
  115.     VOLOP_PLEX_DELETE,    /* delete a plex */
  116.     VOLOP_VOL_DELETE,    /* delete a volume */
  117.     VOLOP_SD_ASSOC,        /* associate a subdisk with a plex */
  118.     VOLOP_PLEX_ASSOC,    /* associate a plex with a volume */
  119.     VOLOP_SD_DIS,        /* disassociate a subdisk with a plex */
  120.     VOLOP_PLEX_DIS,        /* disassociate a plex with a volume */
  121.     VOLOP_SD_CHANGE,    /* change a subdisk */
  122.     VOLOP_PLEX_CHANGE,    /* change a plex */
  123.     VOLOP_VOL_CHANGE,    /* change a volume */
  124.     VOLOP_VOL_SUMMARY,    /* get summary of the configuration */
  125.     VOLOP_VOL_NAME,        /* get list of record names */
  126.     VOLOP_SD_GET,        /* get a subdisk record */
  127.     VOLOP_PLEX_GET,        /* get a plex record */
  128.     VOLOP_VOL_GET,        /* get a volume record */
  129.     VOLOP_VOL_GET_PLEX,    /* get plexes associated with volume */
  130.     VOLOP_PLEX_GET_SD,    /* get subdisks associated with plex */
  131.     VOLOP_SEARCH,        /* search through a configuration */
  132.     VOLOP_SD_AS_LOG,    /* associate a log subdisk to a plex */
  133.     VOLOP_UNIQUE,        /* generate a unique name */
  134.     VOLOP_MAKE_NAME,    /* generate unique name from a template */
  135.     VOLOP_RENAME,        /* rename a record */
  136.     VOLOP_DELETE,        /* delete any type of record, by name */
  137.     VOLOP_DELETE_RID,    /* delete any type of record, by record ID */
  138.     VOLOP_SD_CREAT_FROM,    /* create a subdisk record from another */
  139.     VOLOP_DM_CREAT,        /* create a disk media record */
  140.     VOLOP_DG_CREAT,        /* create a disk group configuration record */
  141.     VOLOP_DM_DELETE,    /* delete a disk media record */
  142.     VOLOP_DM_CHANGE,    /* change a disk media record */
  143.     VOLOP_DG_CHANGE,    /* change a disk group configuration record */
  144.     VOLOP_DM_GET,        /* get a disk media record */
  145.     VOLOP_DG_GET,        /* get a disk group configuration record */
  146.     VOLOP_DG_GET_IMPORT_ID,    /* get a disk group record by import id */
  147.     VOLOP_DA_CREAT,        /* create a new disk access record */
  148.     VOLOP_DA_GET,        /* get a disk access record */
  149.     VOLOP_DA_CHANGE,    /* change a disk access record */
  150.     VOLOP_DA_DELETE,    /* delete a disk access record */
  151.     VOLOP_DG_SET_CURRENT,    /* set the current disk group name */
  152.     VOLOP_DG_SET_CURRENT_ID,/* set the current disk group by unique id */
  153.     VOLOP_DG_GETCFG,    /* get the current disk group configuration */
  154.     VOLOP_DG_GETCFG_ALL,    /* get all disk group configurations */
  155.     VOLOP_DG_GETCFG_NAME,    /* get disk group configuration, by name */
  156.     VOLOP_DG_GETCFG_ID,    /* get disk group configuration, by unique id */
  157.     VOLOP_DG_GETCFG_DISK,    /* get configuration from a disk */
  158.     VOLOP_DG_GETCFG_DIFF,    /* get differences from an old configuration */
  159.     VOLOP_DG_GETCFG_SEARCH,    /* get records matching a pattern */
  160.     VOLOP_GET,        /* get a record by name */
  161.     VOLOP_GET_RID,        /* get a record by record ID */
  162.     VOLOP_GET_HIER,        /* get the hierarchy related to a record */
  163.     VOLOP_GET_HIER_RID,    /* get a hierarchy, based on a record ID */
  164.     VOLOP_DG_LOCATE,    /* locate disk group containing records */
  165.     VOLOP_DG_GET_FREE,    /* list all free space for a disk group */
  166.     VOLOP_DG_IMPORT,    /* import a disk group */
  167.     VOLOP_DG_DEPORT,    /* import a disk group */
  168.     VOLOP_DG_DEPORT_ID,    /* import a disk group, named by group id */
  169.     VOLOP_DM_AS_DA,        /* associate disk media and access records */
  170.     VOLOP_DM_DIS_DA,    /* dissociate disk media and access records */
  171.     VOLOP_DA_FIND,        /* convert a disk name to a disk access name */
  172.     VOLOP_DISK_INIT,    /* initialize a disk */
  173.     VOLOP_DISK_DEFINE,    /* define a disk */
  174.     VOLOP_DISK_GET_ATTRS,    /* get disk header information */
  175.     VOLOP_DISK_OP,        /* switchout disk operation */
  176.     VOLOP_CHANGE_NOTIFY,    /* change requested notifications */
  177.     VOLOP_VOLBOOT_INIT,    /* initialize volboot file */
  178.     VOLOP_VOLBOOT_HOSTID,    /* change hostid in volboot file */
  179.     VOLOP_VOLBOOT_ADD_DISK,    /* add disk to volboot file */
  180.     VOLOP_VOLBOOT_RM_DISK,    /* add disk to volboot file */
  181.     VOLOP_VOLBOOT_GET,    /* get volboot file contents */
  182.     VOLOP_VOLD_ENABLE,    /* enable vold */
  183.     VOLOP_VOLD_DISABLE,    /* disable vold */
  184.     VOLOP_VOLD_STATUS,    /* operating status of vold */
  185.     VOLOP_VOLD_STOP,    /* kill vold */
  186.     VOLOP_DG_GET_INFO_NAME,    /* get miscellaneous disk group information */
  187.     VOLOP_DG_GET_INFO_ID,    /* get disk group info by disk group ID */
  188.     VOLOP_DG_FLUSH_NAME,    /* flush a disk group */
  189.     VOLOP_DG_FLUSH_ID,    /* flush a disk group, by disk group ID */
  190.     VOLOP_VOLDCTL_OP,    /* arbitrary vold operation */
  191.     VOLOP_DM_REPL_DA,    /* repldisk request */
  192.     VOLOP_SD_AS_STRIPE,    /* associated with stripe/RAID5 plex */
  193.     VOLOP_DISK_REONLINE_ALL,/* reonline all online, non-imported disks */
  194.     VOLOP_LICENSE_CHECK,    /* check/initialize valid licenses */
  195.     VOLOP_RESERVE10,    /* reserved for future use */
  196.     VOLOP_RESERVE9,        /* reserved for future use */
  197.     VOLOP_RESERVE8,        /* reserved for future use */
  198.     VOLOP_RESERVE7,        /* reserved for future use */
  199.     VOLOP_RESERVE6,        /* reserved for future use */
  200.     VOLOP_RESERVE5,        /* reserved for future use */
  201.     VOLOP_RESERVE4,        /* reserved for future use */
  202.     VOLOP_RESERVE3,        /* reserved for future use */
  203.     VOLOP_RESERVE2,        /* reserved for future use */
  204.     VOLOP_RESERVE1,        /* reserved for future use */
  205.     MAX_CLIENT_VOLOP,    /* client ops must be less than this */
  206.  
  207.     /* vold-internal operations, no response is returned for these */
  208.     MIN_INTERNAL_VOLOP,    /* start of internal operations */
  209.     VOLOP_DISCONNECT,    /* client disconnected */
  210.     VOLOP_DROPPED,        /* client dopped for I/O error */
  211.     VOLOP_NULL,        /* null getrequest event */
  212.     MAX_INTERNAL_VOLOP    /* sentinel value, must be last */
  213. } volop_t;
  214.  
  215. /* protocol version number of vold/client interface */
  216. #define VOLD_VERSION_1_1    2
  217. #define VOLD_VERSION_1_2    3
  218. #define VOLD_VERSION_2_0    4
  219. #define VOLD_VERSION_2_2    5
  220. #define VOLD_VERSION_2_3    6
  221. #define VOLD_VERSION        VOLD_VERSION_2_3
  222.  
  223. /* maximum number of bytes in a request to the volume daemon */
  224. #define VOLD_MAX_REQUEST 65536
  225.  
  226. /*
  227.  * errors that can be returned from vold request functions, that will
  228.  * be stored in vol_errno
  229.  */
  230.  
  231. #define VE_OK        0    /* Volume error 0 */
  232.  
  233. /* private client errors */
  234. #define VE_SYS        1    /* System error occurred in the client */
  235. #define VE_AGAIN    2    /* Configuration daemon is not accessible */
  236. #define VE_PROTO    3    /* Protocol error with configuration daemon */
  237. #define VE_LOST        4    /* Commit status lost */
  238. #define VE_WOULDBLOCK    5    /* Operation would block */
  239.  
  240. /* errors returned to clients by vold library functions */
  241. #define VE_BADMSG    10    /* Bad message format in request */
  242. #define VE_BADPROTOV    11    /* Configuration daemon can't speak protocol version */
  243. #define VE_NOMEM    12    /* Memory allocation failure */
  244. #define VE_REQ2BIG    13    /* Configuration request too large */
  245.  
  246. /* errors returned to clients by vold program */
  247.  
  248. /* errors for which vold does implicit abort, or that imply no transaction */
  249. #define START_VE_ABORT    20
  250. #define VE_NOTRANS    20    /* Operation requires transaction */
  251. #define VE_TIMEOUT    21    /* Transaction locks timed out */
  252. #define VE_RESTART    22    /* Commit aborted, restart transaction */
  253. #define VE_DB_RESTART    23    /* I/O errors left too few configuration copies */
  254. #define VE_VOLDERR    24    /* Internal configuration daemon error */
  255. #define VE_REPLAY    25    /* Unexpected kernel error in configuration update */
  256. #define VE_NOMEM_ABORT    26    /* Out of memory, transaction aborted */
  257. #define VE_LOGIO_FAIL    27    /* Failed to create logging daemon */
  258. #define VE_DG_DISABLED    28    /* Disk group is disabled */
  259. #define STOP_VE_ABORT    39
  260.  
  261. /*
  262.  * miscellaneous diagnostic errors
  263.  */
  264.  
  265. #define VE_DIAG_VOLBOOT    40    /* Error in volboot file */
  266. #define VE_DIAG_DBASE    41    /* Error in disk group configuration copies */
  267. #define VE_DIAG_DGLOG    42    /* Error in root disk group logs */
  268. #define VE_DIAG_PORTAL    43    /* Cannot create portal */
  269. #define VE_DIAG_ENABLED    44    /* Vold is currently enabled */
  270. #define VE_DIAG_DISABLED 45    /* Vold is currently disabled */
  271. #define VE_DIAG_BOOT    46    /* Vold is currently in boot mode */
  272. #define VE_DIAG_KERNEL    47    /* Communication failure with kernel */
  273. #define VE_DIAG_CYCLE    48    /* No convergence between disk group and disk list */
  274.  
  275. /*
  276.  * errors for volboot files
  277.  */
  278.  
  279. #define VE_VB_NOENT    50    /* Volboot file not found */
  280. #define VE_VB_SYS    51    /* System error in volboot file */
  281. #define VE_VB_FORMAT    52    /* Format error in volboot file */
  282. #define VE_VB_NOSPC    53    /* Out of space in volboot file */
  283. #define VE_VB_SHORT    54    /* Short read in volboot file */
  284. #define VE_VB_UNLOADED    55    /* Volboot file not loaded */
  285.  
  286. /* miscellaneous errors */
  287. #define VE_INPROGRESS    60    /* Transaction already in progress */
  288. #define VE_DISABLED    61    /* Disabled/unimplemented feature */
  289. #define VE_NOSUPPORT    62    /* Operation is not supported */
  290. #define VE_LOCK        63    /* Could not obtain requested lock */
  291. #define VE_NOLOCK    64    /* Required lock not held in transaction */
  292. #define VE_NO_DLOCK    65    /* Required data lock not held in transaction */
  293. #define VE_EXIST    66    /* Record already exists in disk group */
  294. #define VE_NOENT    67    /* Record not in disk group */
  295. #define VE_CONFIG    68    /* Disk group configuration has changed */
  296. #define VE_SRCHFAIL    69    /* Unexpected failure in search operation */
  297. #define VE_BUSY        70    /* Volume or plex device is open or mounted */
  298. #define VE_INVAL    71    /* Invalid data in request */
  299. #define VE_NEG_COUNT    72    /* Negative count field in request */
  300. #define VE_NEG_SIZE    73    /* Negative length, width, or offset */
  301. #define VE_WRONG_PORT    74    /* Operation not supported on portal */
  302. #define VE_BADNAME    75    /* Bad record name */
  303. #define VE_NOT_DIS    76    /* Operation requires a disabled volume */
  304. #define VE_ENABLED    77    /* Operation requires an enabled plex */
  305. #define VE_NO_ASSOC    78    /* Operation requires an associated record */
  306. #define VE_ASSOC    79    /* Record is associated */
  307. #define VE_SECTOR    80    /* Length/size not multiple of a sector */
  308. #define VE_VOL_DEV    81    /* Device for disk is a volume */
  309. #define VE_HOLE        82    /* Plex is not compact */
  310. #define VE_DIFF_SIZE    83    /* Subdisks have different sizes */
  311. #define VE_NONE_ASSOC    84    /* No subdisks associated with plex */
  312. #define VE_FULL_ASSOC    85    /* Record cannot have more associations */
  313. #define VE_INVAL_RTYPE    86    /* Invalid record type for operation */
  314. #define VE_NOT_SUBDISK    87    /* Record is not a subdisk */
  315. #define VE_NOT_PLEX    88    /* Record is not a plex */
  316. #define VE_NOT_VOL    89    /* Record is not a volume */
  317. #define VE_NOT_DM    90    /* Not a disk media record */
  318. #define VE_NOT_DG    91    /* Not a disk group record */
  319. #define VE_NOT_DA    92    /* Not a disk access record */
  320. #define VE_IS_DG    93    /* Operation not allowed on a disk group */
  321. #define VE_MAX_VOL    94    /* Too many volumes */
  322. #define VE_MAX_PLEX    95    /* Too many plexes */
  323. #define VE_OVERLAP    96    /* Subdisk overlaps with another subdisk */
  324. #define VE_TOO_SMALL    97    /* Record length is too small */
  325. #define VE_SD_WIDTH    98    /* Subdisk length not multiple of stripe width */
  326. #define VE_INVAL_FIELD    99    /* Invalid attribute specification */
  327. #define VE_ST_WIDTH    100    /* Invalid plex stripe width field */
  328. #define VE_OVERFLOW    101    /* Operation overflows maximum offsets */
  329. #define VE_LOG_SD_SMALL    102    /* Log subdisk is too small for volume */
  330. #define VE_LOG_SMALL    103    /* Log length too small for logging type */
  331. #define VE_LOG_LARGE    104    /* Log length too large for logging type */
  332. #define VE_HAS_LOG    105    /* Plex has a log subdisk */
  333. #define VE_RANGE    106    /* Field value is out of range */
  334. #define VE_NO_DG    107    /* Disk group does not exist */
  335. #define VE_DG_MISMATCH    108    /* Request crosses disk group boundary */
  336. #define VE_NOT_ROOTDG    109    /* Request allowed only in root disk group */
  337. #define VE_PUB_BOUNDS    110    /* Outside of public partition */
  338. #define VE_BAD_DISK    111    /* Disk is not usable */
  339. #define VE_VOL_INVALID    112    /* Volume is unusable */
  340. #define VE_PATH_STAT    113    /* Device path not valid */
  341. #define VE_PATH_NBLKDEV    114    /* Device node not block special */
  342. #define VE_NOROOTDG    115    /* Root disk group is not enabled */
  343. #define VE_NODATYPE    116    /* Disk access type not recognized */
  344. #define VE_DAOFFLINE    117    /* Disk device is offline */
  345. #define VE_REC_TOOBIG    118    /* Record store size is too large */
  346. #define VE_SD_BAD    119    /* Subdisk is unusable */
  347. #define VE_PLEX_BAD    120    /* Plex contains unusable subdisk */
  348. #define VE_NOT_EMPTY    121    /* Disk or disk group is not empty */
  349. #define VE_DG_EXIST    122    /* Disk group exists and is imported */
  350. #define VE_DGCREATED    123    /* Operation not allowed on created disk group */
  351. #define VE_DG_LOG_FULL    124    /* Configuration too large for disk group log */
  352. #define VE_DG_LOG_SMALL    125    /* Disk log too small for disk group configuration */
  353. #define VE_DG_IMPORTED    126    /* Disk group already imported */
  354. #define VE_DB_REC_ERROR    127    /* Error in configuration record */
  355. #define VE_DB_TOO_BIG    128    /* Configuration too large for configuration copies */
  356. #define VE_DGNOTCREATED    129    /* Disk group creation not complete */
  357. #define VE_LOG_BAD    130    /* No valid log copies in disk group */
  358. #define VE_ROOTDG    131    /* Operation not allowed on root disk group */
  359. #define VE_LAST_DISK    132    /* Cannot remove last disk in disk group */
  360. #define VE_LAST_CONFIG    133    /* Cannot remove last disk group configuration copy */
  361. #define VE_LAST_LOG    134    /* Cannot remove last disk group log copy */
  362. #define VE_DB_FULL    135    /* No more space in disk group configuration */
  363. #define VE_DB_NOENT    136    /* Database file not found */
  364. #define VE_DB_SYS    137    /* System error in configuration copy */
  365. #define VE_DB_FORMAT    138    /* Format error in configuration copy */
  366. #define VE_DB_VERSION    139    /* Configuration format version not supported */
  367. #define VE_DB_NOSPC    140    /* Configuration is full */
  368. #define VE_DB_SHORT    141    /* Short read in configuration copy */
  369. #define VE_DB_READ    142    /* Disk read failure */
  370. #define VE_DB_WRITE    143    /* Disk write failure */
  371. #define VE_DB_AS_BAD    144    /* Association not resolved */
  372. #define VE_DB_ASCNT_BAD    145    /* Association count is incorrect */
  373. #define VE_DB_MINORS    146    /* Too many minor numbers for volume or plex */
  374. #define VE_DB_DUP_MINOR    147    /* Duplicate minor number */
  375. #define VE_DB_MAGIC    148    /* Invalid magic number */
  376. #define VE_DB_BLKNO    149    /* Invalid block number */
  377. #define VE_DB_NOMATCH    150    /* No valid disk found containing disk group */
  378. #define VE_DB_DUPLICATE    151    /* Duplicate record in configuration */
  379. #define VE_DB_INCONSISTENT 152    /* Configuration records are inconsistent */
  380. #define VE_DB_NO_DGREC    153    /* No diskgroup record in configuration */
  381. #define VE_DB_BAD_TEMP    154    /* Temp and perm configurations don't match */
  382. #define VE_DB_CHANGED    155    /* Configuration changed during recovery */
  383. #define VE_ROOTDG_NO_CONFIGS 156 /* Rootdg disk group has no configuration copies */
  384. #define VE_ROOTDG_NO_LOGS 157    /* Rootdg disk group has no log copies */
  385. #define VE_KERN_KNOENT    158    /* Expected record not found in kernel */
  386. #define VE_KERN_DBNOENT    159    /* Record in kernel not in configuration */
  387. #define VE_KERN_KDIFF    160    /* Configuration record does not match kernel */
  388. #define VE_KERN_INCONSISTENT 161 /* Kernel and on-disk configurations don't match */
  389. #define VE_PUB_SIZE    162    /* Disk public region is too small */
  390. #define VE_PRIV_SIZE    163    /* Disk private region is too small */
  391. #define VE_PRIV_FULL    164    /* Disk private region is full */
  392. #define VE_PRIV_FORMAT    165    /* Format error in disk private region */
  393. #define VE_PRIV_HEADMATCH 166    /* Disk has inconsistent disk headers */
  394. #define VE_PRIV_NOHEADER 167    /* Disk header not found */
  395. #define VE_PRIV_INVAL    168    /* Disk private region contents are invalid */
  396. #define VE_PRIV_VERSION    169    /* Disk private region version not supported */
  397. #define VE_PRIV_INCONSISTENT 170 /* Disks for disk group are inconsistent */
  398. #define VE_FIELD_NOREINIT 171    /* Attribute cannot be changed with a reinit */
  399. #define VE_DISK_INITED    172    /* Disk already initialized */
  400. #define VE_DISK_ALIASED    173    /* Disk header indicates aliased partitions */
  401. #define VE_DISK_SHARED    174    /* Disk is sharable, operation not supported */
  402. #define VE_DISK_WRONGHOST 175    /* Disk is in use by another host */
  403. #define VE_DUP_DA    176    /* Duplicate device */
  404. #define VE_MISSING_PUB    177    /* Disk VTOC does not list public partition */
  405. #define VE_MISSING_PRIV 178    /* Disk VTOC does not list private partition */
  406. #define VE_DUP_PUB    179    /* Disk VTOC has duplicate public partition */
  407. #define VE_DUP_PRIV    180    /* Disk VTOC has duplicate private partition */
  408. #define VE_BAD_SCTR_SIZE 181    /* Disk sector size is not supported */
  409. #define VE_NO_CONFIGS    182    /* Disk group has no valid configuration copies */
  410. #define VE_DISK_NOT_FOUND 183    /* Disk for disk group not found */
  411. #define VE_DISK_OTHER_DG 184    /* Disk for disk group in other disk group */
  412.  
  413. #define MAX_VE_1_2    184    /* Largest vol_errno supported under VxVM 1.2 */
  414.  
  415. #define VE_BADCOLUMN    185    /* Stripe column number too large for plex */
  416. #define VE_NOTRAIDVOL    186    /* Volume does not have a RAID read policy */
  417. #define VE_RAIDVOL    187    /* Volume has a RAID read policy */
  418. #define VE_TOOMANYRAID    188    /* Volume already has one RAID plex */
  419. #define VE_STORAGE    189    /* Volume has the storage attribute */
  420. #define VE_LIC        190    /* License has expired or is not available for operation */
  421. #define VE_LIC_FILE    191    /* Could not create license file or directory */
  422. #define VE_NOTSTORAGE    192    /* Volume does not have the storage attribute */
  423. #define VE_SUBVOLUME    193    /* Subdisk is defined on a volume */
  424. #define VE_NOTSUBVOLUME    194    /* Subdisk is not defined on a volume */
  425. #define VE_VOLTOOSMALL    195    /* Volume length too small to hold subdisks */
  426. #define VE_HASSUBVOLUME    196    /* One or more subdisks defined on volume */
  427. #define VE_BADRAIDCHANGE 197    /* Raid volume would be unusable */
  428. #define VE_BADRAID    198    /* Raid volume is unusable */
  429. #define VE_PLEX_DIS    199    /* Plex is disabled */
  430. #define VE_DISK_BADSEL    200    /* Operation not supported on simple or populated disks*/
  431. #define VE_DISK_SPARE    201    /* Operation not allowed on a spare disk */
  432. #define VE_DG_NO_STORE    202    /* Non-stored rootdg, operation not allowed */
  433. #define VE_OVERLAP_DA    203    /* Overlapping partitions detected */
  434. #define VE_MPTH_DISABLE 204       /* Record is subsumed by a multipath disk */
  435. #define    VE_DG_NM_EXIST    205     /* Name conflicts with imported diskgroup */
  436.  
  437.  
  438. /*
  439.  * structures and values that are used or consumed on the client
  440.  * utility side (the volcontrol side) of the /dev/volcontrol
  441.  * /dev/volconfig interface
  442.  */
  443.  
  444. /*
  445.  * define a name array for convenience
  446.  */
  447.  
  448. typedef char volname_t[NAME_SZ];
  449.  
  450. /*
  451.  * structure sent by clients for initial volume daemon connection
  452.  *
  453.  * This special structure is sent along with a VOLOP_CONNECT operation
  454.  * code as the first message sent from a connected client to vold.
  455.  */
  456. struct vol_conreq_1_1 {            /* pre-1.2 structure */
  457.     pid_t    vrq_pid;        /* requesting pid */
  458.     long    vrq_version;        /* protocol version of client */
  459.     long    vrq_client_id;        /* if nonzero, request this client ID */
  460. };
  461.  
  462. struct vol_conreq {            /* 1.2 structure */
  463.     pid_t    vrq_pid;        /* requesting pid */
  464.     long    vrq_version;        /* protocol version of client */
  465.     long    vrq_client_id;        /* if nonzero, request this client ID */
  466.     ulong_t    vrq_flags;        /* flags pertaining to request */
  467.     volrid_t vrq_import_id;        /* import-ID of current disk group */
  468. };
  469. #define VRQ_FLAG_RECONNECT    0x0001    /* this is a reconnection */
  470. #define VRQ_FLAG_NOTIFY        0x0002    /* notification service connection */
  471.  
  472. struct vol_change_notify {
  473.     ulong_t want;            /* desired event types */
  474.     size_t  ndgwant;        /* reserved, currently always zero */
  475. };
  476.  
  477. struct vol_notify_conreq {
  478.     struct vol_conreq base;        /* base conreq structure */
  479.     struct vol_change_notify note;    /* notification information */
  480. };
  481.  
  482. /*
  483.  * structure returned to client for initial volume daemon connection
  484.  *
  485.  * This is the response data returned for the VOLOP_CONNECT request.
  486.  * The library itself (on the vold side) automatically sends this response,
  487.  * with no intervention being required by vold.
  488.  */
  489. struct vol_conresp_1_2 {
  490.     long    vrp_version;        /* daemon protocol version */
  491.     long    vrp_client_id;        /* assigned client ID */
  492.     ulong_t    vrp_flags;        /* flags returned to client */
  493. };
  494. struct vol_conresp {
  495.     long    vrp_version;        /* daemon protocol version */
  496.     long    vrp_client_id;        /* assigned client ID */
  497.     ulong_t    vrp_flags;        /* flags returned to client */
  498.     struct volinfo vrp_volinfo;    /* volinfo structure from vold */
  499. };
  500. #define VOLD_FLAG_KSTUB         0x00000001    /* vold -xstub option specified */
  501. #define VOLD_FLAG_LIC_MIRROR 0x00000010    /* licensed for mirroring */
  502. #define VOLD_FLAG_LIC_STRIPE 0x00000020    /* licensed for striping */
  503. #define VOLD_FLAG_LIC_CONCAT 0x00000040    /* licensed for concatenation */
  504. #define VOLD_FLAG_LIC_RAID5  0x00000080    /* licensed for RAID-5 */
  505. #define VOLD_FLAG_LIC_SPAN   0x00000100    /* licensed for spanning */
  506. #define VOLD_FLAG_LIC_ORM     0x00000200
  507. #define VOLD_FLAG_LIC_FULL   0x000003f0    /* all licensed features available */
  508.  
  509. /*
  510.  * upper 16 bits of the vold flags word is reserved for special OEM uses
  511.  */
  512. #ifdef SOLARIS
  513. #define VOLD_FLAG_SSA_RESTRICT 0x010000    /* special SPARCStorage Array license */
  514. #endif    /* SOLARIS */
  515.  
  516. /* magic numbers used at the start and end of any vold request or response */
  517. #define VIPC_MAGIC1    0x56435354    /* (VFST) frame start magic number */
  518. #define    VIPC_MAGIC2    0x5646454e    /* (VFEN) frame end magic number */
  519. #define VIPC_MAGIC3    0x56465253    /* (VFRS) section end magic number */
  520.  
  521. /* bits defining what kinds of locks are requested in a vol_lock structure */
  522.  
  523. #define VL_RECORD    ((short)0x0001)    /* lock record in database */
  524. #define VL_DATA        ((short)0x0002)    /* lock data in volume */
  525. #define VL_RECURSE    ((short)0x0004)    /* lock related subcomponents */
  526. #define VL_NAME        ((short)0x0008)    /* lock for creation */
  527. #define VL_HIER        ((short)0x0010)    /* lock a vol/plex/sd hierarchy */
  528. #define VL_DM_ALL    ((short)0x0020)    /* lock everything related to disk */
  529. #define VL_ALL        ((short)0x0040)    /* lock everything in the disk group */
  530. #define VL_BLOCK    ((short)0x0080)    /* block waiting for lock */
  531. #define VL_RID        ((short)0x0100)    /* lock by record ID, not name */
  532. #define VL_NO_DMLOCK    ((short)0x0200)    /* do not auto-lock disk for sd lock */
  533. #define VL_DA_RECORD    ((short)0x0400)    /* name is for a disk device */
  534. #define VL_DA_RECURSE    ((short)0x0800)    /* lock associated disk device */
  535. #define VL_UNUSED    ((short)0x1000)    /* defined but unused in VxVM 1.2 */
  536. #define VL_SV_ALL    ((short)0x2000)    /* lock subvolumes on locked volumes */
  537.  
  538. #define VL_ALL_LOCK_BITS ((short)0x3fff) /* all defined lock bits */
  539.  
  540. /* database record lock request structure */
  541. struct vol_lock {
  542.     union {
  543.         volname_t vl_u_name;        /* record to be locked */
  544.         volrid_t vl_u_rid;        /* record ID to lock */
  545.     } vl_u;
  546.     short         vl_locks;            /* bitmask of lock attributes */
  547.     int         vl_errno;            /* error found obtaining lock */
  548. };
  549. #define vl_name    vl_u.vl_u_name
  550. #define vl_rid    vl_u.vl_u_rid
  551.  
  552. /* possible error values in vl_errno */
  553.  
  554. #define VLE_OK        0    /* successful lock */
  555. #define VLE_BADNAME    1    /* invalid record name */
  556. #define VLE_NOENT    2    /* specified name does not exist */
  557. #define VLE_LOCKED    3    /* lock was already set */
  558. #define VLE_NOTVOLUME    4    /* data lock request and record not volume */
  559. #define VLE_INVAL    5    /* invalid lock request */
  560.  
  561. /*
  562.  * structure used in the header of a VOLOP_SEARCH request
  563.  */
  564. struct vol_search {
  565.     long    vs_types;    /* record types for search */
  566.     long    vs_sdcnt;    /* count of subdisks buffers */
  567.     long    vs_plexcnt;    /* count of plexes buffers */
  568.     long    vs_volcnt;    /* count of volumes buffers */
  569.     long    vs_patlen;    /* length of compiled pattern */
  570. };
  571. /* bits defined in vs_types */
  572. #define VST_SUBDISK    0x0001
  573. #define VST_PLEX    0x0002
  574. #define VST_VOL        0x0004
  575. #define VST_ANY        0x0007
  576.  
  577. /*
  578.  * structure included at the beginning of a response to a VOLOP_SEARCH request
  579.  */
  580. struct vol_resp_search {
  581.     long    vs_sdrcnt;    /* count of matched subdisks */
  582.     long    vs_plexrcnt;    /* count of matched plexes */
  583.     long    vs_volrcnt;    /* count of matched volumes */
  584. };
  585.  
  586. /*
  587.  * specific types of records in the volume manager configuration database
  588.  *
  589.  * Used by vold_match(), vold_find_record() and vold internal tables
  590.  * to identify a particular type of record.
  591.  */
  592. typedef enum vol_rec_type {
  593.     MIN_VOL_REC_TYPE,    /* sentinel value, must be first */
  594.     VOL_VOLUME,        /* record is a volume */
  595.     VOL_PLEX,        /* record is a plex */
  596.     VOL_SUBDISK,        /* record is a subdisk */
  597.     VOL_DISK_MEDIA,        /* record is a disk media */
  598.     VOL_DISK_GROUP,        /* record is a disk group */
  599.     VOL_DISK_ACCESS,        /* record is a disk access record */
  600.     MAX_VOL_REC_TYPE    /* sentinel value, must be last */
  601. } vol_rec_t;
  602.  
  603. /*
  604.  * Decode the size of a search pattern from the pattern.
  605.  */
  606.  
  607. #define VOLPATSIZE(pat)    ((((pat)[0] & 0xff) << 8) + ((pat)[1] & 0xff))
  608. #define MIN_VOLPATSIZE    3
  609.  
  610. /*
  611.  * maximum size for the bytes in a compiled pattern
  612.  *
  613.  * This must be less than 32K because jumps within patterns are
  614.  * encoded as signed two byte offsets.
  615.  */
  616.  
  617. #define VOLPATMAX    ((1 << 15) - 1)
  618.  
  619. /*
  620.  * types of records in the volume manager configuration database
  621.  *
  622.  * This is used in the VOLOP_VOL_NAME request (from vol_name()).
  623.  * It is also used internally by some functions that operate on the
  624.  * client side by do not interact with the volume daemon.
  625.  */
  626.  
  627. typedef enum vol_object {
  628.     MIN_VOL_OBJECT,        /* sentinel value, must be first */
  629.     VOLOBJ_ANY,        /* pseudo record type, for any record */
  630.  
  631.     VOLOBJ_SUBDISK,        /* subdisk record */
  632.     VOLOBJ_PLEX,        /* plex record */
  633.     VOLOBJ_VOLUME,        /* volume record */
  634.  
  635.     /* The following are pseudo records for use in vol_name() */
  636.     VOLOBJ_DIS_PLEX,    /* disassociated plex */
  637.     VOLOBJ_DIS_SUBDISK,    /* disassociated subdisk */
  638.  
  639.     /* new object types */
  640.     VOLOBJ_UNKNOWN,        /* unknown object */
  641.     VOLOBJ_DISK_MEDIA,    /* disk media record */
  642.     VOLOBJ_DISK_GROUP,    /* disk group record */
  643.     VOLOBJ_DISK_ACCESS,    /* disk access record */
  644.     VOLOBJ_HOST,        /* host record */
  645.     VOLOBJ_INFO,        /* info record */
  646.     MAX_VOL_OBJECT        /* sentinel value, must be last */
  647. } vol_object_t;
  648.  
  649. /*
  650.  * dg_config - structure returned by the dg_getconfig library functions
  651.  *
  652.  * The extended attribute pointers are reserved for use by future
  653.  * volume manager functionality.  It is not yet supported, and
  654.  * these pointers will always be zero for the base release 1.2
  655.  * library.
  656.  */
  657.  
  658. struct vxa_buf {
  659.     int dummy;
  660. };
  661.  
  662. struct dg_config {
  663.     volseqno_t       dgc_config_tid;    /* tid of last commit */
  664.     struct dgrec       dgc_dg_rec;        /* diskgroup record */
  665.     struct vxa_buf      *dgc_dg_txattr;    /* temporary extended attrs */
  666.     struct vxa_buf      *dgc_dg_pxattr;    /* persistent exteded attrs */
  667.     size_t           dgc_nvol;        /* number of volume records */
  668.     volrid_t      *dgc_vol_rids;    /* volume record IDs */
  669.     volname_t      *dgc_vol_names;    /* volume record names */
  670.     struct volrec      *dgc_vol_recs;    /* volume records */
  671.     struct vxa_buf      *dgc_vol_txattr;    /* temporary extended attrs */
  672.     struct vxa_buf      *dgc_vol_pxattr;    /* persistent extended attrs */
  673.     size_t           dgc_nplex;        /* number of plex records */
  674.     volrid_t      *dgc_plex_rids;    /* plex record IDs */
  675.     volname_t      *dgc_plex_names;    /* plex record names */
  676.     struct plexrec      *dgc_plex_recs;    /* plex records */
  677.     struct vxa_buf      *dgc_plex_txattr;    /* temporary extended attrs */
  678.     struct vxa_buf      *dgc_plex_pxattr;    /* persistent extended attrs */
  679.     size_t           dgc_nsd;        /* number of subdisk records */
  680.     volrid_t      *dgc_sd_rids;        /* subdisk record IDs */
  681.     volname_t      *dgc_sd_names;    /* plex record names */
  682.     struct sdrec      *dgc_sd_recs;        /* subdisk records */
  683.     struct vxa_buf      *dgc_sd_txattr;    /* temporary extended attrs */
  684.     struct vxa_buf      *dgc_sd_pxattr;    /* persistent extended attrs */
  685.     size_t           dgc_ndm;        /* number of disk records */
  686.     volrid_t      *dgc_dm_rids;        /* disk record IDs */
  687.     volname_t      *dgc_dm_names;    /* plex record names */
  688.     struct dmrec      *dgc_dm_recs;        /* disk records */
  689.     struct vxa_buf      *dgc_dm_txattr;    /* temporary extended attrs */
  690.     struct vxa_buf      *dgc_dm_pxattr;    /* persistent extended attrs */
  691.     size_t           dgc_nda;        /* number of diskdev records */
  692.     volrid_t      *dgc_da_rids;        /* diskdev record IDs */
  693.     volname_t      *dgc_da_names;    /* plex record names */
  694.     struct darec      *dgc_da_recs;        /* diskdev records */
  695.     struct vxa_buf      *dgc_da_txattr;    /* temporary extended attrs */
  696.     struct vxa_buf      *dgc_da_pxattr;    /* persistent extended attrs */
  697.  
  698.     /*
  699.      * the remaining fields are not yet supported
  700.      */
  701.  
  702.     size_t           dgc_nhost;        /* number of host records */
  703.     volrid_t      *dgc_host_rids;    /* host record IDs */
  704.     char         **dgc_host_names;    /* host record names */
  705.     struct vxa_buf      *dgc_host_txattr;    /* temporary extended attrs */
  706.     struct vxa_buf      *dgc_host_pxattr;    /* persistent extended attrs */
  707.     size_t           dgc_ninfo;        /* number of info records */
  708.     volrid_t      *dgc_info_rids;    /* info record IDs */
  709.     char         **dgc_info_names;    /* info record names */
  710.     struct vxa_buf      *dgc_info_txattr;    /* temporary extended attrs */
  711.     struct vxa_buf      *dgc_info_pxattr;    /* persistent extended attrs */
  712. };
  713.  
  714. /*
  715.  * dg_config_vec - structure returned by dg_getconfig_all
  716.  */
  717.  
  718. struct dg_config_vec {
  719.     size_t           dgcv_ndg;        /* structures in dgcv_dg */
  720.     struct dg_config  *dgcv_dg[1/*ndg*/];    /* contents of diskgroups */
  721. };
  722.  
  723. /*
  724.  * types of information desired in calls to the dg_getconfig functions
  725.  */
  726.  
  727. #define    DG_WANT_VOL        0x0001        /* want volumes */
  728. #define    DG_WANT_SD        0x0002        /* want subdisks */
  729. #define    DG_WANT_PLEX        0x0004        /* want plexes */
  730. #define DG_WANT_DM        0x0008        /* want disk media */
  731. #define DG_WANT_DG        0x0010        /* want disk groups */
  732. #define DG_WANT_DA        0x0020        /* want disk access records */
  733. #define DG_WANT_HOST        0x0040        /* want hosts */
  734. #define DG_WANT_INFO        0x0080        /* want info records */
  735. #define DG_WANT_RID        0x0100        /* want record IDs */
  736. #define DG_WANT_NAME        0x0200        /* want record names */
  737. #define DG_WANT_REC        0x0400        /* want record contents */
  738. #define DG_WANT_XATTR        0x0800        /* want extended attrs */
  739. #define DG_WANT_DISABLED    0x1000        /* want disabled groups */
  740.  
  741. /*
  742.  * in the following combination macros, leave out host and info records
  743.  * and extended attributes, because they are not yet supported
  744.  */
  745.  
  746. #define DG_WANT_ALL_TYPES    (DG_WANT_VOL | DG_WANT_SD | DG_WANT_PLEX | \
  747.                  DG_WANT_DM | DG_WANT_DG)
  748. #define DG_WANT_ALL_RID        (DG_WANT_ALL_TYPES | DG_WANT_RID)
  749. #define DG_WANT_ALL_NAME    (DG_WANT_ALL_TYPES | DG_WANT_NAME)
  750. #define DG_WANT_ALL_REC        (DG_WANT_ALL_TYPES | DG_WANT_REC)
  751. #define DG_WANT_ALL        (DG_WANT_ALL_RID | DG_WANT_NAME | DG_WANT_REC)
  752. #define DG_WANT_EVERYTHING    (DG_WANT_ALL | DG_WANT_DA)
  753.  
  754. /*
  755.  * flags for the dg_import operation
  756.  */
  757.  
  758. #define DG_IMPORT_ALL_DISKS    0x0001        /* must find all disks */
  759. #define DG_IMPORT_CLEAR_LOCKS    0x0002        /* remove any host ID locks */
  760. #define DG_IMPORT_NO_AUTO_REIMPORT 0x4        /* don't auto reimport */
  761. #define DG_IMPORT_FLAG_MASK    0x0007        /* all defined flag bits */
  762.  
  763. /*
  764.  * structure defining the disk group for particular records
  765.  *
  766.  * An array of these structures is returned by the dg_locate call.
  767.  */
  768.  
  769. struct dg_locate {
  770.     volname_t       dgl_dg_name;        /* group containing record */
  771.     ulong_t           dgl_flags;        /* pertinent flags */
  772. };
  773. #define DGL_NOENT    0x0001            /* record not in any group */
  774. #define DGL_MORE    0x0002            /* in more than one group */
  775.  
  776. /*
  777.  * structure defining free space within a disk group
  778.  *
  779.  * For region entries that have a non-empty device_tag field, all
  780.  * entries with the same device_tag value should be considered to be
  781.  * on the same physical device.  For region entries that have an empty
  782.  * device_tag field, the diskname field distinguishes different physical
  783.  * devices.  There are no specific guarantees that diskname and
  784.  * device_tag names are distinct from each other, and there are also no
  785.  * guarantees that identical device_tag and diskname fields correspond
  786.  * to the same physical device.
  787.  */
  788.  
  789. struct dg_free_region {
  790.     volname_t       dgfr_device_tag;    /* tag grouping disk records */
  791.     volname_t       dgfr_dm_name;    /* name of disk media record */
  792.     volname_t       dgfr_da_name;    /* name of disk access record */
  793.     voff_t           dgfr_offset;        /* offset to free space */
  794.     voff_t           dgfr_len;        /* length of free space */
  795.     ulong_t           dgfr_flags;        /* flags pertaining to region */
  796. };
  797. struct dg_free {
  798.     size_t           dgf_nregion;        /* number of free regions */
  799.     struct dg_free_region dgf_regions[1/*dgf_nregion*/];
  800. };
  801. #define DGFR_FLAG_VOLATILE    0x0001        /* region is on reserved disk */
  802. #define DGFR_FLAG_RESERVE    0x0002        /* region is on volatile disk */
  803. #define DGFR_FLAG_SPARE        0x0004        /* spare disk for disk group */
  804. #define DGFR_FLAG_VOLUME    0x0008        /* backing is a volume */
  805.  
  806. /*
  807.  * structure returned by dg_get_info(), containing information on
  808.  * the state of a disk group, and of its configuration copies
  809.  */
  810.  
  811. struct dg_misc_info {
  812.     size_t           _dgi_baselen;    /* base structure length */
  813.     char          *dgi_name;        /* name of disk group */
  814.     char          *dgi_dgid;        /* unique ID of disk group */
  815.     volrid_t       dgi_import_id;    /* import ID of disk group */
  816.     volseqno_t       dgi_config_tid;    /* last committed tid */
  817.     ulong_t           dgi_flags;        /* miscellaneous flags */
  818.     size_t           dgi_nconfig;        /* number of config copies */
  819.     size_t           dgi_nlog;        /* number of log copies */
  820.     size_t           dgi_config_len;    /* length of configuration */
  821.     size_t           dgi_config_free;    /* free blks in configuration */
  822.     size_t           dgi_temp_config_len;    /* length of temp config */
  823.     size_t           dgi_log_len;        /* length of disk group log */
  824.     struct dg_config_info *dgi_config_info;    /* config copy information */
  825.     struct dg_log_info *dgi_log_info;    /* log copy information */
  826.     long           dgi_nconfig_enable;    /* #configs to enable */
  827.     long           dgi_nlog_enable;    /* #logs to enable */
  828. };
  829. #define DG_MISC_FLAG_DISABLED    0x0001        /* disk group is disabled */
  830. #define DG_MISC_FLAG_SHARED    0x0002        /* disk group is shared */
  831. #define DG_MISC_FLAG_READONLY    0x0004        /* disk group is read-only */
  832.  
  833. struct dg_config_info {
  834.     volname_t       dgci_da_name;    /* da record for config copy */
  835.     size_t           dgci_copy;        /* copy number for config */
  836.     size_t           dgci_len;        /* length of config copy */
  837.     ulong_t           dgci_flags;        /* flags for config copy */
  838.     ulong_t           dgci_state;        /* state of the config copy */
  839.     volseqno_t       dgci_config_tid;    /* last committed tid */
  840.     volseqno_t       dgci_pending_tid;    /* pending tid */
  841.     int           dgci_vol_errno;    /* internal volume errno */
  842.     int           dgci_sys_errno;    /* kernel errno */
  843.     off_t           dgci_err_blockno;    /* block number of error */
  844. };
  845. #define DG_CFG_FLAG_ONLINE    0x0001        /* copy is active, valid */
  846. #define DG_CFG_FLAG_OFFLINE    0x0002        /* copy is offline */
  847. #define DG_CFG_FLAG_DISABLED    0x0004        /* copy is disabled */
  848.  
  849. /*
  850.  * NOTE: This state numbers must the DBASE_* states from vold/dbase.h
  851.  */
  852.  
  853. #define DG_CFG_STATE_UNKNOWN    0x0000        /* state is unknown */
  854. #define DG_CFG_STATE_CLEAN    0x0001        /* no pending operations */
  855. #define DG_CFG_STATE_CHANGE    0x0002        /* log changes to database */
  856. #define DG_CFG_STATE_COMMIT    0x0003        /* will commit */
  857. #define DG_CFG_STATE_ABORT    0x0004        /* will abort */
  858. #define    DG_CFG_STATE_NEW    0x0005        /* copy is uninitialized */
  859. #define DG_CFG_STATE_STALE    0x0006        /* database copy is stale */
  860. #define DG_CFG_STATE_IOFAIL    0x0007        /* stale due to I/O failure */
  861. #define DG_CFG_STATE_OFFLINE    0x0008        /* database copy is offline */
  862. #define DG_CFG_STATE_ERROR    0x000f        /* internal offline state */
  863.  
  864. struct dg_log_info {
  865.     volname_t       dgli_da_name;    /* da record for log */
  866.     size_t           dgli_copy;        /* copy number for log copy */
  867.     size_t           dgli_len;        /* length of log copy */
  868.     ulong_t           dgli_flags;        /* flags for log copy */
  869. };
  870. #define DG_LOG_FLAG_INVALID    0x0001        /* log copy is unusable */
  871. #define DG_LOG_FLAG_DISABLED    0x0002        /* log copy is disabled */
  872.  
  873. /*
  874.  * structure returned by vxvm_get and vxvm_get_rid functions
  875.  */
  876.  
  877. struct vxvm_record {
  878.     struct vxvm_record *vxr_next;        /* next record pointer */
  879.     struct vxvm_record *vxr_prev;        /* next record pointer */
  880.     struct vxvm_record *vxr_next_sib;    /* next sibling pointer */
  881.     struct vxvm_record *vxr_prev_sib;    /* next sibling pointer */
  882.     struct vxvm_record *vxr_assoc;        /* parent association */
  883.     struct vxvm_record *vxr_aslist;        /* child associations */
  884.     struct vxvm_record *vxr_log;        /* associated log */
  885.     VOID           *vxr_private;    /* reserved for utilities */
  886.     ulong_t            vxr_private_flags;    /* reserved for utilities */
  887.     vol_object_t        vxr_type;        /* type of record */
  888.     volrid_t        vxr_rid;        /* record ID of record */
  889.     size_t            _vxr_namesize;    /* name size, with nul byte */
  890.     size_t            _vxr_recsize;    /* raw record size */
  891.     ulong_t            vxr_change_mask;    /* reserved for future use */
  892.     char           *vxr_name;        /* name of record */
  893.     struct vxa_buf       *vxr_txattr;        /* reserved for future use */
  894.     struct vxa_buf       *vxr_pxattr;        /* reserved for future use */
  895.     union vxvm_u {                /* raw configuration record */
  896.         struct volrec vol;
  897.         struct plexrec plex;
  898.         struct sdrec sd;
  899.         struct dmrec dm;
  900.         struct darec da;
  901.         struct dgrec dg;
  902.     } *vxr_p;
  903. };
  904.  
  905. /* Offset of a field within a structure */
  906. #define OFFS(t, e)    offsetof(t, e)
  907.  
  908. /*
  909.  * VSIZEOF - size of structure that ends in a variable length array
  910.  *
  911.  * Inputs:
  912.  *    type    type, such as 'struct volrec'
  913.  *    elem    the name of the last element in the record, which is
  914.  *        assumed to be an array.  If this is a double-dimensioned
  915.  *        array, the element name must be followed by [0]
  916.  *    cnt    count of array elements to include in the structure
  917.  *        size.
  918.  */
  919. #define VSIZEOF(type,elem,cnt)    (OFFS(type,elem[cnt]))
  920.  
  921. /*
  922.  * Use SETIOVEC to setup an iovec_t variable given a pointer to
  923.  * an object for which the sizeof operator will correctly determine
  924.  * the length of the object.
  925.  *
  926.  * Example usage:
  927.  *        iovec_t resp[2];
  928.  *        struct foo foovar;
  929.  *    ...
  930.  *        SETIOVEC(resp[0], &foovar);
  931.  *
  932.  *    The code above will initialize the first iovec structure in
  933.  *    the resp array to point to the variable foovar, with the
  934.  *    appropriate size.
  935.  *
  936.  * NOTE:  This macro cannot be used to initialize an iovec structure
  937.  *      to point to the entire contents for an array variable.
  938.  */
  939. #define SETIOVEC(vec, strp)    ((vec).iov_base = (caddr_t)(strp), \
  940.                  (vec).iov_len = sizeof(*(strp)))
  941.  
  942. /* defines for vol_sscan_number() */
  943. #define VOL_NUM_SCTRS    0x0001        /* default multiplier is sectors */
  944. #define VOL_NUM_BLOCKS    0x0002        /* default multiplier is blocks */
  945. #define VOL_NUM_R_SCTRS    0x0004        /* return multiple of sectors */
  946. #define VOL_NUM_R_MULT    0x0008        /* return multiple of arbitrary value */
  947. #define VOL_NUM_SUM    0x0010        /* sum multiple numbers together */
  948.  
  949. /* maximum size of buffers for vofftostr, volseqnotostr, and volridtostr */
  950. #define MAXVOFFSTR    24
  951. #define MAXVOLSEQNOSTR    24
  952. #define MAXVOLRIDSTR    24
  953.  
  954. #if defined(__STDC__)
  955. extern void vol_perror(const char *);
  956. extern char *vol_strerror(int);
  957. extern int vol_set_name(char *, const char *, size_t);
  958. extern mode_t vol_mode(const char *, char **, mode_t);
  959. extern voff_t vol_sscan_number(const char *, char **, int, ...);
  960. extern voff_t vol_number(const char *, char **); /* backward compatibility */
  961. extern voff_t strtovoff(const char *, char **);
  962. extern char *vofftostr(voff_t, char *);
  963. extern volseqno_t strtovolseqno(const char *, char **);
  964. extern volrid_t strtovolrid(const char *, char **);
  965. extern char *volseqnotostr(volseqno_t, char *);
  966. extern char *volridtostr(volrid_t, char *);
  967. extern ulong_t vol_hash(const char *);
  968. #else    /* not __STDC__ */
  969. extern void vol_perror();
  970. extern char *vol_strerror();
  971. extern int vol_set_name();
  972. extern mode_t vol_mode();
  973. extern voff_t vol_sscan_number();
  974. extern voff_t vol_number(); /* backward compatibility */
  975. extern voff_t strtovoff();
  976. extern char *vofftostr();
  977. extern volseqno_t strtovolseqno();
  978. extern volrid_t strtovolrid();
  979. extern char *volseqnotostr();
  980. extern char *volridtostr();
  981. extern ulong_t vol_hash();
  982. #endif    /* __STDC__ */
  983.  
  984. #endif    /* _VOLIPC_H */
  985.