IBM Books

IBM General Parallel File System for AIX: Data Management API Guide

[ Bottom of Page | Previous Page | Next Page | Table of Contents | Index ]


Appendix A. DMAPI data types and structures in GPFS

Following are C declarations of all DMAPI data types and structures in GPFS, based on the XDSM standard. This is a listing of the file dmapi_types.h which is part of the GPFS installation. The file is installed in the directory: /user/lpp/mmfs/include.

#ifndef _DMAPI_TYPES_H
#define _DMAPI_TYPES_H
 
#include <sys/types.h>
 
/*
 * Type definitions for GPFS DMAPI external interfaces
 */
 
/* Basic scalar types */
 
typedef int                     dm_signed32;
typedef unsigned int            dm_unsigned32;
typedef long long               dm_signed64;
typedef unsigned long long      dm_unsigned64;
 
struct dm_scalar128
{
  dm_unsigned64  high;
  dm_unsigned64  low;
#ifdef __cplusplus
  int operator == (const dm_scalar128& rhs) const
    { return high == rhs.high && low == rhs.low; };
  int operator != (const dm_scalar128& rhs) const
    { return high != rhs.high || low != rhs.low; };
  int operator < (const dm_scalar128& rhs) const
    { return high < rhs.high || (high == rhs.high && low < rhs.low); };
  int operator > (const dm_scalar128& rhs) const
    { return high > rhs.high || (high == rhs.high && low > rhs.low); };
  int operator <= (const dm_scalar128& rhs) const
    { return high < rhs.high || (high == rhs.high && low <= rhs.low); };
  int operator >= (const dm_scalar128& rhs) const
    { return high > rhs.high || (high == rhs.high && low >= rhs.low); };
#endif  /* __cplusplus */
};
typedef struct dm_scalar128 dm_scalar128;
 
#define DM_SCALAR128_EQ(x, y) (((x).high==(y).high) && ((x).low==(y).low))
#define DM_SCALAR128_NE(x, y) (((x).high!=(y).high) || ((x).low!=(y).low))
#define DM_SCALAR128_LT(x, y) (((x).high<(y).high) || (((x).high==(y).high) 
	&& ((x).low<(y).low)))
#define DM_SCALAR128_GT(x, y) (((x).high>(y).high) || (((x).high==(y).high) 
	&& ((x).low>(y).low)))
#define DM_SCALAR128_LE(x, y) (((x).high<(y).high) || (((x).high==(y).high) 
	&& ((x).low<=(y).low)))
#define DM_SCALAR128_GE(x, y) (((x).high>(y).high) || (((x).high==(y).high) 
	&& ((x).low>=(y).low)))
 
typedef dm_signed64     dm_off_t;
typedef dm_unsigned64   dm_size_t;
typedef dm_signed64     dm_ssize_t;
 
typedef enum
{
  DM_FALSE = 0,
  DM_TRUE = 1
} dm_boolean_t;
 
/* Iterator for a filesystem scan */
typedef dm_signed64  dm_attrloc_t;
 
/* Variable-length data */
struct dm_vardata
{
  ssize_t          vd_offset;
  size_t           vd_length;
};
typedef struct dm_vardata dm_vardata_t;
 
/* Interpreters for variable length data */
 
#define DM_GET_LEN(basePtr, vardataFieldName)                   \
         (((basePtr)->vardataFieldName.vd_offset == 0) ?        \
          (size_t)DM_INVALID_HLEN :                             \
          (((basePtr)->vardataFieldName.vd_offset == 1) ?       \
           (size_t)DM_GLOBAL_HLEN :                             \
           ((basePtr)->vardataFieldName.vd_length)              \
         ))
 
/* The prtType parameter in the DM_GET_VALUE() macro is pointer type
   (for example "int *"). The value of the macro is a pointer of the give type,
   or NULL if the data length (as given by the DM_GET_LEN() macro) is zero. */
