From 97b7eb47f7d8baa3109902fb2b5d4000706edf50 Mon Sep 17 00:00:00 2001 From: Pawel Dziepak Date: Thu, 28 Jun 2012 02:09:58 +0200 Subject: [PATCH] nfs4: Take advantage of supported_attrs attribute --- .../kernel/file_systems/nfs4/Inode.cpp | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp index 292a71b064..bf228fbb9d 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.cpp @@ -734,8 +734,10 @@ Inode::Create(const char* name, int mode, int perms, OpenFileCookie* cookie, req.GetFH(); - Attribute attr[] = { FATTR4_FILEID }; - req.GetAttr(attr, sizeof(attr) / sizeof(Attribute)); + if (fFilesystem->IsAttrSupported(FATTR4_FILEID)) { + Attribute attr[] = { FATTR4_FILEID }; + req.GetAttr(attr, sizeof(attr) / sizeof(Attribute)); + } result = request.Send(); if (result != B_OK) @@ -752,19 +754,19 @@ Inode::Create(const char* name, int mode, int perms, OpenFileCookie* cookie, reply.Open(cookie->fStateId, &cookie->fStateSeq, &confirm); reply.GetFH(&fh); - AttrValue* values; - uint32 count; - result = reply.GetAttr(&values, &count); - if (result != B_OK) - return result; - uint64 fileId; - if (count == 1 && values[1].fAttribute == FATTR4_FILEID) + if (fFilesystem->IsAttrSupported(FATTR4_FILEID)) { + AttrValue* values; + uint32 count; + result = reply.GetAttr(&values, &count); + if (result != B_OK) + return result; + fileId = values[1].fData.fValue64; - else + + delete[] values; + } else fileId = fFilesystem->AllocFileId(); - - delete[] values; *id = _FileIdToInoT(fileId); @@ -1194,8 +1196,11 @@ Inode::_ReadDirUp(struct dirent* de, uint32 pos, uint32 size) req.PutFH(fHandle); req.LookUpUp(); req.GetFH(); - Attribute attr[] = { FATTR4_FILEID }; - req.GetAttr(attr, sizeof(attr) / sizeof(Attribute)); + + if (fFilesystem->IsAttrSupported(FATTR4_FILEID)) { + Attribute attr[] = { FATTR4_FILEID }; + req.GetAttr(attr, sizeof(attr) / sizeof(Attribute)); + } status_t result = request.Send(); if (result != B_OK) @@ -1214,19 +1219,18 @@ Inode::_ReadDirUp(struct dirent* de, uint32 pos, uint32 size) Filehandle fh; reply.GetFH(&fh); - AttrValue* values; - uint32 count; - reply.GetAttr(&values, &count); - if (result != B_OK) - return result; - uint64 fileId; - if (count < 1 || values[0].fAttribute != FATTR4_FILEID) { - fileId = fFilesystem->AllocFileId(); - } else - fileId = values[0].fData.fValue64; + if (fFilesystem->IsAttrSupported(FATTR4_FILEID)) { + AttrValue* values; + uint32 count; + reply.GetAttr(&values, &count); + if (result != B_OK) + return result; - delete[] values; + fileId = values[0].fData.fValue64; + delete[] values; + } else + fileId = fFilesystem->AllocFileId(); return _FillDirEntry(de, _FileIdToInoT(fileId), "..", pos, size); } while (true);