added 3 changesets to branch 'refs/remotes/pdziepak-github/nfs4' old head: bd19f23cecd6d1d73affbcd0c71fa1275eb17b73 new head: 9c1d983eab87868914f3d1621fc028b883901cd5 overview: https://github.com/pdziepak/Haiku/compare/bd19f23...9c1d983 ---------------------------------------------------------------------------- 9f12d13: nfs4: Prevent OpenState::_ReclaimLocks from being called recursively When server reboots again when share reservations or locks are being reclaimed there is a risk that HandleErrors will invoke Reclaim(( again making it crash due to some double locks and more importantly making these two attempts to reclaim resources conflict and cause some much harder to recover from server errors. Instead all that, when server is rebooted again while recovering from previous reboot the recovery is aborted, the client retries its original request and then proper recovery occurs completly on a new server instance. 2d96a2b: nfs4: Minor improvements to memory deallocation in few places 9c1d983: nfs4: Avoid using empty string for RootInode name [ Pawel Dziepak <pdziepak@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- 5 files changed, 29 insertions(+), 19 deletions(-) src/add-ons/kernel/file_systems/nfs4/Connection.cpp | 12 +++++------- src/add-ons/kernel/file_systems/nfs4/FileInfo.cpp | 7 +++---- src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp | 10 +++++++++- src/add-ons/kernel/file_systems/nfs4/IdMap.cpp | 9 ++++----- src/add-ons/kernel/file_systems/nfs4/OpenState.cpp | 10 ++++++++-- ############################################################################ Commit: 9f12d1353a279af30633d591d85733b8f44257c0 Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Tue Jan 8 22:03:51 2013 UTC nfs4: Prevent OpenState::_ReclaimLocks from being called recursively When server reboots again when share reservations or locks are being reclaimed there is a risk that HandleErrors will invoke Reclaim(( again making it crash due to some double locks and more importantly making these two attempts to reclaim resources conflict and cause some much harder to recover from server errors. Instead all that, when server is rebooted again while recovering from previous reboot the recovery is aborted, the client retries its original request and then proper recovery occurs completly on a new server instance. ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/OpenState.cpp b/src/add-ons/kernel/file_systems/nfs4/OpenState.cpp index 7ae795e..21ac8d5 100644 --- a/src/add-ons/kernel/file_systems/nfs4/OpenState.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/OpenState.cpp @@ -186,8 +186,10 @@ OpenState::_ReclaimOpen(uint64 newClientID) sequence += IncrementSequence(reply.NFS4Error()); - if (HandleErrors(reply.NFS4Error(), server, NULL, NULL, &sequence)) + if (reply.NFS4Error() != NFS4ERR_STALE_CLIENTID + && HandleErrors(reply.NFS4Error(), server, NULL, NULL, &sequence)) { continue; + } reply.PutFH(); @@ -250,8 +252,12 @@ OpenState::_ReclaimLocks(uint64 newClientID) sequence += IncrementSequence(reply.NFS4Error()); - if (HandleErrors(reply.NFS4Error(), server, NULL, NULL, &sequence)) + if (reply.NFS4Error() != NFS4ERR_STALE_CLIENTID + && reply.NFS4Error() != NFS4ERR_STALE_STATEID + && HandleErrors(reply.NFS4Error(), server, NULL, NULL, + &sequence)) { continue; + } reply.PutFH(); reply.Lock(linfo); ############################################################################ Commit: 2d96a2b3038c96550dc94f43c7cc8f2ad06944ab Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Tue Jan 8 22:46:04 2013 UTC nfs4: Minor improvements to memory deallocation in few places ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/Connection.cpp b/src/add-ons/kernel/file_systems/nfs4/Connection.cpp index e38953a..371cc39 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Connection.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Connection.cpp @@ -411,6 +411,7 @@ ConnectionStream::Receive(void** _buffer, uint32* _size) return B_NO_MEMORY; } else buffer = ptr; + MemoryDeleter bufferDeleter(buffer); received = 0; do { @@ -418,15 +419,12 @@ ConnectionStream::Receive(void** _buffer, uint32* _size) record_size - received, 0); received += result; } while (result > 0 && received < record_size); - if (result < 0) { - result = errno; - free(buffer); - return result; - } else if (result == 0) { - free(buffer); + if (result < 0) + return errno; + else if (result == 0) return ECONNABORTED; - } + bufferDeleter.Detach(); size += record_size; } while (!last_one); diff --git a/src/add-ons/kernel/file_systems/nfs4/FileInfo.cpp b/src/add-ons/kernel/file_systems/nfs4/FileInfo.cpp index 1a1edf3..6a208c1 100644 --- a/src/add-ons/kernel/file_systems/nfs4/FileInfo.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/FileInfo.cpp @@ -58,6 +58,8 @@ FileInfo::CreateName(const char* dirPath, const char* name) if (fName == NULL) return B_NO_MEMORY; + free(const_cast<char*>(fPath)); + fPath = NULL; if (dirPath != NULL) { char* path = reinterpret_cast<char*>(malloc(strlen(name) + 2 + strlen(dirPath))); @@ -68,12 +70,9 @@ FileInfo::CreateName(const char* dirPath, const char* name) strcat(path, "/"); strcat(path, name); - free(const_cast<char*>(fPath)); fPath = path; - } else { - free(const_cast<char*>(fPath)); + } else fPath = strdup(name); - } if (fPath == NULL) return B_NO_MEMORY; diff --git a/src/add-ons/kernel/file_systems/nfs4/IdMap.cpp b/src/add-ons/kernel/file_systems/nfs4/IdMap.cpp index 146b077..a779469 100644 --- a/src/add-ons/kernel/file_systems/nfs4/IdMap.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/IdMap.cpp @@ -9,6 +9,7 @@ #include "IdMap.h" +#include <AutoDeleter.h> #include <FindDirectory.h> #include <team.h> #include <util/AutoLock.h> @@ -122,21 +123,19 @@ IdMap::_GetBuffer(T value, int32 code) void* buffer = malloc(size); if (buffer == NULL) return NULL; + MemoryDeleter bufferDeleter(buffer); size = read_port(fReplyPort, &code, buffer, size); if (size < B_OK) { - free(buffer); - if (_Repair() != B_OK) return 0; continue; } - if (code != MsgReply) { - free(buffer); + if (code != MsgReply) return NULL; - } + bufferDeleter.Detach(); return buffer; } while (true); } ############################################################################ Commit: 9c1d983eab87868914f3d1621fc028b883901cd5 Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Tue Jan 8 22:57:24 2013 UTC nfs4: Avoid using empty string for RootInode name ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp b/src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp index 1b6031c..1d3d096 100644 --- a/src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp @@ -190,8 +190,16 @@ FileSystem::Mount(FileSystem** _fs, RPC::Server* serv, const char* fsPath, if (name != NULL) { name++; reinterpret_cast<RootInode*>(inode)->SetName(name); - } else + } else if (fsPath[0] != '\0') reinterpret_cast<RootInode*>(inode)->SetName(fsPath); + else { + char* address = serv->ID().UniversalAddress(); + if (address != NULL) + reinterpret_cast<RootInode*>(inode)->SetName(address); + else + reinterpret_cast<RootInode*>(inode)->SetName("NFS4 Share"); + free(address); + } fs->fRoot = reinterpret_cast<RootInode*>(inode);