beegfs/client_module/include/uapi/beegfs_client.h
2025-08-10 01:34:16 +02:00

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