[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, 15 Aug 2012 01:49:24 +0200 (CEST)

added 2 changesets to branch 'refs/remotes/pdziepak-github/nfs4'
old head: 6713e36b1d802e8775d9fb168a6fcb4e2f418d28
new head: ff4d16ded4782a2967ffa2413761c078516b2ae6

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

a5ae9b4: nfs4: Do not repeat OPENATTR requests if not supported

ff4d16d: nfs4: Use reserved port if possible

                                    [ Pawel Dziepak <pdziepak@xxxxxxxxxxx> ]

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

4 files changed, 72 insertions(+), 1 deletion(-)
.../kernel/file_systems/nfs4/Connection.cpp        |   48 +++++++++++++++-
.../kernel/file_systems/nfs4/FileSystem.cpp        |    1 +
src/add-ons/kernel/file_systems/nfs4/FileSystem.h  |   18 ++++++
src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp  |    6 ++

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

Commit:      a5ae9b4752c300bcc39d9531581cbfae2525aec3

Author:      Pawel Dziepak <pdziepak@xxxxxxxxxxx>
Date:        Tue Aug 14 22:09:41 2012 UTC

nfs4: Do not repeat OPENATTR requests if not supported

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

diff --git a/src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp 
b/src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp
index d211299..5c28b92 100644
--- a/src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/FileSystem.cpp
@@ -27,6 +27,7 @@ FileSystem::FileSystem()
        fPrev(NULL),
        fOpenCount(0),
        fOpenOwnerSequence(0),
+       fNamedAttrs(true),
        fPath(NULL),
        fRoot(NULL),
        fId(1)
diff --git a/src/add-ons/kernel/file_systems/nfs4/FileSystem.h 
b/src/add-ons/kernel/file_systems/nfs4/FileSystem.h
index 10850e9..3a2dfac 100644
--- a/src/add-ons/kernel/file_systems/nfs4/FileSystem.h
+++ b/src/add-ons/kernel/file_systems/nfs4/FileSystem.h
@@ -62,6 +62,9 @@ public:
        inline  uint32                          OpenOwnerSequenceLock();
        inline  void                            OpenOwnerSequenceUnlock(uint32 
sequence);
 
+       inline  bool                            NamedAttrs();
+       inline  void                            SetNamedAttrs(bool attrs);
+
                        FileSystem*                     fNext;
                        FileSystem*                     fPrev;
 private:
@@ -83,6 +86,7 @@ private:
 
                        uint32                          fExpireType;
                        uint32                          fSupAttrs[2];
+                       bool                            fNamedAttrs;
 
                        FileSystemId            fFsId;
                        const char*                     fPath;
@@ -205,5 +209,19 @@ FileSystem::OpenOwnerSequenceUnlock(uint32 sequence)
 }
 
 
+inline bool
+FileSystem::NamedAttrs()
+{
+       return fNamedAttrs;
+}
+
+
+inline void
+FileSystem::SetNamedAttrs(bool attrs)
+{
+       fNamedAttrs = attrs;
+}
+
+
 #endif // FILESYSTEM_H
 
diff --git a/src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp 
b/src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp
index f2c83fe..d78d28f 100644
--- a/src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp
@@ -62,10 +62,16 @@ Inode::OpenAttrDir(OpenDirCookie* cookie)
 status_t
 Inode::LoadAttrDirHandle()
 {
+       if (!fFileSystem->NamedAttrs())
+               return B_UNSUPPORTED;
+
        if (fInfo.fAttrDir.fSize == 0) {
                FileHandle handle;
 
                status_t result = NFS4Inode::OpenAttrDir(&handle);
+               if (result == B_UNSUPPORTED)
+                       fFileSystem->SetNamedAttrs(false);
+
                if (result != B_OK)
                        return result;
 

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

Commit:      ff4d16ded4782a2967ffa2413761c078516b2ae6

Author:      Pawel Dziepak <pdziepak@xxxxxxxxxxx>
Date:        Tue Aug 14 23:22:35 2012 UTC

nfs4: Use reserved port if possible

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

diff --git a/src/add-ons/kernel/file_systems/nfs4/Connection.cpp 
b/src/add-ons/kernel/file_systems/nfs4/Connection.cpp
index 6b38b04..9e9a78a 100644
--- a/src/add-ons/kernel/file_systems/nfs4/Connection.cpp
+++ b/src/add-ons/kernel/file_systems/nfs4/Connection.cpp
@@ -24,6 +24,8 @@
 #define        LAST_FRAGMENT   0x80000000
 #define MAX_PACKET_SIZE        65535
 
+#define NFS_MIN_PORT   665
+
 
 bool
 ServerAddress::operator==(const ServerAddress& address)
@@ -507,6 +509,50 @@ Connection::Connect()
        if (fSocket < 0)
                return errno;
 
+       status_t result;
+       uint16 port, attempt = 0;
+
+       sockaddr_in addr;
+       sockaddr_in6 addr6;
+       switch (address.sa_family) {
+               case AF_INET:
+                       memset(&addr, 0, sizeof(addr));
+                       addr.sin_len = sizeof(addr);
+                       addr.sin_family = AF_INET;
+                       addr.sin_addr.s_addr = INADDR_ANY;
+                       break;
+               case AF_INET6:
+                       memset(&addr6, 0, sizeof(addr6));
+                       addr6.sin6_len = sizeof(addr6);
+                       addr6.sin6_family = AF_INET6;
+                       break;
+       }
+
+       do {
+               port = rand() % (IPPORT_RESERVED - NFS_MIN_PORT);
+               port += NFS_MIN_PORT;
+
+               if (attempt == 9)
+                       port = 0;
+               attempt++;
+
+               switch (address.sa_family) {
+                       case AF_INET:
+                               addr.sin_port = htons(port);
+                               result = bind(fSocket, (struct sockaddr*)&addr, 
sizeof(addr));
+                               break;
+                       case AF_INET6:
+                               addr6.sin6_port = htons(port);
+                               result = bind(fSocket, (struct 
sockaddr*)&addr6, sizeof(addr6));
+                               break;
+               }
+       } while (attempt <= 10 && result != B_OK);
+
+       if (attempt > 10) {
+               close(fSocket);
+               return result;
+       }
+
        socklen_t addressSize;
        switch (address.sa_family) {
                case AF_INET:
@@ -519,7 +565,7 @@ Connection::Connect()
                        return B_BAD_VALUE;
        }
 
-       status_t result = connect(fSocket, &address, addressSize);
+       result = connect(fSocket, &address, addressSize);
        if (result != 0) {
                result = errno;
                close(fSocket);


Other related posts: