diff --git a/src/add-ons/kernel/file_systems/nfs4/Connection.cpp b/src/add-ons/kernel/file_systems/nfs4/Connection.cpp index 322ef47a7c..cc4611b9d8 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Connection.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Connection.cpp @@ -163,7 +163,7 @@ ServerAddress::InAddr() const status_t ServerAddress::ResolveName(const char* name, ServerAddress* address) { - address->fProtocol = IPPROTO_UDP; + address->fProtocol = IPPROTO_TCP; // getaddrinfo() is very expensive when called from kernel, so we do not // want to call it unless there is no other choice. diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp index 54fd3d346f..4039c08496 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.cpp @@ -143,6 +143,10 @@ CallbackServer::StopServer() ConnectionEntry* entry = fConnectionList; fConnectionList = entry->fNext; entry->fConnection->Disconnect(); + + status_t result; + wait_for_thread(entry->fThread, &result); + delete entry->fConnection; delete entry; } @@ -163,6 +167,8 @@ CallbackServer::NewConnection(Connection* connection) MutexLocker locker(fConnectionLock); entry->fNext = fConnectionList; + if (fConnectionList != NULL) + fConnectionList->fPrev = entry; fConnectionList = entry; locker.Unlock(); @@ -177,13 +183,17 @@ CallbackServer::NewConnection(Connection* connection) thread = spawn_kernel_thread(&CallbackServer::ConnectionThreadLauncher, "NFSv4 Callback Connection", B_NORMAL_PRIORITY, arguments); if (thread < B_OK) { + ReleaseConnection(entry); free(arguments); return thread; } + entry->fThread = thread; + status_t result = resume_thread(thread); if (result != B_OK) { kill_thread(thread); + ReleaseConnection(entry); free(arguments); return result; } @@ -232,7 +242,8 @@ CallbackServer::ConnectionThread(ConnectionEntry* entry) void* buffer; status_t result = connection->Receive(&buffer, &size); if (result != B_OK) { - ReleaseConnection(entry); + if (result != ECONNABORTED) + ReleaseConnection(entry); return result; } diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.h b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.h index 9b22f20e05..d114c652de 100644 --- a/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.h +++ b/src/add-ons/kernel/file_systems/nfs4/RPCCallbackServer.h @@ -20,6 +20,8 @@ class Callback; struct ConnectionEntry { Connection* fConnection; + thread_id fThread; + ConnectionEntry* fNext; ConnectionEntry* fPrev; };