2025-08-10 01:34:16 +02:00

175 lines
7.9 KiB
C

#ifndef FHGFSOPSREMOTING_H_
#define FHGFSOPSREMOTING_H_
#include <common/Common.h>
#include <filesystem/FsObjectInfo.h>
#include <filesystem/FsDirInfo.h>
#include <filesystem/FsFileInfo.h>
#include <common/storage/StorageDefinitions.h>
#include <common/toolkit/MetadataTk.h>
#include <common/storage/FileEvent.h>
#include <common/storage/StorageErrors.h>
#include <net/filesystem/FhgfsOpsCommKit.h>
#include <net/filesystem/RemotingIOInfo.h>
#include <os/iov_iter.h>
#include <toolkit/FhgfsPage.h>
#include <toolkit/FhgfsChunkPageVec.h>
enum Fhgfs_RWType;
typedef enum Fhgfs_RWType Fhgfs_RWType;
struct FileOpVecState {
FileOpState base;
struct iov_iter data;
};
union RWFileVecState {
struct FileOpVecState read;
struct FileOpState write;
};
struct StripePattern; // forward declaration
struct NetMessage; // forward declaration
extern bool FhgfsOpsRemoting_initMsgBufCache(void);
extern void FhgfsOpsRemoting_destroyMsgBufCache(void);
extern FhgfsOpsErr FhgfsOpsRemoting_listdirFromOffset(const EntryInfo* entryInfo,
FsDirInfo* dirInfo, unsigned maxOutNames);
extern FhgfsOpsErr FhgfsOpsRemoting_statRoot(App* app, fhgfs_stat* outFhgfsStat);
static inline FhgfsOpsErr FhgfsOpsRemoting_statDirect(App* app, const EntryInfo* entryInfo,
fhgfs_stat* outFhgfsStat);
extern FhgfsOpsErr FhgfsOpsRemoting_statDirect(App* app, const EntryInfo* entryInfo,
fhgfs_stat* outFhgfsStat);
extern FhgfsOpsErr FhgfsOpsRemoting_statAndGetParentInfo(App* app, const EntryInfo* entryInfo,
fhgfs_stat* outFhgfsStat, NumNodeID* outParentNodeID, char** outParentEntryID);
extern FhgfsOpsErr FhgfsOpsRemoting_setAttr(App* app, const EntryInfo* entryInfo,
SettableFileAttribs* fhgfsAttr, int validAttribs, const struct FileEvent* event);
extern FhgfsOpsErr FhgfsOpsRemoting_mkdir(App* app, const EntryInfo* parentInfo,
struct CreateInfo* createInfo, EntryInfo* outEntryInfo);
extern FhgfsOpsErr FhgfsOpsRemoting_rmdir(App* app, const EntryInfo* parentInfo,
const char* entryName, const struct FileEvent* event);
extern FhgfsOpsErr FhgfsOpsRemoting_mkfile(App* app, const EntryInfo* parentInfo,
struct CreateInfo* createInfo, EntryInfo* outEntryInfo);
extern FhgfsOpsErr FhgfsOpsRemoting_mkfileWithStripeHints(App* app, const EntryInfo* parentInfo,
struct CreateInfo* createInfo, unsigned numtargets, unsigned chunksize, EntryInfo* outEntryInfo);
extern FhgfsOpsErr FhgfsOpsRemoting_unlinkfile(App* app, const EntryInfo* parentInfo,
const char* entryName, const struct FileEvent* event);
extern FhgfsOpsErr FhgfsOpsRemoting_openfile(const EntryInfo* entryInfo, RemotingIOInfo* ioInfo,
uint32_t* outVersion, const struct FileEvent* event);
extern FhgfsOpsErr FhgfsOpsRemoting_closefile(const EntryInfo* entryInfo,
RemotingIOInfo* ioInfo, const struct FileEvent* event);
extern FhgfsOpsErr FhgfsOpsRemoting_closefileEx(const EntryInfo* entryInfo,
RemotingIOInfo* ioInfo, bool allowRetries, const struct FileEvent* event);
extern FhgfsOpsErr FhgfsOpsRemoting_flockAppendEx(const EntryInfo* entryInfo, RWLock* eiRLock,
App* app, const char* fileHandleID, int64_t clientFD, int ownerPID, int lockTypeFlags,
bool allowRetries);
extern FhgfsOpsErr FhgfsOpsRemoting_flockEntryEx(const EntryInfo* entryInfo, RWLock* eiRLock,
App* app, const char* fileHandleID, int64_t clientFD, int ownerPID, int lockTypeFlags,
bool allowRetries);
extern FhgfsOpsErr FhgfsOpsRemoting_flockRangeEx(const EntryInfo* entryInfo, RWLock* eiRLock,
App* app, const char* fileHandleID, int ownerPID, int lockTypeFlags, uint64_t start, uint64_t end,
bool allowRetries);
extern ssize_t FhgfsOpsRemoting_writefileVec(struct iov_iter* iter, loff_t offset,
RemotingIOInfo* ioInfo, bool serializeWrites);
static inline ssize_t FhgfsOpsRemoting_writefile(const char __user *buf, size_t size, loff_t offset,
RemotingIOInfo* ioInfo)
{
struct iov_iter *iter = STACK_ALLOC_BEEGFS_ITER_IOV(buf, size, WRITE);
return FhgfsOpsRemoting_writefileVec(iter, offset, ioInfo, false);
}
static inline ssize_t FhgfsOpsRemoting_writefile_kernel(const char *buf, size_t size, loff_t offset,
RemotingIOInfo* ioInfo)
{
struct iov_iter *iter = STACK_ALLOC_BEEGFS_ITER_KVEC(buf, size, WRITE);
return FhgfsOpsRemoting_writefileVec(iter, offset, ioInfo, false);
}
extern ssize_t FhgfsOpsRemoting_rwChunkPageVec(FhgfsChunkPageVec *pageVec, RemotingIOInfo* ioInfo,
Fhgfs_RWType rwType);
extern ssize_t FhgfsOpsRemoting_readfileVec(struct iov_iter *iter, size_t size, loff_t offset,
RemotingIOInfo* ioInfo, FhgfsInode* fhgfsInode);
static inline ssize_t FhgfsOpsRemoting_readfile_user(char __user *buf, size_t size, loff_t offset,
RemotingIOInfo* ioInfo, FhgfsInode* fhgfsInode)
{
struct iov_iter *iter = STACK_ALLOC_BEEGFS_ITER_IOV(buf, size, READ);
return FhgfsOpsRemoting_readfileVec(iter, size, offset, ioInfo, fhgfsInode);
}
static inline ssize_t FhgfsOpsRemoting_readfile_kernel(char *buf, size_t size, loff_t offset,
RemotingIOInfo* ioInfo, FhgfsInode* fhgfsInode)
{
struct iov_iter *iter = STACK_ALLOC_BEEGFS_ITER_KVEC(buf, size, READ);
return FhgfsOpsRemoting_readfileVec(iter, size, offset, ioInfo, fhgfsInode);
}
extern FhgfsOpsErr FhgfsOpsRemoting_rename(App* app, const char* oldName, unsigned oldLen,
DirEntryType entryType, const EntryInfo* fromDirInfo, const char* newName, unsigned newLen,
const EntryInfo* toDirInfo, const struct FileEvent* event);
extern FhgfsOpsErr FhgfsOpsRemoting_truncfile(App* app, const EntryInfo* entryInfo, loff_t size,
const struct FileEvent* event);
extern FhgfsOpsErr FhgfsOpsRemoting_fsyncfile(RemotingIOInfo* ioInfo, bool forceRemoteFlush,
bool checkSession, bool doSyncOnClose);
extern FhgfsOpsErr FhgfsOpsRemoting_statStoragePath(App* app, bool ignoreErrors,
int64_t* outSizeTotal, int64_t* outSizeFree);
extern FhgfsOpsErr FhgfsOpsRemoting_listXAttr(App* app, const EntryInfo* entryInfo, char* value,
size_t size, ssize_t* outSize);
extern FhgfsOpsErr FhgfsOpsRemoting_getXAttr(App* app, const EntryInfo* entryInfo, const char* name,
void* value, size_t size, ssize_t* outSize);
extern FhgfsOpsErr FhgfsOpsRemoting_removeXAttr(App* app, const EntryInfo* entryInfo,
const char* name);
extern FhgfsOpsErr FhgfsOpsRemoting_setXAttr(App* app, const EntryInfo* entryInfo, const char* name,
const char* value, const size_t size, int flags);
extern FhgfsOpsErr FhgfsOpsRemoting_lookupIntent(App* app,
const LookupIntentInfoIn* inInfo, LookupIntentInfoOut* outInfo);
extern FhgfsOpsErr FhgfsOpsRemoting_hardlink(App* app, const char* fromName, unsigned fromLen,
const EntryInfo* fromInfo, const EntryInfo* fromDirInfo, const char* toName, unsigned toLen,
const EntryInfo* toDirInfo, const struct FileEvent* event);
extern FhgfsOpsErr FhgfsOpsRemoting_refreshEntry(App* app, const EntryInfo* entryInfo);
extern FhgfsOpsErr FhgfsOpsRemoting_bumpFileVersion(App* app, const EntryInfo* entryInfo,
bool persistent, const struct FileEvent* event);
extern FhgfsOpsErr FhgfsOpsRemoting_getFileVersion(App* app, const EntryInfo* entryInfo,
uint32_t* outVersion);
FhgfsOpsErr __FhgfsOpsRemoting_flockGenericEx(struct NetMessage* requestMsg, unsigned respMsgType,
NodeOrGroup owner, bool isBuddyMirrored, App* app, const char* fileHandleID, int lockTypeFlags,
char* lockAckID, bool allowRetries, RWLock* eiRLock);
#ifdef LOG_DEBUG_MESSAGES
extern void __FhgfsOpsRemoting_logDebugIOCall(const char* logContext, size_t size, loff_t offset,
RemotingIOInfo* ioInfo, const char* rwTypeStr);
#else
#define __FhgfsOpsRemoting_logDebugIOCall(logContext, size, offset, ioInfo, rwTypeStr)
#endif // LOG_DEBUG_MESSAGES
enum Fhgfs_RWType
{
BEEGFS_RWTYPE_READ = 0, // read request
BEEGFS_RWTYPE_WRITE // write request
};
/**
* Stat a file or directory using EntryInfo.
*/
FhgfsOpsErr FhgfsOpsRemoting_statDirect(App* app, const EntryInfo* entryInfo,
fhgfs_stat* outFhgfsStat)
{
return FhgfsOpsRemoting_statAndGetParentInfo(app, entryInfo, outFhgfsStat, NULL, NULL);
}
#endif /*FHGFSOPSREMOTING_H_*/