#define DM_GET_VALUE(basePtr, vardataFieldName, ptrType)        \
         (((basePtr)->vardataFieldName.vd_offset == 0) ?        \
          (ptrType)DM_INVALID_HANP :                            \
          (((basePtr)->vardataFieldName.vd_offset == 1) ?       \
           (ptrType)DM_GLOBAL_HANP :                            \
            (((basePtr)->vardataFieldName.vd_length == 0) ?     \
             NULL :                                             \
             (ptrType)((char *)(basePtr)+(basePtr)->vardataFieldName.vd_offset)\
         )))
 
/* Iterator for lists of variable length structures */
 
/* The ptrType parameter in the DM_STEP_TO_NEXT() macro is a pointer type
   (for example "dm_attrlist_t *"). The value of the macro is a pointer
   of the given type, or NULL if the current element is the last in the list.*/
#define DM_STEP_TO_NEXT(basePtr, ptrType)            \
             (((basePtr)->_link == 0) ? NULL :       \
              (ptrType)((char *)(basePtr) + (basePtr)->_link))
 
#define DM_ATTR_NAME_SIZE       8
 
/* Name of an extended attribute */
struct dm_attrname
{
  u_char              an_chars[DM_ATTR_NAME_SIZE];
};
typedef struct dm_attrname dm_attrname_t;
 
/* Session identifier */
typedef dm_unsigned64  dm_sessid_t;
 
/* Node identifier */
typedef dm_unsigned32  dm_nodeid_t;  /* GPFS Specific - not in XDSM standard */
 
/* List of extended attributes */
struct dm_attrlist
{
  dm_ssize_t          _link;
  dm_attrname_t       al_name;
  dm_vardata_t        al_data;
};
typedef struct dm_attrlist      dm_attrlist_t;
 
/* Attributes of the GPFS DMAPI implementation */
typedef enum
{
  DM_CONFIG_INVALID,                /* Lower than any attribute */
  DM_CONFIG_BULKALL,
  DM_CONFIG_CREATE_BY_HANDLE,
  DM_CONFIG_DTIME_OVERLOAD,
  DM_CONFIG_LEGACY,
  DM_CONFIG_LOCK_UPGRADE,
  DM_CONFIG_MAX_ATTR_ON_DESTROY,
  DM_CONFIG_MAX_ATTRIBUTE_SIZE,
  DM_CONFIG_MAX_HANDLE_SIZE,
  DM_CONFIG_MAX_MANAGED_REGIONS,
  DM_CONFIG_MAX_MESSAGE_DATA,
  DM_CONFIG_OBJ_REF,
  DM_CONFIG_PENDING,
  DM_CONFIG_PERS_ATTRIBUTES,
  DM_CONFIG_PERS_EVENTS,
  DM_CONFIG_PERS_INHERIT_ATTRIBS,
  DM_CONFIG_PERS_MANAGED_REGIONS,
  DM_CONFIG_PUNCH_HOLE,
  DM_CONFIG_TOTAL_ATTRIBUTE_SPACE,
  DM_CONFIG_WILL_RETRY,
  DM_CONFIG_MAX                /* GPFS specific - higher than any attribute */
} dm_config_t;
 
#define DM_CONFIG_LOWEST  (DM_CONFIG_INVALID + 1)  /* 
	GPFS specific - lowest attribute  */
#define DM_CONFIG_HIGHEST (DM_CONFIG_MAX -1)       /* 
	GPFS specific - highest attribute */
 
