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

150 lines
4.5 KiB
C

#ifndef METADATATK_H_
#define METADATATK_H_
#include <app/App.h>
#include <common/Common.h>
#include <common/nodes/Node.h>
#include <common/storage/Path.h>
#include <common/storage/StorageErrors.h>
#include <common/storage/EntryInfo.h>
#include <common/storage/StorageErrors.h>
#include <common/storage/StorageDefinitions.h>
#include <common/toolkit/list/UInt16List.h>
#include <common/toolkit/MetadataTk.h>
#include <os/OsTypeConversion.h>
#include "LookupIntentInfoOut.h"
#include <linux/fs.h>
#define METADATATK_OWNERSEARCH_MAX_STEPS 128 /* to avoid infinite searching */
struct CreateInfo;
typedef struct CreateInfo CreateInfo;
struct OpenInfo;
typedef struct OpenInfo OpenInfo;
struct LookupIntentInfoIn;
typedef struct LookupIntentInfoIn LookupIntentInfoIn;
struct FileEvent;
extern bool MetadataTk_getRootEntryInfoCopy(App* app, EntryInfo* outEntryInfo);
// inliners
void CreateInfo_init(App* app, struct inode* parentDirInode, const char* entryName,
int mode, int umask, bool isExclusiveCreate, const struct FileEvent* fileEvent,
struct CreateInfo* outCreateInfo);
static inline void CreateInfo_setStoragePoolId(CreateInfo* this, StoragePoolId storagePoolId);
static inline void LookupIntentInfoIn_init(LookupIntentInfoIn* this,
const EntryInfo* parentEntryInfo, const char* entryName);
static inline void LookupIntentInfoIn_addEntryInfo(LookupIntentInfoIn* this,
const EntryInfo* entryInfo);
static inline void LookupIntentInfoIn_addMetaVersion(LookupIntentInfoIn* this,
uint32_t metaVersion);
static inline void LookupIntentInfoIn_addOpenInfo(LookupIntentInfoIn* this,
const OpenInfo* openInfo);
static inline void LookupIntentInfoIn_addCreateInfo(LookupIntentInfoIn* this,
const CreateInfo* createInfo);
static inline void OpenInfo_init(OpenInfo* this, int accessFlags, bool isPagedMode);
static inline void LookupIntentInfoOut_prepare(LookupIntentInfoOut* this,
EntryInfo* outEntryInfo, fhgfs_stat* outFhgfsStat);
/**
* File/Dir create information. Should be initialized using CreateInfo_init().
*/
struct CreateInfo
{
const char* entryName; // file name
unsigned userID;
unsigned groupID;
int mode;
int umask;
UInt16List* preferredMetaTargets;
UInt16List* preferredStorageTargets;
bool isExclusiveCreate; // only for open() and creat(), is O_CREAT set?
StoragePoolId storagePoolId; // can be set to override storage pool information of parent
// directory
const struct FileEvent* fileEvent;
};
struct OpenInfo
{
int accessFlags; // fhgfs flags, not in-kernel open/access flags
// const char* sessionID; // set at lower level on initializing LookupIntentMsg
};
/**
* In-Args for _lookupCreateStat operations. Init only with LookupIntentInfoIn_init().
*/
struct LookupIntentInfoIn
{
const EntryInfo* parentEntryInfo;
const EntryInfo* entryInfoPtr; // only set on revalidate
const char* entryName; // file name
const CreateInfo* createInfo; // only set on file create
bool isExclusiveCreate; // true iff O_EXCL is set
const OpenInfo* openInfo; // only set on file open
uint32_t metaVersion; //only set on revalidate
};
/**
* @param accessFlags is the same as openFlags
*/
void OpenInfo_init(OpenInfo* this, int accessFlags, bool isPagedMode)
{
this->accessFlags = OsTypeConv_openFlagsOsToFhgfs(accessFlags, isPagedMode);
// this->sessionID = sessionID; // see OpenInfo definition
}
static inline void LookupIntentInfoIn_init(LookupIntentInfoIn* this,
const EntryInfo* parentEntryInfo, const char* entryName)
{
this->parentEntryInfo = parentEntryInfo;
this->entryName = entryName;
this->entryInfoPtr = NULL;
this->openInfo = NULL;
this->createInfo = NULL;
}
void LookupIntentInfoIn_addEntryInfo(LookupIntentInfoIn* this, const EntryInfo* entryInfo)
{
this->entryInfoPtr = entryInfo;
}
void LookupIntentInfoIn_addMetaVersion(LookupIntentInfoIn* this, uint32_t version)
{
this->metaVersion = version;
}
void LookupIntentInfoIn_addOpenInfo(LookupIntentInfoIn* this, const OpenInfo* openInfo)
{
this->openInfo = openInfo;
}
void LookupIntentInfoIn_addCreateInfo(LookupIntentInfoIn* this, const CreateInfo* createInfo)
{
this->createInfo = createInfo;
if (likely(createInfo) )
this->isExclusiveCreate = createInfo->isExclusiveCreate;
}
static inline void CreateInfo_setStoragePoolId(CreateInfo* this, StoragePoolId storagePoolId)
{
this->storagePoolId = storagePoolId;
}
#endif /*METADATATK_H_*/