42 #include <sys/types.h>
43 #include <sys/param.h>
45 #include <sys/vnode.h>
48 #include "XrdVersion.hh"
70 #include "oocx_CXFile.h"
99 const char *OssLib,
const char *OssParms,
109 if (urVer.vNum != myOssSys.
myVersion->vNum
119 if (!OssLib) {
if (myOssSys.
Init(
Logger, config_fn,
envP))
return 0;
120 else return (
XrdOss *)&myOssSys;
127 "osslib", OssLib)))
return 0;
131 const char *epName1 =
"XrdOssGetStorageSystem";
133 const char *epName2 =
"?XrdOssGetStorageSystem2";
142 if (!getOSS1)
return 0;
151 if (
envP && strcmp(OssLib, myLib->
Path()))
167 XrdVersionInfo &urVer)
169 return XrdOssGetSS(logger, cfg_fn, 0, 0, 0, urVer);
211 if ((
int)strlen(oldp) >= blen)
return -ENAMETOOLONG;
218 if (!
lcl_N2N) {rc = 0;
return oldp;}
235 if (strlen(oldp) >= MAXPATHLEN)
return -ENAMETOOLONG;
252 if (strlen(oldp) >= MAXPATHLEN)
return -ENAMETOOLONG;
274 char actual_path[MAXPATHLEN+1], *local_path;
280 if ((retc =
lcl_N2N->
lfn2pfn(path, actual_path,
sizeof(actual_path))))
282 else local_path = actual_path;
283 else local_path = (
char *)path;
287 return (chmod(local_path, mode) ? -errno :
XrdOssOK);
308 char actual_path[MAXPATHLEN+1], *local_path;
318 if ((retc =
lcl_N2N->
lfn2pfn(path, actual_path,
sizeof(actual_path))))
320 else local_path = actual_path;
321 else local_path = (
char *)path;
326 if (mkpath && errno == ENOENT){
return Mkpath(local_path, mode);}
327 if (errno != EEXIST)
return -errno;
332 static const mode_t accBits = (S_IRWXU|S_IRWXG|S_IRWXO);
355 char local_path[MAXPATHLEN+1], *next_path;
356 int i = strlen(path);
360 strcpy(local_path, path);
364 while(i && local_path[--i] ==
'/') local_path[i] =
'\0';
365 if (!i)
return -ENOENT;
369 next_path = local_path;
370 while((next_path = index(next_path+1,
int(
'/'))))
372 if (
mkdir(local_path, mode) && errno != EEXIST)
return -errno;
378 if (
mkdir(local_path, mode) && errno != EEXIST)
return -errno;
398 static const char statfmt1[] =
"<stats id=\"oss\" v=\"2\">";
399 static const char statfmt2[] =
"</stats>";
400 static const int statflen =
sizeof(statfmt1) +
sizeof(statfmt2);
406 if (!buff)
return statflen +
getStats(0,0);
410 if (blen < statflen)
return 0;
411 strcpy(bp, statfmt1);
412 bp +=
sizeof(statfmt1)-1; blen -=
sizeof(statfmt1)-1;
421 if (blen >= (
int)
sizeof(statfmt2))
422 {strcpy(bp, statfmt2); bp += (
sizeof(statfmt2)-1);}
445 struct stat statbuff;
446 char actual_path[MAXPATHLEN+1], *local_path;
457 if ((retc =
lcl_N2N->
lfn2pfn(path, actual_path,
sizeof(actual_path))))
459 else local_path = actual_path;
460 else local_path = (
char *)path;
464 if (
lstat(local_path, &statbuff))
return -errno;
465 else if ((statbuff.st_mode & S_IFMT) == S_IFDIR)
return -EISDIR;
466 else if ((statbuff.st_mode & S_IFMT) == S_IFLNK)
468 if (
stat(local_path, &buff))
return -errno;
469 oldsz = buff.st_size;
470 }
else oldsz = statbuff.st_size;
474 if (
truncate(local_path, size))
return -errno;
500 char actual_path[MAXPATHLEN+1], *local_path, *remote_path;
520 else local_path = actual_path;
521 else local_path = (
char *)dir_path;
526 if (!(dOpts & isStage) || (dOpts & noDread))
527 {
TRACE(
Opendir,
"lcl path " <<local_path <<
" (" <<dir_path <<
")");
528 if (!(lclfd = XrdSysFD_OpenDir(local_path)))
return -errno;
539 else remote_path = actual_path;
540 else remote_path = (
char *)dir_path;
542 TRACE(
Opendir,
"rmt path " << remote_path <<
" (" << dir_path <<
")");
596 {
strlcpy(buff, rp->d_name, blen);
599 {
if (errno != ENOENT)
return -errno;
606 *buff =
'\0'; ateof =
true;
613 {
if (ateof) *buff =
'\0';
614 else {*buff =
'.'; ateof =
true;}
646 if (!lclfd)
return -ENOTSUP;
677 if (retsz) *retsz = 0;
720 unsigned long long popts;
722 char actual_path[MAXPATHLEN+1], *local_path;
740 else local_path = actual_path;
741 else local_path = (
char *)path;
745 if ((Oflag & (O_WRONLY | O_RDWR)) && (popts &
XRDEXP_NOTRW))
753 if ( (
fd = (
int)Open_ufs(local_path, Oflag,
Mode, popts)) == -ENOENT
765 {
do {retc =
fstat(
fd, &buf);}
while(retc && errno == EINTR);
766 if (!retc && !(buf.st_mode & S_IFREG))
767 {
close(
fd);
fd = (buf.st_mode & S_IFDIR ? -EISDIR : -ENOTBLK);}
768 if (Oflag & (O_WRONLY | O_RDWR))
772 FSize = -1; cacheP = 0;
774 }
else if (
fd == -EEXIST)
775 {
do {retc =
stat(local_path,&buf);}
while(retc && errno==EINTR);
776 if (!retc && (buf.st_mode & S_IFDIR))
fd = -EISDIR;
819 do {retc =
fstat(
fd, &buf);}
while(retc && errno == EINTR);
820 if (cacheP && FSize != buf.st_size)
822 if (retsz) *retsz = buf.st_size;
827 if (cxobj) {
delete cxobj; cxobj = 0;}
829 fd = -1; FSize = -1; cacheP = 0;
851 #if defined(__linux__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
852 posix_fadvise(
fd, offset, blen, POSIX_FADV_WILLNEED);
884 else retval = cxobj->Read((
char *)buff, blen, offset);
887 do { retval =
pread(
fd, buff, blen, offset); }
888 while(retval < 0 && errno == EINTR);
890 return (retval >= 0 ? retval : (ssize_t)-errno);
912 ssize_t rdsz, totBytes = 0;
917 #if (defined(__linux__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))) && defined(HAVE_ATOMICS)
919 long long begOff, endOff, begLst = -1, endLst = -1;
928 if (readV[nPR].size > 0)
931 rdsz = endOff - begOff + 1;
932 if ((begOff > endLst || endOff < begLst)
934 {posix_fadvise(
fd, begOff, rdsz, POSIX_FADV_WILLNEED);
935 TRACE(
Debug,
"fadvise(" <<
fd <<
',' <<begOff <<
',' <<rdsz <<
')');
938 begLst = begOff; endLst = endOff;
945 for (i = 0; i < n; i++)
946 {
do {rdsz =
pread(
fd, readV[i].data, readV[i].size, readV[i].offset);}
947 while(rdsz < 0 && errno == EINTR);
948 if (rdsz < 0 || rdsz != readV[i].size)
949 {totBytes = (rdsz < 0 ? -errno : -ESPIPE);
break;}
951 #if (defined(__linux__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))) && defined(HAVE_ATOMICS)
952 if (nPR < n && readV[nPR].size > 0)
955 rdsz = endOff - begOff + 1;
956 if ((begOff > endLst || endOff < begLst)
958 {posix_fadvise(
fd, begOff, rdsz, POSIX_FADV_WILLNEED);
959 TRACE(
Debug,
"fadvise(" <<
fd <<
',' <<begOff <<
',' <<rdsz <<
')');
961 begLst = begOff; endLst = endOff;
969 #if (defined(__linux__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))) && defined(HAVE_ATOMICS)
998 if (cxobj) retval = cxobj->ReadRaw((
char *)buff, blen, offset);
1001 do { retval =
pread(
fd, buff, blen, offset); }
1002 while(retval < 0 && errno == EINTR);
1004 return (retval >= 0 ? retval : (ssize_t)-errno);
1031 do { retval =
pwrite(
fd, buff, blen, offset); }
1032 while(retval < 0 && errno == EINTR);
1034 if (retval < 0) retval = (retval == EBADF && cxobj ? -
XRDOSS_E8022 : -errno);
1071 const struct timeval *utArgs;
1075 if (alen !=
sizeof(
struct timeval)*2 || !args)
return -EINVAL;
1076 utArgs = (
const struct timeval *)args;
1077 if (futimes(
fd, utArgs))
return -errno;
1099 #if defined(__linux__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
1102 posix_fadvise(
fd, 0, 0, POSIX_FADV_DONTNEED);
1156 if (mmFile)
return (addr ? mmFile->
Export(addr) : 1);
1157 if (addr) *addr = 0;
1178 {cxidp[0] = cxid[0]; cxidp[1] = cxid[1];
1179 cxidp[2] = cxid[2]; cxidp[3] = cxid[3];
1207 off_t newlen = flen;
1209 if (
sizeof(newlen) <
sizeof(flen) && (flen>>31))
return -
XRDOSS_E8008;
1223 int XrdOssFile::Open_ufs(
const char *path,
int Oflag,
int Mode,
1224 unsigned long long popts)
1227 static const
int isWritable = O_WRONLY|O_RDWR;
1230 char *ftype = (
char *)
" path=";
1245 do { myfd = XrdSysFD_Open(path, Oflag|O_LARGEFILE,
Mode);}
1246 while( myfd < 0 && errno == EINTR);
1255 bzero(&lock_args,
sizeof(lock_args));
1256 lock_args.l_type = F_RDLCK;
1257 fcntl(myfd, F_SETLKW, &lock_args);
1262 if (myfd < 0) myfd = -errno;
1264 else if ((popts & XRDEXP_COMPCHK)
1265 && oocx_CXFile::isCompressed(myfd, cxid, &cxpgsz))
1273 {
if (myfd < XrdOssSS->FDFence)
1276 else {
close(myfd); myfd = newfd;}
1281 if (attcx) {cxobj =
new oocx_CXFile;
1282 ftype = (
char *)
" CXpath=";
1283 if ((retc = cxobj->Attach(myfd, path)) < 0)
1284 {
close(myfd); myfd = retc;
delete cxobj; cxobj = 0;}
XrdOss * XrdOssDefaultSS(XrdSysLogger *logger, const char *cfg_fn, XrdVersionInfo &urVer)
XrdSysError OssEroute(0, "oss_")
XrdSysTrace OssTrace("oss")
XrdOss * XrdOssGetSS(XrdSysLogger *Logger, const char *config_fn, const char *OssLib, const char *OssParms, XrdOucEnv *envP, XrdVersionInfo &urVer)
#define Check_RW(act, path, opname)
XrdOss *(* XrdOssGetStorageSystem_t)(XrdOss *native_oss, XrdSysLogger *Logger, const char *config_fn, const char *parms)
The typedef that describes the XRdOssStatInfoInit external.
XrdOss *(* XrdOssGetStorageSystem2_t)(XrdOss *native_oss, XrdSysLogger *Logger, const char *config_fn, const char *parms, XrdOucEnv *envP)
int truncate(const char *path, off_t offset)
ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset)
int stat(const char *path, struct stat *buf)
int ftruncate(int fildes, off_t offset)
struct dirent * readdir(DIR *dirp)
ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset)
int fstat(int fildes, struct stat *buf)
int lstat(const char *path, struct stat *buf)
int fcntl(int fd, int cmd,...)
int mkdir(const char *path, mode_t mode)
int fdatasync(int fildes)
static const char memKeep
static const char memLock
static XrdOssCache_FS * Find(const char *Path, int lklen=0)
static void Adjust(dev_t devid, off_t size)
static const int Fctl_utimes
int StatRet(struct stat *buff)
int Opendir(const char *, XrdOucEnv &)
int Readdir(char *buff, int blen)
int Close(long long *retsz=0)
virtual int Close(long long *retsz=0)
int isCompressed(char *cxidp=0)
ssize_t Read(off_t, size_t)
int Fctl(int cmd, int alen, const char *args, char **resp=0)
virtual int Open(const char *, int, mode_t, XrdOucEnv &)
off_t getMmap(void **addr)
void Flush()
Flush filesystem cached pages for this file (used for checksums).
ssize_t ReadV(XrdOucIOVec *readV, int)
int Ftruncate(unsigned long long)
ssize_t Write(const void *, off_t, size_t)
ssize_t ReadRaw(void *, off_t, size_t)
off_t Export(void **Addr)
static XrdOssMioFile * Map(char *path, int fd, int opts)
static void Recycle(XrdOssMioFile *mp)
int GenRemotePath(const char *, char *)
virtual int Stage(const char *, const char *, XrdOucEnv &, int, mode_t, unsigned long long)
int Configure(const char *, XrdSysError &, XrdOucEnv *envP)
int MSS_Readdir(void *fd, char *buff, int blen)
int Init(XrdSysLogger *, const char *, XrdOucEnv *envP)
int getStats(char *buff, int blen)
int Mkdir(const char *, mode_t mode, int mkpath=0, XrdOucEnv *eP=0)
unsigned long long PathOpts(const char *path)
int Mkpath(const char *, mode_t mode)
int GenLocalPath(const char *, char *)
XrdOucName2Name * lcl_N2N
int Lfn2Pfn(const char *Path, char *buff, int blen)
XrdVersionInfo * myVersion
int Stat(const char *, struct stat *, int opts=0, XrdOucEnv *Env=0)
unsigned long long DirFlags
int Chmod(const char *, mode_t mode, XrdOucEnv *eP=0)
int Stats(char *bp, int bl)
int Truncate(const char *, unsigned long long Size, XrdOucEnv *eP=0)
void * MSS_Opendir(const char *, int &rc)
XrdOucName2Name * rmt_N2N
virtual void EnvInfo(XrdOucEnv *envP)
char * Get(const char *varname)
void Put(const char *varname, const char *value)
virtual int lfn2pfn(const char *lfn, char *buff, int blen)=0
virtual int lfn2rfn(const char *lfn, char *buff, int blen)=0
void * Resolve(const char *symbl, int mcnt=1)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
XrdSysLogger * logger(XrdSysLogger *lp=0)
static bool VerCmp(XrdVersionInfo &vInf1, XrdVersionInfo &vInf2, bool noMsg=false)
void SetLogger(XrdSysLogger *logp)