/* Names of events */
typedef enum
{
  DM_EVENT_INVALID,           /* Lower than any event */
  DM_EVENT_CLOSE,
  DM_EVENT_MOUNT,
  DM_EVENT_PREUNMOUNT,        DM_EVENT_UNMOUNT,
  DM_EVENT_NOSPACE,
  DM_EVENT_DEBUT,
  DM_EVENT_CREATE,            DM_EVENT_POSTCREATE,
  DM_EVENT_REMOVE,            DM_EVENT_POSTREMOVE,
  DM_EVENT_RENAME,            DM_EVENT_POSTRENAME,
  DM_EVENT_SYMLINK,           DM_EVENT_POSTSYMLINK,
  DM_EVENT_LINK,              DM_EVENT_POSTLINK,
  DM_EVENT_READ,
  DM_EVENT_WRITE,
  DM_EVENT_TRUNCATE,
  DM_EVENT_ATTRIBUTE,
  DM_EVENT_CANCEL,
  DM_EVENT_DESTROY,
  DM_EVENT_USER,
  DM_EVENT_MAX               /* Higher than any event */
} dm_eventtype_t;
 
/* Set of events */
typedef dm_unsigned32   dm_eventset_t;
 
#define DM_EVENT_LOWEST (DM_EVENT_INVALID + 1) /* GPFS specific - lowest event */
#define DM_EVENT_HIGHEST (DM_EVENT_MAX - 1)   /*	GPFS specific - highest event */
 
/* Operations on sets of events */
 
#define DMEV_SET(ev, eset)     ( ( (((int) (ev)) >= DM_EVENT_LOWEST)     \
                   && (((int) (ev)) <= DM_EVENT_HIGHEST) )               \
                   ? (eset) |= (((dm_eventset_t) 1) << (((int) (ev)) - 1))  \
                   : (eset) )
 
#define DMEV_CLR(ev, eset)     ( ( (((int) (ev)) >= DM_EVENT_LOWEST)     \
                   && (((int) (ev)) <= DM_EVENT_HIGHEST) )  \
                   ? (eset) &= ~(((dm_eventset_t) 1) << (((int) (ev)) - 1)) \
                   : (eset) )
 
#define DMEV_ZERO(eset)    ((eset) = (dm_eventset_t) DM_EVENT_INVALID)
 
 
#define DMEV_ISSET(ev, eset)   ( (((int) (ev)) >= DM_EVENT_LOWEST)        \
                   && (((int) (ev)) <= DM_EVENT_HIGHEST)     \
                   && (((dm_eventset_t) (eset)) & (((dm_eventset_t) 1) 
						  << (((int) 
(ev)) - 1))) )
 
/* GPFS Specific event set operations -  not in XDSM standard */
 
/* Add all events to eset */
#define DMEV_ALL(eset) ((eset) = ~((~((dm_eventset_t) DM_EVENT_INVALID)) 
	<< DM_EVENT_HIGHEST))
 
/* check if eset is empty (contains no events) */
#define DMEV_ISZERO(eset) ((((dm_eventset_t) (eset)) & (~((~((dm_eventset_t) 
	DM_EVENT_INVALID)) << DM_EVENT_HIGHEST))) == (dm_eventset_t) DM_EVENT_INVALID)
 
/* check if eset contains all events */
#define DMEV_ISALL(eset) ((((dm_eventset_t) (eset)) & (~((~((dm_eventset_t) 
	DM_EVENT_INVALID)) << DM_EVENT_HIGHEST))) == ~((~((dm_eventset_t) 
	DM_EVENT_INVALID)) << DM_EVENT_HIGHEST))
 
/* Add to eset2 all events of eset1 */
#define DMEV_ADD(eset1, eset2) ((eset2) = ((((dm_eventset_t) (eset1)) | 
((dm_eventset_t) (eset2))) & (~((~((dm_eventset_t) DM_EVENT_INVALID)) 
<< DM_EVENT_HIGHEST))))
 
/* Remove from eset2 all events of eset1 */
#define DMEV_REM(eset1, eset2) ((eset2) = (((dm_eventset_t) (eset2)) & 
	(~((dm_eventset_t) (eset1)))))
 
