added 1 changeset to branch 'refs/remotes/pdziepak-github/nfs4' old head: ce851e2bac9dba986b6e4243e4cccd6f4e59380c new head: 15a18a6b891de5945e958b4de54c0fbb462bc5fa overview: https://github.com/pdziepak/Haiku/compare/ce851e2...15a18a6 ---------------------------------------------------------------------------- 15a18a6: nfs4: Fix write commit race condition [ Pawel Dziepak <pdziepak@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- Commit: 15a18a6b891de5945e958b4de54c0fbb462bc5fa Author: Pawel Dziepak <pdziepak@xxxxxxxxxxx> Date: Thu Jan 17 02:54:33 2013 UTC ---------------------------------------------------------------------------- 3 files changed, 12 insertions(+), 4 deletions(-) src/add-ons/kernel/file_systems/nfs4/Inode.cpp | 6 +++++- src/add-ons/kernel/file_systems/nfs4/Inode.h | 1 + src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp | 9 ++++++--- ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp index e2f3241..fe3d60d 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp @@ -37,6 +37,7 @@ Inode::Inode() rw_lock_init(&fDelegationLock, NULL); mutex_init(&fStateLock, NULL); mutex_init(&fFileCacheLock, NULL); + rw_lock_init(&fWriteLock, NULL); mutex_init(&fAIOLock, NULL); } @@ -147,6 +148,7 @@ Inode::~Inode() mutex_destroy(&fStateLock); mutex_destroy(&fFileCacheLock); rw_lock_destroy(&fDelegationLock); + rw_lock_destroy(&fWriteLock); ASSERT(fAIOCount == 0); } @@ -938,8 +940,10 @@ Inode::ReleaseOpenState() { ASSERT(fOpenState != NULL); - if (fOpenState->ReleaseReference() == 1) + if (fOpenState->ReleaseReference() == 1) { + ASSERT(fAIOCount == 0); fOpenState = NULL; + } } diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.h b/src/add-ons/kernel/file_systems/nfs4/Inode.h index 6fd5d77..0c5e844 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.h +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.h @@ -161,6 +161,7 @@ private: OpenState* fOpenState; mutex fStateLock; + rw_lock fWriteLock; bool fWriteDirty; sem_id fAIOWait; diff --git a/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp b/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp index be6f926..9748274 100644 --- a/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/InodeRegular.cpp @@ -36,8 +36,6 @@ Inode::CreateState(const char* name, int mode, int perms, OpenState* state, if (result != B_OK) return result; - RevalidateFileCache(); - FileInfo fi; fi.fFileId = fileID; fi.fHandle = handle; @@ -186,6 +184,7 @@ status_t Inode::Close(OpenFileCookie* cookie) { ASSERT(cookie != NULL); + ASSERT(fOpenState == cookie->fOpenState); SyncAndCommit(); @@ -371,8 +370,10 @@ Inode::WriteDirect(OpenStateCookie* cookie, off_t pos, const void* _buffer, state = cookie->fOpenState; } - if (!attribute) + if (!attribute) { + ReadLocker _(fWriteLock); fWriteDirty = true; + } while (size < *_length) { uint32 len = *_length - size; @@ -432,6 +433,8 @@ Inode::Write(OpenFileCookie* cookie, off_t pos, const void* _buffer, status_t Inode::Commit() { + WriteLocker _(fWriteLock); + if (!fWriteDirty) return B_OK; status_t result = CommitWrites();