diff --git a/src/add-ons/kernel/file_systems/nfs4/FileSystem.h b/src/add-ons/kernel/file_systems/nfs4/FileSystem.h index 67e39967d4..87fa4b9fb0 100644 --- a/src/add-ons/kernel/file_systems/nfs4/FileSystem.h +++ b/src/add-ons/kernel/file_systems/nfs4/FileSystem.h @@ -19,11 +19,12 @@ class Inode; class RootInode; struct MountConfiguration { - bool fHard; - int fRetryLimit; + bool fHard; + int fRetryLimit; + bigtime_t fRequestTimeout; - bool fEmulateNamedAttrs; - bool fCacheMetadata; + bool fEmulateNamedAttrs; + bool fCacheMetadata; }; class FileSystem : public DoublyLinkedListLinkImpl { diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp index 7ce3145117..1b7ac54de5 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp @@ -134,29 +134,6 @@ Server::_StartListening() } -status_t -Server::SendCall(Call* call, Reply** reply) -{ - ASSERT(call != NULL); - ASSERT(reply != NULL); - - Request* req; - status_t result = SendCallAsync(call, reply, &req); - if (result != B_OK) - return result; - - result = WaitCall(req); - if (result != B_OK) { - CancelCall(req); - delete req; - return result; - } - - delete req; - return B_OK; -} - - status_t Server::SendCallAsync(Call* call, Reply** reply, Request** request) { diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCServer.h b/src/add-ons/kernel/file_systems/nfs4/RPCServer.h index 8a6369b4f9..738162d92f 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCServer.h +++ b/src/add-ons/kernel/file_systems/nfs4/RPCServer.h @@ -60,15 +60,13 @@ public: PeerAddress* address); virtual ~Server(); - status_t SendCall(Call* call, Reply** reply); - status_t SendCallAsync(Call* call, Reply** reply, Request** request); status_t ResendCallAsync(Call* call, Request* request); inline status_t WaitCall(Request* request, - bigtime_t time = kWaitTime); + bigtime_t time); inline status_t CancelCall(Request* request); status_t WakeCall(Request* request); @@ -107,7 +105,6 @@ private: mutex fRepairLock; vint32 fXID; - static const bigtime_t kWaitTime = 1000000; }; diff --git a/src/add-ons/kernel/file_systems/nfs4/Request.cpp b/src/add-ons/kernel/file_systems/nfs4/Request.cpp index b4c4e43c24..b92d52898f 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Request.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Request.cpp @@ -45,7 +45,8 @@ Request::_SendUDP(Cookie* cookie) hard = fFileSystem->GetConfiguration().fHard; } - result = fServer->WaitCall(rpc); + result = fServer->WaitCall(rpc, + fFileSystem->GetConfiguration().fRequestTimeout); if (result != B_OK) { int attempts = 1; while (result != B_OK && (hard || attempts++ < retryLimit)) { @@ -56,7 +57,8 @@ Request::_SendUDP(Cookie* cookie) return result; } - result = fServer->WaitCall(rpc); + result = fServer->WaitCall(rpc, + fFileSystem->GetConfiguration().fRequestTimeout); } if (result != B_OK) { @@ -113,7 +115,8 @@ Request::_SendTCP(Cookie* cookie) if (cookie != NULL) cookie->RegisterRequest(rpc); - result = fServer->WaitCall(rpc); + result = fServer->WaitCall(rpc, + fFileSystem->GetConfiguration().fRequestTimeout); if (result != B_OK) { if (cookie != NULL) cookie->UnregisterRequest(rpc); 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 abc4607ea4..af25fde721 100644 --- a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp @@ -63,6 +63,7 @@ CreateNFS4Server(RPC::Server* serv) // Available options: // hard - retry requests until success // soft - retry requests no more than retrans times (default) +// timeo=X - request time limit before next retransmission (default: 60s) // retrans=X - retry requests X times (default: 5) // ac - use metadata cache (default) // noac - do not use metadata cache @@ -101,6 +102,7 @@ ParseArguments(const char* _args, PeerAddress* address, char** _path, conf->fHard = false; conf->fRetryLimit = 5; + conf->fRequestTimeout = sSecToBigTime(60); conf->fEmulateNamedAttrs = false; conf->fCacheMetadata = true; @@ -116,6 +118,9 @@ ParseArguments(const char* _args, PeerAddress* address, char** _path, else if (strncmp(options, "retrans=", 8) == 0) { options += strlen("retrans="); conf->fRetryLimit = atoi(options); + } else if (strncmp(options, "timeo=", 6) == 0) { + options += strlen("timeo="); + conf->fRequestTimeout = atoi(options); } else if (strcmp(options, "noac") == 0) conf->fCacheMetadata = false; else if (strcmp(options, "xattr-emu") == 0)