/* Restrict eset2 by eset1 (remove from eset2 any event that is not in eset1) */
#define DMEV_RES(eset1, eset2) ((eset2) = ((((dm_eventset_t) (eset1)) & 
((dm_eventset_t) (eset2))) & (~((~((dm_eventset_t) DM_EVENT_INVALID)) 
<< DM_EVENT_HIGHEST))))
 
/* Check if eset1 and eset2 are equal (have the same events) */
#define DMEV_ISEQ(eset1, eset2)  ((((dm_eventset_t) (eset1)) & 
(~((~((dm_eventset_t) DM_EVENT_INVALID)) << DM_EVENT_HIGHEST))) == 
(((dm_eventset_t) (eset2)) & (~((~((dm_eventset_t) DM_EVENT_INVALID)) 
<< DM_EVENT_HIGHEST))))
 
/* Check if eset1 and eset2 are disjoint (have no events in common) */
#define DMEV_ISDISJ(eset1, eset2)  ((((dm_eventset_t) (eset1)) & 
((dm_eventset_t) (eset2)) & (~((~((dm_eventset_t) DM_EVENT_INVALID)) 
<< DM_EVENT_HIGHEST))) == (dm_eventset_t) DM_EVENT_INVALID)
 
/* Check if eset1 is a subset of eset2 (all events of eset1 are in eset2) */
#define DMEV_ISSUB(eset1, eset2) ((((dm_eventset_t) (eset1)) & ((dm_eventset_t)
(eset2)) & (~((~((dm_eventset_t) DM_EVENT_INVALID)) << DM_EVENT_HIGHEST))) == 
(((dm_eventset_t) (eset1)) & (~((~((dm_eventset_t) DM_EVENT_INVALID)) 
<< DM_EVENT_HIGHEST))))
 
/* Normalize the contents of eset (unused bits in the mask are cleared).
   Useful if eset was not obtained entirely by means of DMEV_XXX() macros*/
#define DMEV_NORM(eset)  ((eset) = (((dm_eventset_t)(eset)) & 
(~((~((dm_eventset_t) DM_EVENT_INVALID)) << DM_EVENT_HIGHEST))))
 
/* Extent types */
typedef enum
{
  DM_EXTENT_INVALID,
  DM_EXTENT_RES,
  DM_EXTENT_HOLE
} dm_extenttype_t;
 
struct dm_extent
{
  dm_extenttype_t     ex_type;
  dm_off_t            ex_offset;
  dm_size_t           ex_length;
};
typedef struct dm_extent dm_extent_t;
 
/* Disposition information */
struct dm_dispinfo
{
  dm_ssize_t          _link;
  dm_vardata_t        di_fshandle;
  dm_eventset_t       di_eventset;
};
typedef struct dm_dispinfo dm_dispinfo_t;
 
typedef dm_scalar128 dm_token_t;
 
/* Comparison macros for tokens - GPFS specific - not in XDSM standard */
#define DM_TOKEN_EQ(x, y)  DM_SCALAR128_EQ(x, y)
#define DM_TOKEN_NE(x, y)  DM_SCALAR128_NE(x, y)
#define DM_TOKEN_LT(x, y)  DM_SCALAR128_LT(x, y)
#define DM_TOKEN_GT(x, y)  DM_SCALAR128_GT(x, y)
#define DM_TOKEN_LE(x, y)  DM_SCALAR128_LE(x, y)
#define DM_TOKEN_GE(x, y)  DM_SCALAR128_GE(x, y)
 
/* Sequence number for event cancellation */
typedef dm_scalar128 dm_sequence_t;
 
/* Comparison macros for sequence numbers - GPFS specific - not in XDSM standard */
#define DM_SEQUENCE_EQ(x, y)  DM_SCALAR128_EQ(x, y)
#define DM_SEQUENCE_NE(x, y)  DM_SCALAR128_NE(x, y)
#define DM_SEQUENCE_LT(x, y)  DM_SCALAR128_LT(x, y)
#define DM_SEQUENCE_GT(x, y)  DM_SCALAR128_GT(x, y)
#define DM_SEQUENCE_LE(x, y)  DM_SCALAR128_LE(x, y)
#define DM_SEQUENCE_GE(x, y)  DM_SCALAR128_GE(x, y)
 
