beegfs/client_module/source/common/toolkit/LookupIntentInfoOut.h
2025-08-10 01:34:16 +02:00

165 lines
4.9 KiB
C

#ifndef LOOKUPINTENTINFO_H_
#define LOOKUPINTENTINFO_H_
#include <app/App.h>
#include <common/Common.h>
#include <common/net/message/storage/lookup/LookupIntentRespMsg.h>
#include <common/nodes/Node.h>
#include <common/storage/Path.h>
#include <common/storage/StorageErrors.h>
#include <common/storage/EntryInfo.h>
#include <common/storage/PathInfo.h>
#include <common/storage/StorageErrors.h>
#include <common/storage/StorageDefinitions.h>
#include <common/storage/striping/StripePattern.h>
#include <common/toolkit/list/UInt16List.h>
struct LookupIntentInfoOut;
typedef struct LookupIntentInfoOut LookupIntentInfoOut;
static inline void LookupIntentInfoOut_initFromRespMsg(LookupIntentInfoOut* this,
LookupIntentRespMsg* respMsg);
static inline void LookupIntentInfoOut_setEntryInfoPtr(LookupIntentInfoOut* this,
EntryInfo* entryInfo);
static inline void LookupIntentInfoOut_setStripePattern(LookupIntentInfoOut* this,
StripePattern *pattern);
static inline void LookupIntentInfoOut_uninit(LookupIntentInfoOut* this);
/**
* Out-Args for _lookupCreateStat operations. Init only with LookupIntentInfoOut_prepare().
*
* Note: This needs preparation by the same caller that does init of LookupIntentInfoIn
* (to assign some out-pointers before the actual method is called).
*/
struct LookupIntentInfoOut
{
int responseFlags; // combination of LOOKUPINTENTRESPMSG_FLAG_...
int lookupRes;
int statRes;
int createRes; // FhgfsOpsErr_...
int revalidateRes; // FhgfsOpsErr_SUCCESS if still valid, any other value otherwise
int openRes;
fhgfs_stat* fhgfsStat;
EntryInfo* entryInfoPtr; // Note: Not owned by this object.
// Only deserialized if either lookup or create was successful.
int revalidateUpdatedFlags;
unsigned fileHandleIDLen;
const char* fileHandleID;
// only set if open was successful
PathInfo pathInfo;
StripePattern* stripePattern;
};
static inline void LookupIntentInfoOut_prepare(LookupIntentInfoOut* this,
EntryInfo* outEntryInfo, fhgfs_stat* outFhgfsStat)
{
// note: we only assign the pointers to the out-structs here
this->entryInfoPtr = outEntryInfo;
this->fhgfsStat = outFhgfsStat;
this->responseFlags = 0;
this->lookupRes = FhgfsOpsErr_INTERNAL;
this->statRes = FhgfsOpsErr_INTERNAL;
this->createRes = FhgfsOpsErr_INTERNAL;
this->revalidateRes = FhgfsOpsErr_INTERNAL;
this->openRes = FhgfsOpsErr_INTERNAL;
this->stripePattern = NULL;
}
void LookupIntentInfoOut_initFromRespMsg(LookupIntentInfoOut* this,
LookupIntentRespMsg* respMsg)
{
this->responseFlags = respMsg->responseFlags;
this->lookupRes = respMsg->lookupResult;
if (this->responseFlags & LOOKUPINTENTRESPMSG_FLAG_CREATE)
this->createRes = respMsg->createResult;
if (respMsg->responseFlags & LOOKUPINTENTRESPMSG_FLAG_STAT)
{
this->statRes = respMsg->statResult;
if (this->statRes == FhgfsOpsErr_SUCCESS)
StatData_getOsStat(&respMsg->statData, this->fhgfsStat);
}
if (respMsg->responseFlags & LOOKUPINTENTRESPMSG_FLAG_REVALIDATE)
{
this->revalidateRes = respMsg->revalidateResult;
/* no need to fill in EntryInfo on revalidate, we (the client) already have it. Only flags
* might need to be updated. */
this->revalidateUpdatedFlags = respMsg->entryInfo.featureFlags;
}
else
if (respMsg->lookupResult == FhgfsOpsErr_SUCCESS || respMsg->createResult == FhgfsOpsErr_SUCCESS)
EntryInfo_dup(&respMsg->entryInfo, this->entryInfoPtr);
// only provided by the server on open
if (respMsg->responseFlags & LOOKUPINTENTRESPMSG_FLAG_OPEN)
{
this->openRes = respMsg->openResult;
if (respMsg->openResult == FhgfsOpsErr_SUCCESS)
{
this->fileHandleIDLen = respMsg->fileHandleIDLen;
this->fileHandleID = kstrndup(respMsg->fileHandleID, respMsg->fileHandleIDLen, GFP_NOFS);
PathInfo_dup(&respMsg->pathInfo, &this->pathInfo);
this->stripePattern =
StripePattern_createFromBuf(respMsg->patternStart, respMsg->patternLength);
}
}
}
void LookupIntentInfoOut_setEntryInfoPtr(LookupIntentInfoOut* this, EntryInfo* entryInfo)
{
this->entryInfoPtr = entryInfo;
}
void LookupIntentInfoOut_setStripePattern(LookupIntentInfoOut* this, StripePattern *pattern)
{
this->stripePattern = pattern;
}
/**
* Uninitialize (free) LookupIntentInfoOut values
*/
void LookupIntentInfoOut_uninit(LookupIntentInfoOut* this)
{
// Free EntryInfo values
if ( (this->entryInfoPtr) &&
(this->createRes == FhgfsOpsErr_SUCCESS || this->lookupRes == FhgfsOpsErr_SUCCESS) )
EntryInfo_uninit(this->entryInfoPtr);
// Destruct PathInfo
if (this->openRes == FhgfsOpsErr_SUCCESS)
{ // unitialize values only set on open success and if there was an open at all
PathInfo_uninit(&this->pathInfo);
if (this->stripePattern)
StripePattern_virtualDestruct(this->stripePattern);
}
}
#endif /*LOOKUPINTENTINFO_H_*/