[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, 9 Jan 2013 00:16:26 +0100 (CET)

added 3 changesets to branch 'refs/remotes/pdziepak-github/nfs4'
old head: bd19f23cecd6d1d73affbcd0c71fa1275eb17b73
new head: 9c1d983eab87868914f3d1621fc028b883901cd5
overview: https://github.com/pdziepak/Haiku/compare/bd19f23...9c1d983

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

9f12d13: nfs4: Prevent OpenState::_ReclaimLocks from being called recursively
  
  When server reboots again when share reservations or locks are being
  reclaimed there is a risk that HandleErrors will invoke Reclaim(( again
  making it crash due to some double locks and more importantly making
  these two attempts to reclaim resources conflict and cause some much harder
  to recover from server errors.
  
  Instead all that, when server is rebooted again while recovering from previous
  reboot the recovery is aborted, the client retries its original request and
  then proper recovery occurs completly on a new server instance.

2d96a2b: nfs4: Minor improvements to memory deallocation in few places

9c1d983: nfs4: Avoid using empty string for RootInode name

                                    [ Pawel Dziepak <pdziepak@xxxxxxxxxxx> ]

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

5 files changed, 29 insertions(+), 19 deletions(-)
src/add-ons/kernel/file_systems/nfs4/Connection.cpp | 12 +++++-------
src/add-ons/kernel/file_systems/nfs4/FileInfo.cpp   |  7 +++----
src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp | 10 +++++++++-
src/add-ons/kernel/file_systems/nfs4/IdMap.cpp      |  9 ++++-----
src/add-ons/kernel/file_systems/nfs4/OpenState.cpp  | 10 ++++++++--

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

Commit:      9f12d1353a279af30633d591d85733b8f44257c0
Author:      Pawel Dziepak <pdziepak@xxxxxxxxxxx>
Date:        Tue Jan  8 22:03:51 2013 UTC

nfs4: Prevent OpenState::_ReclaimLocks from being called recursively

When server reboots again when share reservations or locks are being
reclaimed there is a risk that HandleErrors will invoke Reclaim(( again
making it crash due to some double locks and more importantly making
these two attempts to reclaim resources conflict and cause some much harder
to recover from server errors.

Instead all that, when server is rebooted again while recovering from previous
reboot the recovery is aborted, the client retries its original request and
then proper recovery occurs completly on a new server instance.

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

diff --git a/src/add-ons/kernel/file_systems/nfs4/OpenState.cpp 
b/src/add-ons/kernel/file_systems/nfs4/OpenState.cpp
index 7ae795e..21ac8d5 100644
--- a/src/add-ons/kernel/file_systems/nfs4/OpenState.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/OpenState.cpp
@@ -186,8 +186,10 @@ OpenState::_ReclaimOpen(uint64 newClientID)
 
                sequence += IncrementSequence(reply.NFS4Error());
 
-               if (HandleErrors(reply.NFS4Error(), server, NULL, NULL, 
&sequence))
+               if (reply.NFS4Error() != NFS4ERR_STALE_CLIENTID
+                       && HandleErrors(reply.NFS4Error(), server, NULL, NULL, 
&sequence)) {
                        continue;
+               }
 
                reply.PutFH();
 
@@ -250,8 +252,12 @@ OpenState::_ReclaimLocks(uint64 newClientID)
 
                        sequence += IncrementSequence(reply.NFS4Error());
 
-                       if (HandleErrors(reply.NFS4Error(), server, NULL, NULL, 
&sequence))
+                       if (reply.NFS4Error() != NFS4ERR_STALE_CLIENTID
+                               && reply.NFS4Error() !=  NFS4ERR_STALE_STATEID
+                               && HandleErrors(reply.NFS4Error(), server, 
NULL, NULL,
+                                       &sequence)) {
                                continue;
+                       }
 
                        reply.PutFH();
                        reply.Lock(linfo);

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

Commit:      2d96a2b3038c96550dc94f43c7cc8f2ad06944ab
Author:      Pawel Dziepak <pdziepak@xxxxxxxxxxx>
Date:        Tue Jan  8 22:46:04 2013 UTC

nfs4: Minor improvements to memory deallocation in few places

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

diff --git a/src/add-ons/kernel/file_systems/nfs4/Connection.cpp 
b/src/add-ons/kernel/file_systems/nfs4/Connection.cpp
index e38953a..371cc39 100644
--- a/src/add-ons/kernel/file_systems/nfs4/Connection.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/Connection.cpp
@@ -411,6 +411,7 @@ ConnectionStream::Receive(void** _buffer, uint32* _size)
                        return B_NO_MEMORY;
                } else
                        buffer = ptr;
+               MemoryDeleter bufferDeleter(buffer);
 
                received = 0;
                do {
@@ -418,15 +419,12 @@ ConnectionStream::Receive(void** _buffer, uint32* _size)
                                                        record_size - received, 
0);
                        received += result;
                } while (result > 0 && received < record_size);
-               if (result < 0) {
-                       result = errno;
-                       free(buffer);
-                       return result;
-               } else if (result == 0) {
-                       free(buffer);
+               if (result < 0)
+                       return errno;
+               else if (result == 0)
                        return ECONNABORTED;
-               }
 
+               bufferDeleter.Detach();
                size += record_size;
        } while (!last_one);
 
diff --git a/src/add-ons/kernel/file_systems/nfs4/FileInfo.cpp 
b/src/add-ons/kernel/file_systems/nfs4/FileInfo.cpp
index 1a1edf3..6a208c1 100644
--- a/src/add-ons/kernel/file_systems/nfs4/FileInfo.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/FileInfo.cpp
@@ -58,6 +58,8 @@ FileInfo::CreateName(const char* dirPath, const char* name)
        if (fName == NULL)
                return B_NO_MEMORY;
 
+       free(const_cast<char*>(fPath));
+       fPath = NULL;
        if (dirPath != NULL) {
                char* path = reinterpret_cast<char*>(malloc(strlen(name) + 2
                        + strlen(dirPath)));
@@ -68,12 +70,9 @@ FileInfo::CreateName(const char* dirPath, const char* name)
                strcat(path, "/");
                strcat(path, name);
 
-               free(const_cast<char*>(fPath));
                fPath = path;
-       } else {
-               free(const_cast<char*>(fPath));
+       } else
                fPath = strdup(name);
-       }
 
        if (fPath == NULL)
                return B_NO_MEMORY;
diff --git a/src/add-ons/kernel/file_systems/nfs4/IdMap.cpp 
b/src/add-ons/kernel/file_systems/nfs4/IdMap.cpp
index 146b077..a779469 100644
--- a/src/add-ons/kernel/file_systems/nfs4/IdMap.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/IdMap.cpp
@@ -9,6 +9,7 @@
 
 #include "IdMap.h"
 
+#include <AutoDeleter.h>
 #include <FindDirectory.h>
 #include <team.h>
 #include <util/AutoLock.h>
@@ -122,21 +123,19 @@ IdMap::_GetBuffer(T value, int32 code)
                void* buffer = malloc(size);
                if (buffer == NULL)
                        return NULL;
+               MemoryDeleter bufferDeleter(buffer);
 
                size = read_port(fReplyPort, &code, buffer, size);
                if (size < B_OK) {
-                       free(buffer);
-
                        if (_Repair() != B_OK)
                                return 0;
                        continue;
                }
 
-               if (code != MsgReply) {
-                       free(buffer);
+               if (code != MsgReply)
                        return NULL;
-               }
 
+               bufferDeleter.Detach();
                return buffer;
        } while (true);
 }

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

Commit:      9c1d983eab87868914f3d1621fc028b883901cd5
Author:      Pawel Dziepak <pdziepak@xxxxxxxxxxx>
Date:        Tue Jan  8 22:57:24 2013 UTC

nfs4: Avoid using empty string for RootInode name

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

diff --git a/src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp 
b/src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp
index 1b6031c..1d3d096 100644
--- a/src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp
@@ -190,8 +190,16 @@ FileSystem::Mount(FileSystem** _fs, RPC::Server* serv, 
const char* fsPath,
        if (name != NULL) {
                name++;
                reinterpret_cast<RootInode*>(inode)->SetName(name);
-       } else
+       } else if (fsPath[0] != '\0')
                reinterpret_cast<RootInode*>(inode)->SetName(fsPath);
+       else {
+               char* address = serv->ID().UniversalAddress();
+               if (address != NULL)
+                       reinterpret_cast<RootInode*>(inode)->SetName(address);
+               else
+                       reinterpret_cast<RootInode*>(inode)->SetName("NFS4 
Share");
+               free(address);
+       }
 
        fs->fRoot = reinterpret_cast<RootInode*>(inode);
 


Other related posts: