38#include "XrdVersion.hh"
58 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
60 skipsuffix_ = !config_.tagParam_.hasPrefix();
63 skipprefix_ = config_.tagParam_.matchPrefixDir(path);
66 skipprefixname_ = config_.tagParam_.getPrefixName();
79 if (ret<0)
return ret;
82 if (config_.tagParam_.isTagFile(buff))
continue;
86 if (skipprefixname_ == buff)
continue;
137 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
140 std::shared_ptr<XrdOssCsiFile::puMapItem_t> pmi;
142 const std::string tpath = config_.tagParam_.makeTagFilename(path);
152 const int uret =
successor_->Unlink(path, Opts, eP);
159 utret =
successor_->Unlink(pmi->tpath.c_str(), Opts, eP);
162 pmi->unlinked =
true;
165 return (utret == -ENOENT) ? 0 : utret;
171 if (config_.tagParam_.isTagFile(oldname) || config_.tagParam_.isTagFile(newname))
return -ENOENT;
173 const std::string inew = config_.tagParam_.makeTagFilename(newname);
174 const std::string iold = config_.tagParam_.makeTagFilename(oldname);
177 std::shared_ptr<XrdOssCsiFile::puMapItem_t> newpmi,pmi;
193 lck.Lock(&newpmi->mtx);
194 lck2.
Lock(&pmi->mtx);
198 lck2.
Lock(&pmi->mtx);
199 lck.Lock(&newpmi->mtx);
202 if (pmi->unlinked || newpmi->unlinked)
207 return Rename(oldname, newname, old_env, new_env);
210 const int sret =
successor_->Rename(oldname, newname, old_env, new_env);
220 std::string base = inew;
221 const size_t idx = base.rfind(
"/");
222 base = base.substr(0,idx);
225 const int AMode = S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH;
226 mkdret =
successor_->Mkdir(base.c_str(), AMode, 1, new_env);
230 if (mkdret !=
XrdOssOK && mkdret != -EEXIST)
232 (void)
successor_->Rename(newname, oldname, new_env, old_env);
238 const int iret =
successor_->Rename(iold.c_str(), inew.c_str(), old_env, new_env);
244 (void)
successor_->Unlink(inew.c_str(), 0, new_env);
248 (void)
successor_->Rename(newname, oldname, new_env, old_env);
257 newpmi->unlinked =
true;
270 pmi->dpath = newname;
282 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
284 std::unique_ptr<XrdOssDF> fp(
newFile(
"xrdt"));
286 int ret = fp->Open(path, O_RDWR, 0, envP ? *envP : myEnv);
291 ret = fp->Ftruncate(size);
302 const char *cgName,
const char *anchor)
304 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
310 if (config_.tagParam_.isTagFile(path))
return -EACCES;
311 return successor_->Mkdir(path, mode, mkpath, envP);
323 if (config_.tagParam_.isTagFile(path))
return -EACCES;
326 std::shared_ptr<XrdOssCsiFile::puMapItem_t> pmi;
328 const std::string tpath = config_.tagParam_.makeTagFilename(path);
339 const bool isTrunc = ((Opts>>8)&O_TRUNC) ?
true :
false;
340 const bool isExcl = ((Opts&
XRDOSS_new) || ((Opts>>8)&O_EXCL)) ?
true :
false;
342 if (isTrunc && pmi->pages)
352 const int exflags = isTrunc ? 0 : ((O_EXCL<<8)|
XRDOSS_new);
354 int ret =
successor_->Create(
tident, path, access_mode, env, Opts | exflags);
355 if (ret ==
XrdOssOK || ret == -EEXIST)
358 bool zlen = (ret ==
XrdOssOK) ?
true :
false;
363 if (sbuf.st_size == 0)
372 const std::string tpath = config_.tagParam_.makeTagFilename(path);
373 const int flags = O_RDWR|O_CREAT|O_TRUNC;
376 std::unique_ptr<XrdOucEnv> tagEnv =
tagOpenEnv(config_, env);
378 ret =
successor_->Create(
tident, tpath.c_str(), 0666, *tagEnv, (flags<<8)|cropts);
385 return (ret==-EEXIST && !isExcl) ?
XrdOssOK : ret;
390 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
396 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
397 const int ret =
successor_->Remdir(path, Opts, eP);
398 if (ret !=
XrdOssOK || !config_.tagParam_.hasPrefix())
return ret;
403 const std::string tpath = config_.tagParam_.makeBaseDirname(path);
404 (void)
successor_->Remdir(tpath.c_str(), Opts, eP);
411 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
417 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
429 const int oret = fp->Open(path, O_RDONLY, 0, myEnv);
434 const int vs = fp->VerificationStatus();
440 buff->st_rdev |=
static_cast<dev_t
>(vs);
447 if (config_.tagParam_.isTagFile(path))
return -ENOENT;
448 return successor_->StatXA(path, buff, blen, envP);
454 const char *config_fn,
471 const char *info = env.
Env(infolen);
472 std::unique_ptr<XrdOucEnv> newEnv(
new XrdOucEnv(info, infolen, env.
secEnv()));
488 newEnv->Put(
"oss.asize", size_str);
492 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