38#include "XrdVersion.hh"
59 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
61 skipsuffix_ = !config_.tagParam_.hasPrefix();
64 skipprefix_ = config_.tagParam_.matchPrefixDir(path);
67 skipprefixname_ = config_.tagParam_.getPrefixName();
80 if (ret<0)
return ret;
83 if (config_.tagParam_.isTagFile(buff))
continue;
87 if (skipprefixname_ == buff)
continue;
138 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
141 std::shared_ptr<XrdOssCsiFile::puMapItem_t> pmi;
143 const std::string tpath = config_.tagParam_.makeTagFilename(path);
153 const int uret =
successor_->Unlink(path, Opts, eP);
160 utret =
successor_->Unlink(pmi->tpath.c_str(), Opts, eP);
163 pmi->unlinked =
true;
166 return (utret == -ENOENT) ? 0 : utret;
172 if (config_.tagParam_.isTagFile(oldname) || config_.tagParam_.isTagFile(newname))
return -ENOENT;
174 const std::string inew = config_.tagParam_.makeTagFilename(newname);
175 const std::string iold = config_.tagParam_.makeTagFilename(oldname);
178 std::shared_ptr<XrdOssCsiFile::puMapItem_t> newpmi,pmi;
194 if (std::less{}(pmi,newpmi))
196 lck.Lock(&newpmi->mtx);
197 lck2.
Lock(&pmi->mtx);
201 lck2.
Lock(&pmi->mtx);
202 lck.Lock(&newpmi->mtx);
205 if (pmi->unlinked || newpmi->unlinked)
210 return Rename(oldname, newname, old_env, new_env);
213 const int sret =
successor_->Rename(oldname, newname, old_env, new_env);
223 std::string base = inew;
224 const size_t idx = base.rfind(
"/");
225 base = base.substr(0,idx);
228 const int AMode = S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH;
229 mkdret =
successor_->Mkdir(base.c_str(), AMode, 1, new_env);
233 if (mkdret !=
XrdOssOK && mkdret != -EEXIST)
235 (void)
successor_->Rename(newname, oldname, new_env, old_env);
241 const int iret =
successor_->Rename(iold.c_str(), inew.c_str(), old_env, new_env);
247 (void)
successor_->Unlink(inew.c_str(), 0, new_env);
251 (void)
successor_->Rename(newname, oldname, new_env, old_env);
260 newpmi->unlinked =
true;
273 pmi->dpath = newname;
285 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
287 std::unique_ptr<XrdOssDF> fp(
newFile(
"xrdt"));
289 int ret = fp->Open(path, O_RDWR, 0, envP ? *envP : myEnv);
294 ret = fp->Ftruncate(size);
305 const char *cgName,
const char *anchor)
307 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
313 if (config_.tagParam_.isTagFile(path))
return -EACCES;
314 return successor_->Mkdir(path, mode, mkpath, envP);
326 if (config_.tagParam_.isTagFile(path))
return -EACCES;
329 std::shared_ptr<XrdOssCsiFile::puMapItem_t> pmi;
331 const std::string tpath = config_.tagParam_.makeTagFilename(path);
342 const bool isTrunc = ((Opts>>8)&O_TRUNC) ?
true :
false;
343 const bool isExcl = ((Opts&
XRDOSS_new) || ((Opts>>8)&O_EXCL)) ?
true :
false;
345 if (isTrunc && pmi->pages)
355 const int exflags = isTrunc ? 0 : ((O_EXCL<<8)|
XRDOSS_new);
357 int ret =
successor_->Create(
tident, path, access_mode, env, Opts | exflags);
358 if (ret ==
XrdOssOK || ret == -EEXIST)
361 bool zlen = (ret ==
XrdOssOK) ?
true :
false;
366 if (sbuf.st_size == 0)
375 const std::string tpath = config_.tagParam_.makeTagFilename(path);
376 const int flags = O_RDWR|O_CREAT|O_TRUNC;
379 std::unique_ptr<XrdOucEnv> tagEnv =
tagOpenEnv(config_, env);
381 ret =
successor_->Create(
tident, tpath.c_str(), 0666, *tagEnv, (flags<<8)|cropts);
388 return (ret==-EEXIST && !isExcl) ?
XrdOssOK : ret;
393 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
399 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
400 const int ret =
successor_->Remdir(path, Opts, eP);
401 if (ret !=
XrdOssOK || !config_.tagParam_.hasPrefix())
return ret;
406 const std::string tpath = config_.tagParam_.makeBaseDirname(path);
407 (void)
successor_->Remdir(tpath.c_str(), Opts, eP);
414 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
420 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
432 const int oret = fp->Open(path, O_RDONLY, 0, myEnv);
437 const int vs = fp->VerificationStatus();
443 buff->st_rdev |=
static_cast<dev_t
>(vs);
450 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
451 return successor_->StatXA(path, buff, blen, envP);
457 const char *config_fn,
474 const char *info = env.
Env(infolen);
475 std::unique_ptr<XrdOucEnv> newEnv(
new XrdOucEnv(info, infolen, env.
secEnv()));
491 newEnv->Put(
"oss.asize", size_str);
495 newEnv->Put(
"oss.asize",
"0");
static XrdSysLogger Logger
XrdOss * XrdOssAddStorageSystem2(XrdOss *curr_oss, XrdSysLogger *Logger, const char *config_fn, const char *parms, XrdOucEnv *envP)
XrdVERSIONINFO(XrdOssAddStorageSystem2, XrdOssCsi) XrdSysError OssCsiEroute(0
XrdOucTrace OssCsiTrace & OssCsiEroute
std::string xrdtSpaceName() const
virtual int Opendir(const char *path, XrdOucEnv &env)
virtual int Readdir(char *buff, int blen)
XrdOssCsiDir(XrdOss *parent, const char *tid, XrdOssCsiConfig &cf)
static XrdSysMutex pumtx_
static std::unordered_map< std::string, std::shared_ptr< puMapItem_t > > pumap_
static void mapTake(const std::string &, std::shared_ptr< puMapItem_t > &, bool create=true)
static int mapRelease(std::shared_ptr< puMapItem_t > &, XrdSysMutexHelper *plck=NULL)
virtual int Remdir(const char *path, int Opts=0, XrdOucEnv *eP=0)
virtual int Stat(const char *path, struct stat *buff, int opts=0, XrdOucEnv *EnvP=0)
static std::unique_ptr< XrdOucEnv > tagOpenEnv(const XrdOssCsiConfig &, XrdOucEnv &)
virtual int Unlink(const char *path, int Opts=0, XrdOucEnv *eP=0)
virtual int Reloc(const char *tident, const char *path, const char *cgName, const char *anchor=0)
virtual int Init(XrdSysLogger *lp, const char *cfn)
virtual XrdOssDF * newFile(const char *tident)
virtual int Mkdir(const char *path, mode_t mode, int mkpath=0, XrdOucEnv *envP=0)
virtual int Chmod(const char *path, mode_t mode, XrdOucEnv *envP=0)
virtual int Create(const char *tident, const char *path, mode_t access_mode, XrdOucEnv &env, int Opts=0)
virtual int Truncate(const char *path, unsigned long long size, XrdOucEnv *envP=0)
virtual int StatXA(const char *path, char *buff, int &blen, XrdOucEnv *envP=0)
static XrdScheduler * Sched_
virtual int StatPF(const char *path, struct stat *buff, int opts)
virtual int Rename(const char *oldname, const char *newname, XrdOucEnv *old_env=0, XrdOucEnv *new_env=0)
virtual XrdOssDF * newDir(const char *tident)
static const int PF_dStat
static const int PF_csVer
verified file checksums present
static const int PF_csVun
unverified file checksums present
const XrdSecEntity * secEnv() const
char * Get(const char *varname)
void * GetPtr(const char *varname)
static int a2sz(XrdSysError &, const char *emsg, const char *item, long long *val, long long minv=-1, long long maxv=-1)
void Lock(XrdSysMutex *Mutex)
static const int PageSize