/* Event message header */
struct dm_eventmsg
{
  dm_ssize_t          _link;
  dm_eventtype_t      ev_type;
  dm_token_t          ev_token;
  dm_sequence_t       ev_sequence;
  dm_nodeid_t         ev_nodeid;   /* GPFS specific - not in XDSM standard */
  dm_vardata_t        ev_data;
};
typedef struct dm_eventmsg dm_eventmsg_t;
 
/* Cancel event message */
struct dm_cancel_event
{
  dm_sequence_t       ce_sequence;
  dm_token_t          ce_token;
};
typedef struct dm_cancel_event dm_cancel_event_t;
 
/* Data event message */
struct dm_data_event
{
  dm_vardata_t        de_handle;
  dm_off_t            de_offset;
  dm_size_t           de_length;
};
typedef struct dm_data_event dm_data_event_t;
 
/* Destroy event message */
struct dm_destroy_event
{
  dm_vardata_t        ds_handle;
  dm_attrname_t       ds_attrname;
  dm_vardata_t        ds_attrcopy;
};
typedef struct dm_destroy_event dm_destroy_event_t;
 
/* Mount event message */
struct dm_mount_event
{
  mode_t              me_mode;
  dm_vardata_t        me_handle1;
  dm_vardata_t        me_handle2;
  dm_vardata_t        me_name1;
  dm_vardata_t        me_name2;
  dm_vardata_t        me_roothandle;
};
typedef struct dm_mount_event dm_mount_event_t;
 
/* Namespace event message */
struct dm_namesp_event
{
  mode_t              ne_mode;
  dm_vardata_t        ne_handle1;
  dm_vardata_t        ne_handle2;
  dm_vardata_t        ne_name1;
  dm_vardata_t        ne_name2;
  int                 ne_retcode;
};
typedef struct dm_namesp_event  dm_namesp_event_t;
 
/* Flags for the mode field of mount, preunmount and unmount event messages */
#define DM_MOUNT_RDONLY       (0x1)
#define DM_UNMOUNT_FORCE      (0x2)
#define DM_LOCAL_MOUNT        (0x4) /* GPFS specific - not in XDSM standard */
#define DM_REMOTE_MOUNT       (0x8) /* GPFS specific - not in XDSM standard */
 
struct dm_timestruct
{
  time_t              dm_tv_sec;
  dm_signed32         dm_tv_nsec;
};
typedef struct dm_timestruct  dm_timestruct_t;
 
/* DMAPI file attributes */
struct dm_fileattr
{
  mode_t              fa_mode;
  uid_t               fa_uid;
  gid_t               fa_gid;
  time_t              fa_atime;
  time_t              fa_mtime;
  time_t              fa_ctime;
  time_t              fa_dtime;
  dm_off_t            fa_size;
};
typedef struct dm_fileattr  dm_fileattr_t;
 
/* Message types for user events */
typedef enum
{
  DM_MSGTYPE_INVALID,
  DM_MSGTYPE_SYNC,
  DM_MSGTYPE_ASYNC
} dm_msgtype_t;
 
/* Region descriptor */
struct dm_region
{
  dm_off_t            rg_offset;
  dm_size_t           rg_size;
  u_int               rg_flags;
  dm_signed32         rg_opaque; /* GPFS specific - not in XDSM standard */
};
typedef struct dm_region dm_region_t;
 
#define DM_REGION_NOEVENT       (0x0)
#define DM_REGION_READ          (0x1)
#define DM_REGION_WRITE         (0x2)
#define DM_REGION_TRUNCATE      (0x4)
 
