diff --git a/src/XrdPosix/XrdPosixFile.cc b/src/XrdPosix/XrdPosixFile.cc index 08e52d03e86..92ebe77722d 100644 --- a/src/XrdPosix/XrdPosixFile.cc +++ b/src/XrdPosix/XrdPosixFile.cc @@ -225,22 +225,25 @@ bool XrdPosixFile::Close(XrdCl::XRootDStatus &Status) /* F i n a l i z e */ /******************************************************************************/ -bool XrdPosixFile::Finalize(XrdCl::XRootDStatus &Status) +bool XrdPosixFile::Finalize(XrdCl::XRootDStatus *Status) { + XrdOucCacheIO2 *ioP; + // Indicate that we are at the start of the file // currOffset = 0; // Complete initialization. If the stat() fails, the caller will unwind the -// whole open process (ick). +// whole open process (ick). In the process get correct I/O vector. - if (!Stat(Status)) - return false; + if (!Status) ioP = (XrdOucCacheIO2 *)PrepIO; + else if (Stat(*Status)) ioP = (XrdOucCacheIO2 *)this; + else return false; // Setup the cache if it is to be used // if (XrdPosixGlobals::theCache) - XCio = XrdPosixGlobals::theCache->Attach((XrdOucCacheIO2 *)this, cOpt); + XCio = XrdPosixGlobals::theCache->Attach(ioP, cOpt); return true; } @@ -258,8 +261,8 @@ void XrdPosixFile::HandleResponse(XrdCl::XRootDStatus *status, // If no errors occured, complete the open // - if (!(status->IsOK())) rc = XrdPosixMap::Result(*status); - else if (!Finalize(Status)) rc = XrdPosixMap::Result(Status); + if (!(status->IsOK())) rc = XrdPosixMap::Result(*status); + else if (!Finalize(&Status)) rc = XrdPosixMap::Result(Status); // Issue callback with the correct result // diff --git a/src/XrdPosix/XrdPosixFile.hh b/src/XrdPosix/XrdPosixFile.hh index d30cf68e8a5..d9e2adf052c 100644 --- a/src/XrdPosix/XrdPosixFile.hh +++ b/src/XrdPosix/XrdPosixFile.hh @@ -84,7 +84,7 @@ static void DelayedDestroy(XrdPosixFile *fp); bool Close(XrdCl::XRootDStatus &Status); - bool Finalize(XrdCl::XRootDStatus &Status); + bool Finalize(XrdCl::XRootDStatus *Status); long long FSize() {AtomicBeg(updMutex); long long retSize = AtomicGet(mySize); diff --git a/src/XrdPosix/XrdPosixXrootd.cc b/src/XrdPosix/XrdPosixXrootd.cc index 7576bb7f045..84b94dbecfc 100644 --- a/src/XrdPosix/XrdPosixXrootd.cc +++ b/src/XrdPosix/XrdPosixXrootd.cc @@ -106,7 +106,11 @@ int OpenDefer(XrdPosixFile *fp, // Allocate a prepare I/O object to defer this open // - fp->XCio = fp->PrepIO = new XrdPosixPrepIO(fp, XOflags, XOmode); + fp->PrepIO = new XrdPosixPrepIO(fp, XOflags, XOmode); + +// Finalize this file object. A null argument indicates it is defered. +// + fp->Finalize(0); // For sync opens we just need to return the file descriptor // @@ -545,7 +549,7 @@ int XrdPosixXrootd::Open(const char *path, int oflags, mode_t mode, // finalization is defered until the callback happens. // if (cbP) {errno = EINPROGRESS; return -1;} - if (fp->Finalize(Status)) return fp->FDNum(); + if (fp->Finalize(&Status)) return fp->FDNum(); return XrdPosixMap::Result(Status); }