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