/* Responses for dm_respond_event() */
typedef enum
{
  DM_RESP_INVALID,
  DM_RESP_CONTINUE,
  DM_RESP_ABORT,
  DM_RESP_DONTCARE
} dm_response_t;
 
/* Access rights */
typedef enum
{
  DM_RIGHT_NULL,
  DM_RIGHT_SHARED,
  DM_RIGHT_EXCL
} dm_right_t;
 
/* Status information */
struct dm_stat
{
  dm_ssize_t          _link;
  dm_vardata_t        dt_handle;
  dm_vardata_t        dt_compname;
  dm_eventset_t       dt_emask;
  int                 dt_nevents;
  int                 dt_pers;
  int                 dt_pmanreg;
  time_t              dt_dtime;
  u_int               dt_change;
  dev_t               dt_dev;
  ino_t               dt_ino;
  mode_t              dt_mode;
  nlink_t             dt_nlink;
  uid_t               dt_uid;
  gid_t               dt_gid;
  dev_t               dt_rdev;
  dm_off_t            dt_size;
  time_t              dt_atime;
  time_t              dt_mtime;
  time_t              dt_ctime;
  u_int               dt_blksize;
  dm_size_t           dt_blocks;
};
typedef struct dm_stat  dm_stat_t;
 
/* File attribute masks */
#define DM_AT_ATIME             (0x0001)
#define DM_AT_CFLAG             (0x0002)
#define DM_AT_CTIME             (0x0004)
#define DM_AT_DTIME             (0x0008)
#define DM_AT_EMASK             (0x0010)
#define DM_AT_GID               (0x0020)
#define DM_AT_HANDLE            (0x0040)
#define DM_AT_MODE              (0x0080)
#define DM_AT_MTIME             (0x0100)
#define DM_AT_PATTR             (0x0200)
#define DM_AT_PMANR             (0x0400)
#define DM_AT_SIZE              (0x0800)
#define DM_AT_STAT              (0x1000)
#define DM_AT_UID               (0x2000)
 
struct dm_xstat
{
  dm_ssize_t          _link;
  dm_stat_t           dx_statinfo;
  dm_vardata_t        dx_attrdata;
};
typedef struct dm_xstat dm_xstat_t;
 
/* Max size of a session label */
#define DM_SESSION_INFO_LEN     256
 
/* Special session identifier */
#define DM_NO_SESSION           ((dm_sessid_t) 0)
 
/* Flag indicating whether to wait in dm_get_events */
#define DM_EV_WAIT              (0x1)
 
/* Flag indicating whether to wait in dm_request_right */
#define DM_RR_WAIT              (0x1)
 
/* Special file handles */
#define DM_GLOBAL_HANP          ((void *) 0xFFFFFFFD)
#define DM_GLOBAL_HLEN          ((size_t)0)
 
#define DM_INVALID_HANP         ((void *) 0xFFFFFFFF)
#define DM_INVALID_HLEN         ((size_t)0)
 
/* Special tokens */
static const dm_token_t                _dmNoToken = { 0,0 };
#define DM_NO_TOKEN             _dmNoToken
 
static const dm_token_t                _dmInvalidToken = { 0,1 };
#define DM_INVALID_TOKEN        _dmInvalidToken
 
/* Flag for the dm_write_invis() call */
#define DM_WRITE_SYNC           (0x1)
 
/* Version identifier */
#define DM_VER_STR_CONTENTS     "GPFS DMAPI 1.00"
 
/* File handle components */
typedef dm_unsigned64 dm_fsid_t;
 
typedef dm_unsigned32 dm_igen_t;
 
typedef ino_t         dm_ino_t;
 
struct dm_inherit
{
  dm_attrname_t       ih_name;
  mode_t              ih_filetype;
};
typedef struct dm_inherit dm_inherit_t;
 
#endif /* _DMAPI_TYPES_H */


[ Top of Page | Previous Page | Next Page | Table of Contents | Index ]