added 2 changesets to branch 'refs/remotes/pdziepak-github/nfs4' old head: 8837efd0253fd668a6879552977ced39d7eb7a15 new head: 345a659337ba627af5d67f2064ce7a2746c28f0c overview: https://github.com/pdziepak/Haiku/compare/8837efd...345a659 ---------------------------------------------------------------------------- 47e68f1: nfs4: Avoid conflicts between threads attempting to repair TCP connection 345a659: nfs4: Do not create new Inode object when deleting a vnode [ Pawel Dziepak <pdziepak@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- 4 files changed, 30 insertions(+), 5 deletions(-) src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp | 16 +++++++++++++++- src/add-ons/kernel/file_systems/nfs4/RPCServer.h | 3 +++ src/add-ons/kernel/file_systems/nfs4/VnodeToInode.h | 12 ++++++++++-- .../kernel/file_systems/nfs4/kernel_interface.cpp | 4 ++-- ############################################################################ Commit: 47e68f1c7a5b558ed3b5df3a5db540b91bc5140a Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Wed Jan 2 19:17:57 2013 UTC nfs4: Avoid conflicts between threads attempting to repair TCP connection ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp index a8ae352..7ce3145 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp @@ -81,12 +81,14 @@ Server::Server(Connection* connection, PeerAddress* address) fAddress(address), fPrivateData(NULL), fCallback(NULL), + fRepairCount(0), fXID(rand() << 1) { ASSERT(connection != NULL); ASSERT(address != NULL); mutex_init(&fCallbackLock, NULL); + mutex_init(&fRepairLock, NULL); _StartListening(); } @@ -98,6 +100,7 @@ Server::~Server() gRPCCallbackServer->UnregisterCallback(fCallback); delete fCallback; mutex_destroy(&fCallbackLock); + mutex_destroy(&fRepairLock); delete fPrivateData; @@ -229,6 +232,12 @@ Server::WakeCall(Request* request) status_t Server::Repair() { + uint32 thisRepair = fRepairCount; + + MutexLocker _(fRepairLock); + if (fRepairCount == thisRepair) + return B_OK; + fThreadCancel = true; status_t result = fConnection->Reconnect(); @@ -236,7 +245,12 @@ Server::Repair() return result; wait_for_thread(fThread, &result); - return _StartListening(); + result = _StartListening(); + + if (result == B_OK) + fRepairCount++; + + return result; } diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCServer.h b/src/add-ons/kernel/file_systems/nfs4/RPCServer.h index 5ba84ec..8a6369b 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCServer.h +++ b/src/add-ons/kernel/file_systems/nfs4/RPCServer.h @@ -103,6 +103,9 @@ private: mutex fCallbackLock; Callback* fCallback; + uint32 fRepairCount; + mutex fRepairLock; + vint32 fXID; static const bigtime_t kWaitTime = 1000000; }; ############################################################################ Commit: 345a659337ba627af5d67f2064ce7a2746c28f0c Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Wed Jan 2 19:18:32 2013 UTC nfs4: Do not create new Inode object when deleting a vnode ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.h b/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.h index f0a39e7..e01db01 100644 --- a/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.h +++ b/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.h @@ -23,13 +23,14 @@ public: inline void Lock(); inline void Unlock(); + inline Inode* GetPointer() const; Inode* Get(); void Replace(Inode* newInode); inline void Remove(); inline void Clear(); - inline ino_t ID(); + inline ino_t ID() const; private: ino_t fID; rw_lock fLock; @@ -105,8 +106,15 @@ VnodeToInode::Clear() } +inline Inode* +VnodeToInode::GetPointer() const +{ + return fInode; +} + + inline ino_t -VnodeToInode::ID() +VnodeToInode::ID() const { return fID; } diff --git a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp index 546aa02..2933d2a 100644 --- a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp @@ -339,10 +339,10 @@ nfs4_remove_vnode(fs_volume* volume, fs_vnode* vnode, bool reenter) VnodeToInode* vti = reinterpret_cast<VnodeToInode*>(vnode->private_node); TRACE("volume = %p, vnode = %llu", volume, vti->ID()); - if (fs->Root() == vti->Get()) + if (fs->Root() == vti->GetPointer()) return B_OK; - ASSERT(vti->Get() == NULL); + ASSERT(vti->GetPointer() == NULL); delete vti; return B_OK;