301 lines
12 KiB
C
301 lines
12 KiB
C
#ifndef _BEEGFS_CLIENT_H_INCLUDED
|
|
#define _BEEGFS_CLIENT_H_INCLUDED
|
|
|
|
#define BEEGFS_IOCTL_CFG_MAX_PATH 4096 // just an arbitrary value, has to be identical in user space
|
|
#define BEEGFS_IOCTL_TEST_STRING "_FhGFS_" /* copied to user space by BEEGFS_IOC_TEST_IS_FHGFS to
|
|
to confirm an FhGFS mount */
|
|
#define BEEGFS_IOCTL_TEST_BUFLEN 6 /* note: char[6] is actually the wrong size for the
|
|
BEEGFS_IOCTL_TEST_STRING that is exchanged, but that is no problem
|
|
in this particular case and so we keep it for compatibility */
|
|
#define BEEGFS_IOCTL_MOUNTID_BUFLEN 256
|
|
#define BEEGFS_IOCTL_NODEALIAS_BUFLEN 256 // The alias (formerly string ID) buffer length.
|
|
#define BEEGFS_IOCTL_NODETYPE_BUFLEN 16
|
|
#define BEEGFS_IOCTL_FILENAME_MAXLEN 256 // max supported filename len (incl terminating zero)
|
|
|
|
// entryID string is made of three 32 bit values in hexadecimal form plus two dashes
|
|
// (see common/toolkit/StorageTk.h)
|
|
#define BEEGFS_IOCTL_ENTRYID_MAXLEN 26
|
|
|
|
// stripe pattern types
|
|
#define BEEGFS_STRIPEPATTERN_INVALID 0
|
|
#define BEEGFS_STRIPEPATTERN_RAID0 1
|
|
#define BEEGFS_STRIPEPATTERN_RAID10 2
|
|
#define BEEGFS_STRIPEPATTERN_BUDDYMIRROR 3
|
|
|
|
#define BEEGFS_IOCTL_PING_MAX_COUNT 10
|
|
#define BEEGFS_IOCTL_PING_MAX_INTERVAL 2000
|
|
#define BEEGFS_IOCTL_PING_NODE_BUFLEN 64
|
|
#define BEEGFS_IOCTL_PING_SOCKTYPE_BUFLEN 8
|
|
|
|
/*
|
|
* General notes:
|
|
* - the _IOR() macro is for ioctls that read information, _IOW refers to ioctls that write or make
|
|
* modifications (e.g. file creation).
|
|
*
|
|
* - _IOR(type, number, data_type) meanings:
|
|
* - note: _IOR() encodes all three values (type, number, data_type size) into the request number
|
|
* - type: 8 bit driver-specific number to identify the driver if there are multiple drivers
|
|
* listening to the same fd (e.g. such as the TCP and IP layers).
|
|
* - number: 8 bit integer command number, so different numbers for different routines.
|
|
* - data_type: the data type (size) to be exchanged with the driver (though this number can
|
|
* also rather be seen as a command number subversion, because the actual number given here is
|
|
* not really exchanged unless the drivers' ioctl handler explicity does the exchange).
|
|
*/
|
|
|
|
#define BEEGFS_IOCTYPE_ID 'f'
|
|
|
|
#define BEEGFS_IOCNUM_GETVERSION_OLD 1 // value from FS_IOC_GETVERSION in linux/fs.h
|
|
#define BEEGFS_IOCNUM_GETVERSION 3
|
|
#define BEEGFS_IOCNUM_GET_CFG_FILE 20
|
|
#define BEEGFS_IOCNUM_CREATE_FILE 21
|
|
#define BEEGFS_IOCNUM_TEST_IS_FHGFS 22
|
|
#define BEEGFS_IOCNUM_TEST_IS_BEEGFS 22
|
|
#define BEEGFS_IOCNUM_GET_RUNTIME_CFG_FILE 23
|
|
#define BEEGFS_IOCNUM_GET_MOUNTID 24
|
|
#define BEEGFS_IOCNUM_GET_STRIPEINFO 25
|
|
#define BEEGFS_IOCNUM_GET_STRIPETARGET 26
|
|
#define BEEGFS_IOCNUM_MKFILE_STRIPEHINTS 27
|
|
#define BEEGFS_IOCNUM_CREATE_FILE_V2 28
|
|
#define BEEGFS_IOCNUM_CREATE_FILE_V3 29
|
|
#define BEEGFS_IOCNUM_GETINODEID 30
|
|
#define BEEGFS_IOCNUM_GETENTRYINFO 31
|
|
#define BEEGFS_IOCNUM_PINGNODE 32
|
|
|
|
#define BEEGFS_IOC_GETVERSION _IOR( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_GETVERSION, long)
|
|
#define BEEGFS_IOC32_GETVERSION _IOR( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_GETVERSION, int)
|
|
#define BEEGFS_IOC_GET_CFG_FILE _IOR( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_GET_CFG_FILE, struct BeegfsIoctl_GetCfgFile_Arg)
|
|
#define BEEGFS_IOC_CREATE_FILE _IOW( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_CREATE_FILE, struct BeegfsIoctl_MkFile_Arg)
|
|
#define BEEGFS_IOC_CREATE_FILE_V2 _IOW( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_CREATE_FILE_V2, struct BeegfsIoctl_MkFileV2_Arg)
|
|
#define BEEGFS_IOC_CREATE_FILE_V3 _IOW( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_CREATE_FILE_V3, struct BeegfsIoctl_MkFileV3_Arg)
|
|
#define BEEGFS_IOC_TEST_IS_FHGFS _IOR( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_TEST_IS_FHGFS, char[BEEGFS_IOCTL_TEST_BUFLEN])
|
|
#define BEEGFS_IOC_TEST_IS_BEEGFS _IOR( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_TEST_IS_BEEGFS, char[BEEGFS_IOCTL_TEST_BUFLEN])
|
|
#define BEEGFS_IOC_GET_RUNTIME_CFG_FILE _IOR( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_GET_RUNTIME_CFG_FILE, struct BeegfsIoctl_GetCfgFile_Arg)
|
|
#define BEEGFS_IOC_GET_MOUNTID _IOR( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_GET_MOUNTID, char[BEEGFS_IOCTL_MOUNTID_BUFLEN])
|
|
#define BEEGFS_IOC_GET_STRIPEINFO _IOR( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_GET_STRIPEINFO, struct BeegfsIoctl_GetStripeInfo_Arg)
|
|
#define BEEGFS_IOC_GET_STRIPETARGET _IOR( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_GET_STRIPETARGET, struct BeegfsIoctl_GetStripeTarget_Arg)
|
|
#define BEEGFS_IOC_GET_STRIPETARGET_V2 _IOR( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_GET_STRIPETARGET, struct BeegfsIoctl_GetStripeTargetV2_Arg)
|
|
#define BEEGFS_IOC_MKFILE_STRIPEHINTS _IOW( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_MKFILE_STRIPEHINTS, struct BeegfsIoctl_MkFileWithStripeHints_Arg)
|
|
#define BEEGFS_IOC_GETINODEID _IOR( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_GETINODEID, struct BeegfsIoctl_GetInodeID_Arg)
|
|
#define BEEGFS_IOC_GETENTRYINFO _IOR( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_GETENTRYINFO, struct BeegfsIoctl_GetEntryInfo_Arg)
|
|
#define BEEGFS_IOC_PINGNODE _IOR( \
|
|
BEEGFS_IOCTYPE_ID, BEEGFS_IOCNUM_PINGNODE, struct BeegfsIoctl_PingNode_Arg)
|
|
|
|
|
|
/* used to return the client config file path using an IOCTL */
|
|
struct BeegfsIoctl_GetCfgFile_Arg
|
|
{
|
|
char path[BEEGFS_IOCTL_CFG_MAX_PATH]; // (out-value) where the result path will be stored
|
|
int length; /* (in-value) length of path buffer (unused, because it's
|
|
after a fixed-size path buffer anyways) */
|
|
};
|
|
|
|
/* used to pass information for file creation */
|
|
struct BeegfsIoctl_MkFile_Arg
|
|
{
|
|
uint16_t ownerNodeID; // owner node of the parent dir
|
|
|
|
const char* parentParentEntryID; // entryID of the parent of the parent (=> the grandparentID)
|
|
int parentParentEntryIDLen;
|
|
|
|
const char* parentEntryID; // entryID of the parent
|
|
int parentEntryIDLen;
|
|
|
|
const char* parentName; // name of parent dir
|
|
int parentNameLen;
|
|
|
|
// file information
|
|
const char* entryName; // file name we want to create
|
|
int entryNameLen;
|
|
int fileType; // see linux/fs.h or man 3 readdir, DT_UNKNOWN, DT_FIFO, ...
|
|
|
|
const char* symlinkTo; // Only must be set for symlinks. The name a symlink is supposed to point to
|
|
int symlinkToLen; // Length of the symlink name
|
|
|
|
int mode; // mode (permission) of the new file
|
|
|
|
// user ID and group only will be used, if the current user is root
|
|
uid_t uid; // user ID
|
|
gid_t gid; // group ID
|
|
|
|
int numTargets; // number of targets in prefTargets array (without final 0 element)
|
|
uint16_t* prefTargets; // array of preferred targets (additional last element must be 0)
|
|
int prefTargetsLen; // raw byte length of prefTargets array (including final 0 element)
|
|
};
|
|
|
|
struct BeegfsIoctl_MkFileV2_Arg
|
|
{
|
|
uint32_t ownerNodeID; // owner node/group of the parent dir
|
|
|
|
const char* parentParentEntryID; // entryID of the parent of the parent (=> the grandparentID)
|
|
int parentParentEntryIDLen;
|
|
|
|
const char* parentEntryID; // entryID of the parent
|
|
int parentEntryIDLen;
|
|
int parentIsBuddyMirrored;
|
|
|
|
const char* parentName; // name of parent dir
|
|
int parentNameLen;
|
|
|
|
// file information
|
|
const char* entryName; // file name we want to create
|
|
int entryNameLen;
|
|
int fileType; // see linux/fs.h or man 3 readdir, DT_UNKNOWN, DT_FIFO, ...
|
|
|
|
char* symlinkTo; // Only must be set for symlinks. The name a symlink is supposed to point to
|
|
int symlinkToLen; // Length of the symlink name
|
|
|
|
int mode; // mode (permission) of the new file
|
|
|
|
// user ID and group only will be used, if the current user is root
|
|
uid_t uid; // user ID
|
|
gid_t gid; // group ID
|
|
|
|
int numTargets; // number of targets in prefTargets array (without final 0 element)
|
|
uint16_t* prefTargets; // array of preferred targets (additional last element must be 0)
|
|
int prefTargetsLen; // raw byte length of prefTargets array (including final 0 element)
|
|
};
|
|
|
|
struct BeegfsIoctl_MkFileV3_Arg
|
|
{
|
|
uint32_t ownerNodeID; // owner node/group of the parent dir
|
|
|
|
const char* parentParentEntryID; // entryID of the parent of the parent (=> the grandparentID)
|
|
int parentParentEntryIDLen;
|
|
|
|
const char* parentEntryID; // entryID of the parent
|
|
int parentEntryIDLen;
|
|
int parentIsBuddyMirrored;
|
|
|
|
const char* parentName; // name of parent dir
|
|
int parentNameLen;
|
|
|
|
// file information
|
|
const char* entryName; // file name we want to create
|
|
int entryNameLen;
|
|
int fileType; // see linux/fs.h or man 3 readdir, DT_UNKNOWN, DT_FIFO, ...
|
|
|
|
const char* symlinkTo; // Only must be set for symlinks. The name a symlink is supposed to point to
|
|
int symlinkToLen; // Length of the symlink name
|
|
|
|
int mode; // mode (permission) of the new file
|
|
|
|
// user ID and group only will be used, if the current user is root
|
|
uid_t uid; // user ID
|
|
gid_t gid; // group ID
|
|
|
|
int numTargets; // number of targets in prefTargets array (without final 0 element)
|
|
uint16_t* prefTargets; // array of preferred targets (additional last element must be 0)
|
|
int prefTargetsLen; // raw byte length of prefTargets array (including final 0 element)
|
|
|
|
uint16_t storagePoolId; // if set, this is used to override the pool id of the parent dir
|
|
};
|
|
|
|
/* used to get the stripe info of a file */
|
|
struct BeegfsIoctl_GetStripeInfo_Arg
|
|
{
|
|
unsigned outPatternType; // (out-value) stripe pattern type (STRIPEPATTERN_...)
|
|
unsigned outChunkSize; // (out-value) chunksize for striping
|
|
uint16_t outNumTargets; // (out-value) number of stripe targets of given file
|
|
};
|
|
|
|
/* used to get the stripe target of a file */
|
|
struct BeegfsIoctl_GetStripeTarget_Arg
|
|
{
|
|
uint16_t targetIndex; // index of the target that should be queried (0-based)
|
|
|
|
uint16_t outTargetNumID; // (out-value) numeric ID of target with given index
|
|
uint16_t outNodeNumID; // (out-value) numeric ID of node to which this target is mapped
|
|
char outNodeAlias[BEEGFS_IOCTL_NODEALIAS_BUFLEN]; /* (out-value) alias (formerly string ID) of the node
|
|
to which this target is mapped */
|
|
};
|
|
|
|
struct BeegfsIoctl_GetStripeTargetV2_Arg
|
|
{
|
|
/* inputs */
|
|
uint32_t targetIndex;
|
|
|
|
/* outputs */
|
|
uint32_t targetOrGroup; // target ID if the file is not buddy mirrored, otherwise mirror group ID
|
|
|
|
uint32_t primaryTarget; // target ID != 0 if buddy mirrored
|
|
uint32_t secondaryTarget; // target ID != 0 if buddy mirrored
|
|
|
|
uint32_t primaryNodeID; // node ID of target (if unmirrored) or primary target (if mirrored)
|
|
uint32_t secondaryNodeID; // node ID of secondary target, or 0 if unmirrored
|
|
|
|
char primaryNodeAlias[BEEGFS_IOCTL_NODEALIAS_BUFLEN];
|
|
char secondaryNodeAlias[BEEGFS_IOCTL_NODEALIAS_BUFLEN];
|
|
};
|
|
|
|
/* used to pass information for file creation with stripe hints */
|
|
struct BeegfsIoctl_MkFileWithStripeHints_Arg
|
|
{
|
|
const char* filename; // file name we want to create
|
|
unsigned mode; // mode (access permission) of the new file
|
|
|
|
unsigned numtargets; // number of desired targets, 0 for directory default
|
|
unsigned chunksize; // in bytes, must be 2^n >= 64Ki, 0 for directory default
|
|
};
|
|
|
|
struct BeegfsIoctl_GetInodeID_Arg
|
|
{
|
|
// input
|
|
char entryID[BEEGFS_IOCTL_ENTRYID_MAXLEN + 1];
|
|
|
|
// output
|
|
uint64_t inodeID;
|
|
|
|
};
|
|
|
|
struct BeegfsIoctl_GetEntryInfo_Arg
|
|
{
|
|
uint32_t ownerID;
|
|
char parentEntryID[BEEGFS_IOCTL_ENTRYID_MAXLEN + 1];
|
|
char entryID[BEEGFS_IOCTL_ENTRYID_MAXLEN + 1];
|
|
int entryType;
|
|
int featureFlags;
|
|
};
|
|
|
|
struct BeegfsIoctl_PingNode_Arg_Params
|
|
{
|
|
uint32_t nodeId;
|
|
char nodeType[BEEGFS_IOCTL_NODETYPE_BUFLEN];
|
|
unsigned count;
|
|
unsigned interval;
|
|
};
|
|
|
|
struct BeegfsIoctl_PingNode_Arg_Results
|
|
{
|
|
char outNode[BEEGFS_IOCTL_PING_NODE_BUFLEN];
|
|
unsigned outSuccess;
|
|
unsigned outErrors;
|
|
unsigned outTotalTime;
|
|
unsigned outPingTime[BEEGFS_IOCTL_PING_MAX_COUNT];
|
|
char outPingType[BEEGFS_IOCTL_PING_MAX_COUNT][BEEGFS_IOCTL_PING_SOCKTYPE_BUFLEN];
|
|
};
|
|
|
|
struct BeegfsIoctl_PingNode_Arg
|
|
{
|
|
struct BeegfsIoctl_PingNode_Arg_Params params;
|
|
struct BeegfsIoctl_PingNode_Arg_Results results;
|
|
};
|
|
|
|
|
|
#endif
|