diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp index a8ae352370..7ce3145117 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 5ba84ec5c8..8a6369b4f9 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; };