From 2431c4521c4e3a2fb15d3440ee10ebc68c081bce Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Thu, 9 Aug 2012 17:18:41 +0200 Subject: [PATCH] nfs4: Make idmapper initialization lazy --- .../kernel/file_systems/nfs4/IdMap.cpp | 3 ++- src/add-ons/kernel/file_systems/nfs4/IdMap.h | 1 + .../file_systems/nfs4/kernel_interface.cpp | 19 ++++++++++++------- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/add-ons/kernel/file_systems/nfs4/IdMap.cpp b/src/add-ons/kernel/file_systems/nfs4/IdMap.cpp index b53cbe9787..3a87315fb5 100644 --- a/src/add-ons/kernel/file_systems/nfs4/IdMap.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/IdMap.cpp @@ -16,7 +16,8 @@ #include "idmapper/IdMapper.h" -IdMap* gIdMapper = NULL; +IdMap* gIdMapper = NULL; +mutex gIdMapperLock; IdMap::IdMap() diff --git a/src/add-ons/kernel/file_systems/nfs4/IdMap.h b/src/add-ons/kernel/file_systems/nfs4/IdMap.h index 266bef6366..318f6dd777 100644 --- a/src/add-ons/kernel/file_systems/nfs4/IdMap.h +++ b/src/add-ons/kernel/file_systems/nfs4/IdMap.h @@ -41,6 +41,7 @@ private: }; extern IdMap* gIdMapper; +extern mutex gIdMapperLock; #endif // IDMAP_H 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 d62a9a4e98..17e1d7c8f5 100644 --- a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp @@ -76,6 +76,12 @@ nfs4_mount(fs_volume* volume, const char* device, uint32 flags, { status_t result; + MutexLocker locker(gIdMapperLock); + gIdMapper = new(std::nothrow) IdMap; + if (gIdMapper == NULL) + return B_NO_MEMORY; + locker.Unlock(); + ServerAddress address; char path[256]; result = ParseArguments(args, &address, path); @@ -706,23 +712,20 @@ nfs4_init() if (gRPCServerManager == NULL) return B_NO_MEMORY; - gIdMapper = new(std::nothrow) IdMap; - if (gIdMapper == NULL) { - delete gRPCServerManager; - return B_NO_MEMORY; - } + mutex_init(&gIdMapperLock, "idmapper Init Lock"); + gIdMapper = NULL; gWorkQueue = new(std::nothrow) WorkQueue; if (gWorkQueue == NULL || gWorkQueue->InitStatus() != B_OK) { delete gWorkQueue; - delete gIdMapper; + mutex_destroy(&gIdMapperLock); delete gRPCServerManager; return B_NO_MEMORY; } gRPCCallbackServer = new(std::nothrow) RPC::CallbackServer; if (gRPCCallbackServer == NULL) { - delete gIdMapper; + mutex_destroy(&gIdMapperLock); delete gWorkQueue; delete gRPCServerManager; return B_NO_MEMORY; @@ -742,6 +745,8 @@ nfs4_uninit() delete gWorkQueue; delete gRPCServerManager; + mutex_destroy(&gIdMapperLock); + return B_OK; }