[haiku-commits] BRANCH pdziepak-github.nfs4 - src/add-ons/kernel/file_systems/nfs4

  • From: pdziepak-github.nfs4 <community@xxxxxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 17 Jan 2013 04:00:57 +0100 (CET)

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();


Other related posts: