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

  • From: pdziepak-github.nfs4 <community@xxxxxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 2 Jan 2013 20:30:51 +0100 (CET)

added 2 changesets to branch 'refs/remotes/pdziepak-github/nfs4'
old head: 8837efd0253fd668a6879552977ced39d7eb7a15
new head: 345a659337ba627af5d67f2064ce7a2746c28f0c
overview: https://github.com/pdziepak/Haiku/compare/8837efd...345a659

----------------------------------------------------------------------------

47e68f1: nfs4: Avoid conflicts between threads attempting to repair TCP 
connection

345a659: nfs4: Do not create new Inode object when deleting a vnode

                                    [ Pawel Dziepak <pdziepak@xxxxxxxxxxx> ]

----------------------------------------------------------------------------

4 files changed, 30 insertions(+), 5 deletions(-)
src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp   | 16 +++++++++++++++-
src/add-ons/kernel/file_systems/nfs4/RPCServer.h     |  3 +++
src/add-ons/kernel/file_systems/nfs4/VnodeToInode.h  | 12 ++++++++++--
.../kernel/file_systems/nfs4/kernel_interface.cpp    |  4 ++--

############################################################################

Commit:      47e68f1c7a5b558ed3b5df3a5db540b91bc5140a
Author:      Pawel Dziepak <pdziepak@xxxxxxxxxxx>
Date:        Wed Jan  2 19:17:57 2013 UTC

nfs4: Avoid conflicts between threads attempting to repair TCP connection

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp 
b/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp
index a8ae352..7ce3145 100644
--- a/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/RPCServer.cpp
@@ -81,12 +81,14 @@ Server::Server(Connection* connection, PeerAddress* address)
        fAddress(address),
        fPrivateData(NULL),
        fCallback(NULL),
+       fRepairCount(0),
        fXID(rand() << 1)
 {
        ASSERT(connection != NULL);
        ASSERT(address != NULL);
 
        mutex_init(&fCallbackLock, NULL);
+       mutex_init(&fRepairLock, NULL);
 
        _StartListening();
 }
@@ -98,6 +100,7 @@ Server::~Server()
                gRPCCallbackServer->UnregisterCallback(fCallback);
        delete fCallback;
        mutex_destroy(&fCallbackLock);
+       mutex_destroy(&fRepairLock);
 
        delete fPrivateData;
 
@@ -229,6 +232,12 @@ Server::WakeCall(Request* request)
 status_t
 Server::Repair()
 {
+       uint32 thisRepair = fRepairCount;
+
+       MutexLocker _(fRepairLock);
+       if (fRepairCount == thisRepair)
+               return B_OK;
+
        fThreadCancel = true;
 
        status_t result = fConnection->Reconnect();
@@ -236,7 +245,12 @@ Server::Repair()
                return result;
 
        wait_for_thread(fThread, &result);
-       return _StartListening();
+       result = _StartListening();
+
+       if (result == B_OK)
+               fRepairCount++;
+
+       return result;
 }
 
 
diff --git a/src/add-ons/kernel/file_systems/nfs4/RPCServer.h 
b/src/add-ons/kernel/file_systems/nfs4/RPCServer.h
index 5ba84ec..8a6369b 100644
--- a/src/add-ons/kernel/file_systems/nfs4/RPCServer.h
+++ b/src/add-ons/kernel/file_systems/nfs4/RPCServer.h
@@ -103,6 +103,9 @@ private:
                        mutex                                   fCallbackLock;
                        Callback*                               fCallback;
 
+                       uint32                                  fRepairCount;
+                       mutex                                   fRepairLock;
+
                        vint32                                  fXID;
        static  const bigtime_t                 kWaitTime       = 1000000;
 };

############################################################################

Commit:      345a659337ba627af5d67f2064ce7a2746c28f0c
Author:      Pawel Dziepak <pdziepak@xxxxxxxxxxx>
Date:        Wed Jan  2 19:18:32 2013 UTC

nfs4: Do not create new Inode object when deleting a vnode

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.h 
b/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.h
index f0a39e7..e01db01 100644
--- a/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.h
+++ b/src/add-ons/kernel/file_systems/nfs4/VnodeToInode.h
@@ -23,13 +23,14 @@ public:
        inline  void            Lock();
        inline  void            Unlock();
 
+       inline  Inode*          GetPointer() const;
                        Inode*          Get();
                        void            Replace(Inode* newInode);
 
        inline  void            Remove();
        inline  void            Clear();
 
-       inline  ino_t           ID();
+       inline  ino_t           ID() const;
 private:
                        ino_t           fID;
                        rw_lock         fLock;
@@ -105,8 +106,15 @@ VnodeToInode::Clear()
 }
 
 
+inline Inode*
+VnodeToInode::GetPointer() const
+{
+       return fInode;
+}
+
+
 inline ino_t
-VnodeToInode::ID()
+VnodeToInode::ID() const
 {
        return fID;
 }
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 546aa02..2933d2a 100644
--- a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp
@@ -339,10 +339,10 @@ nfs4_remove_vnode(fs_volume* volume, fs_vnode* vnode, 
bool reenter)
        VnodeToInode* vti = 
reinterpret_cast<VnodeToInode*>(vnode->private_node);
        TRACE("volume = %p, vnode = %llu", volume, vti->ID());
 
-       if (fs->Root() == vti->Get())
+       if (fs->Root() == vti->GetPointer())
                return B_OK;
 
-       ASSERT(vti->Get() == NULL);
+       ASSERT(vti->GetPointer() == NULL);
        delete vti;
 
        return B_OK;


Other related posts: