diff --git a/src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp b/src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp index 9379f3e638..ecc56b28db 100644 --- a/src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp @@ -311,11 +311,28 @@ FileSystem::RemoveOpenFile(OpenState* state) } +DoublyLinkedList& +FileSystem::DelegationsLock() +{ + mutex_lock(&fDelegationLock); + return fDelegationList; +} + + +void +FileSystem::DelegationsUnlock() +{ + mutex_unlock(&fDelegationLock); +} + + void FileSystem::AddDelegation(Delegation* delegation) { MutexLocker _(fDelegationLock); + fDelegationList.InsertBefore(fDelegationList.Head(), delegation); + fHandleToDelegation.Remove(delegation->fInfo.fHandle); fHandleToDelegation.Insert(delegation->fInfo.fHandle, delegation); @@ -328,6 +345,7 @@ FileSystem::RemoveDelegation(Delegation* delegation) { MutexLocker _(fDelegationLock); + fDelegationList.Remove(delegation); fHandleToDelegation.Remove(delegation->fInfo.fHandle); NFSServer()->DecUsage(); diff --git a/src/add-ons/kernel/file_systems/nfs4/FileSystem.h b/src/add-ons/kernel/file_systems/nfs4/FileSystem.h index 0bd634dd6e..adfea0a294 100644 --- a/src/add-ons/kernel/file_systems/nfs4/FileSystem.h +++ b/src/add-ons/kernel/file_systems/nfs4/FileSystem.h @@ -36,6 +36,8 @@ public: void AddOpenFile(OpenState* state); void RemoveOpenFile(OpenState* state); + DoublyLinkedList& DelegationsLock(); + void DelegationsUnlock(); void AddDelegation(Delegation* delegation); void RemoveDelegation(Delegation* delegation); Delegation* GetDelegation(const FileHandle& handle); @@ -68,6 +70,7 @@ private: CacheRevalidator fCacheRevalidator; mutex fDelegationLock; + DoublyLinkedList fDelegationList; AVLTreeMap fHandleToDelegation; OpenState* fOpenFiles; diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp b/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp index 9ea450b910..9dea65cc9a 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Server.cpp @@ -346,26 +346,26 @@ NFS4Server::CallbackRecall(RequestInterpreter* request, ReplyBuilder* reply) status_t NFS4Server::RecallAll() { -#if 0 - MutexLocker locker(fFSLock); + MutexLocker _(fFSLock); + FileSystem* fs = fFileSystems; + while (fs != NULL) { + DoublyLinkedList& list = fs->DelegationsLock(); + DoublyLinkedList::Iterator iterator = list.GetIterator(); - Delegation* delegation = NULL; - FileSystem* current = fFileSystems; - while (current != NULL) { - delegation = current->GetDelegation(handle); - if (delegation != NULL) - break; + Delegation* current = iterator.Next(); + while (current != NULL) { + DelegationRecallArgs* args = new(std::nothrow) DelegationRecallArgs; + args->fDelegation = current; + args->fTruncate = false; + gWorkQueue->EnqueueJob(DelegationRecall, args); - current = current->fNext; + current = iterator.Next(); + } + fs->DelegationsUnlock(); + + fs = fs->fNext; } - locker.Unlock(); - DelegationRecallArgs args = new(std::nothrow) DelegationRecallArgs; - DelegationRecallArgs* args; - args->fDelegation = delegation; - args->fTruncate = truncate; - gWorkQueue->EnqueueJob(DelegationRecall, args); -#endif return B_OK; }