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

157 lines
3.5 KiB
C

#include <common/storage/striping/StripePattern.h>
#include <filesystem/FsFileInfo.h>
#include <common/toolkit/StringTk.h>
struct FsFileInfo
{
FsObjectInfo fsObjectInfo;
unsigned accessFlags;
FileHandleType handleType;
bool appending;
ssize_t cacheHits; // hits/misses counter (min and max limited by thresholds)
bool allowCaching; // false when O_DIRECT or caching disabled in config
loff_t lastReadOffset; // offset after last read (to decide if IO would be a cache hit)
loff_t lastWriteOffset; // offset after last write (to decide if IO would be a cache hit)
bool usedEntryLocking; // true when entry lock methods were used (needed for cleanup)
};
/**
* @param accessFlags fhgfs access flags (not OS flags)
*/
void FsFileInfo_init(FsFileInfo* this, App* app, unsigned accessFlags, FileHandleType handleType)
{
FsObjectInfo_init( (FsObjectInfo*)this, app, FsObjectType_FILE);
this->accessFlags = accessFlags;
this->handleType = handleType;
this->appending = false;
this->cacheHits = FSFILEINFO_CACHE_HITS_INITIAL;
this->allowCaching = true;
this->lastReadOffset = 0;
this->lastWriteOffset = 0;
this->usedEntryLocking = false;
// assign virtual functions
( (FsObjectInfo*)this)->uninit = FsFileInfo_uninit;
}
/**
* @param accessFlags fhgfs access flags (not OS flags)
*/
struct FsFileInfo* FsFileInfo_construct(App* app, unsigned accessFlags, FileHandleType handleType)
{
struct FsFileInfo* this = (FsFileInfo*)os_kmalloc(sizeof(*this) );
if(likely(this) )
FsFileInfo_init(this, app, accessFlags, handleType);
return this;
}
void FsFileInfo_uninit(FsObjectInfo* this)
{
}
/**
* Increase cache hits counter.
*
* Note: Hits counter won't get higher than a certain threshold.
*/
void FsFileInfo_incCacheHits(FsFileInfo* this)
{
if(this->cacheHits < FSFILEINFO_CACHE_HITS_THRESHOLD)
this->cacheHits++;
}
/**
* Decrease cache hits counter.
*
* Note: Hits counter won't get lower than a certain threshold.
*/
void FsFileInfo_decCacheHits(FsFileInfo* this)
{
if(this->cacheHits > FSFILEINFO_CACHE_MISS_THRESHOLD)
this->cacheHits--;
}
unsigned FsFileInfo_getAccessFlags(FsFileInfo* this)
{
return this->accessFlags;
}
FileHandleType FsFileInfo_getHandleType(FsFileInfo* this)
{
return this->handleType;
}
void FsFileInfo_setAppending(FsFileInfo* this, bool appending)
{
this->appending = appending;
}
bool FsFileInfo_getAppending(FsFileInfo* this)
{
return this->appending;
}
ssize_t FsFileInfo_getCacheHits(FsFileInfo* this)
{
return this->cacheHits;
}
void FsFileInfo_setAllowCaching(FsFileInfo* this, bool allowCaching)
{
this->allowCaching = allowCaching;
}
bool FsFileInfo_getAllowCaching(FsFileInfo* this)
{
return this->allowCaching;
}
void FsFileInfo_setLastReadOffset(FsFileInfo* this, loff_t lastReadOffset)
{
this->lastReadOffset = lastReadOffset;
}
loff_t FsFileInfo_getLastReadOffset(FsFileInfo* this)
{
return this->lastReadOffset;
}
void FsFileInfo_setLastWriteOffset(FsFileInfo* this, loff_t lastWriteOffset)
{
this->lastWriteOffset = lastWriteOffset;
}
loff_t FsFileInfo_getLastWriteOffset(FsFileInfo* this)
{
return this->lastWriteOffset;
}
void FsFileInfo_getIOInfo(FsFileInfo* this, struct FhgfsInode* fhgfsInode,
struct RemotingIOInfo* outIOInfo)
{
FhgfsInode_getRefIOInfo(fhgfsInode, this->handleType, this->accessFlags, outIOInfo);
}
void FsFileInfo_setUsedEntryLocking(FsFileInfo* this)
{
this->usedEntryLocking = true;
}
bool FsFileInfo_getUsedEntryLocking(FsFileInfo* this)
{
return this->usedEntryLocking;
}