diff options
-rw-r--r-- | lib/raidfile/RaidFileWrite.cpp | 69 |
1 files changed, 10 insertions, 59 deletions
diff --git a/lib/raidfile/RaidFileWrite.cpp b/lib/raidfile/RaidFileWrite.cpp index b3c98701..e30162fa 100644 --- a/lib/raidfile/RaidFileWrite.cpp +++ b/lib/raidfile/RaidFileWrite.cpp @@ -104,8 +104,7 @@ void RaidFileWrite::Open(bool AllowOverwrite) writeFilename += 'X'; // Attempt to open - mOSFileHandle = ::open(writeFilename.c_str(), - O_WRONLY | O_CREAT | O_BINARY, + mOSFileHandle = ::open(writeFilename.c_str(), O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); if(mOSFileHandle == -1) { @@ -116,7 +115,7 @@ void RaidFileWrite::Open(bool AllowOverwrite) #ifdef HAVE_FLOCK int errnoBlock = EWOULDBLOCK; if(::flock(mOSFileHandle, LOCK_EX | LOCK_NB) != 0) -#elif HAVE_DECL_F_SETLK +#else int errnoBlock = EAGAIN; struct flock desc; desc.l_type = F_WRLCK; @@ -124,9 +123,6 @@ void RaidFileWrite::Open(bool AllowOverwrite) desc.l_start = 0; desc.l_len = 0; if(::fcntl(mOSFileHandle, F_SETLK, &desc) != 0) -#else - int errnoBlock = ENOSYS; - if (0) #endif { // Lock was not obtained. @@ -246,46 +242,23 @@ void RaidFileWrite::Commit(bool ConvertToRaidNow) } // Rename it into place -- BEFORE it's closed so lock remains - -#ifdef WIN32 - // Except on Win32 which doesn't allow renaming open files - // Close file... - if(::close(mOSFileHandle) != 0) - { - THROW_EXCEPTION(RaidFileException, OSError) - } - mOSFileHandle = -1; -#endif // WIN32 - RaidFileController &rcontroller(RaidFileController::GetController()); RaidFileDiscSet rdiscSet(rcontroller.GetDiscSet(mSetNumber)); // Get the filename for the write file std::string renameTo(RaidFileUtil::MakeWriteFileName(rdiscSet, mFilename)); // And the current name std::string renameFrom(renameTo + 'X'); - -#ifdef WIN32 - // need to delete the target first - if(::unlink(renameTo.c_str()) != 0 && - GetLastError() != ERROR_FILE_NOT_FOUND) - { - THROW_EXCEPTION(RaidFileException, OSError) - } -#endif - if(::rename(renameFrom.c_str(), renameTo.c_str()) != 0) { THROW_EXCEPTION(RaidFileException, OSError) } -#ifndef WIN32 // Close file... if(::close(mOSFileHandle) != 0) { THROW_EXCEPTION(RaidFileException, OSError) } mOSFileHandle = -1; -#endif // !WIN32 // Raid it? if(ConvertToRaidNow) @@ -319,15 +292,8 @@ void RaidFileWrite::Discard() writeFilename += 'X'; // Unlink and close it - -#ifdef WIN32 - // On Win32 we must close it first - if (::close(mOSFileHandle) != 0 || - ::unlink(writeFilename.c_str()) != 0) -#else // !WIN32 - if (::unlink(writeFilename.c_str()) != 0 || - ::close(mOSFileHandle) != 0) -#endif // !WIN32 + if((::unlink(writeFilename.c_str()) != 0) + || (::close(mOSFileHandle) != 0)) { THROW_EXCEPTION(RaidFileException, OSError) } @@ -422,13 +388,13 @@ void RaidFileWrite::TransformToRaidStorage() try { #if HAVE_DECL_O_EXLOCK - FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_EXLOCK | O_BINARY)> stripe1(stripe1FilenameW.c_str()); - FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_EXLOCK | O_BINARY)> stripe2(stripe2FilenameW.c_str()); - FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_EXLOCK | O_BINARY)> parity(parityFilenameW.c_str()); + FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_EXLOCK)> stripe1(stripe1FilenameW.c_str()); + FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_EXLOCK)> stripe2(stripe2FilenameW.c_str()); + FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_EXLOCK)> parity(parityFilenameW.c_str()); #else - FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_BINARY)> stripe1(stripe1FilenameW.c_str()); - FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_BINARY)> stripe2(stripe2FilenameW.c_str()); - FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_BINARY)> parity(parityFilenameW.c_str()); + FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL)> stripe1(stripe1FilenameW.c_str()); + FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL)> stripe2(stripe2FilenameW.c_str()); + FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL)> parity(parityFilenameW.c_str()); #endif // Then... read in data... @@ -564,21 +530,6 @@ void RaidFileWrite::TransformToRaidStorage() parity.Close(); stripe2.Close(); stripe1.Close(); - -#ifdef WIN32 - // Must delete before renaming - #define CHECK_UNLINK(file) \ - { \ - if (::unlink(file) != 0 && errno != ENOENT) \ - { \ - THROW_EXCEPTION(RaidFileException, OSError); \ - } \ - } - CHECK_UNLINK(stripe1Filename.c_str()); - CHECK_UNLINK(stripe2Filename.c_str()); - CHECK_UNLINK(parityFilename.c_str()); - #undef CHECK_UNLINK -#endif // Rename them into place if(::rename(stripe1FilenameW.c_str(), stripe1Filename.c_str()) != 0 |