nfs4: Take advantage of supported_attrs attribute

This commit is contained in:
Pawel Dziepak
2012-06-29 02:15:27 +02:00
parent 7f67d8283e
commit 97b7eb47f7
+13 -9
View File
@@ -734,8 +734,10 @@ Inode::Create(const char* name, int mode, int perms, OpenFileCookie* cookie,
req.GetFH(); req.GetFH();
if (fFilesystem->IsAttrSupported(FATTR4_FILEID)) {
Attribute attr[] = { FATTR4_FILEID }; Attribute attr[] = { FATTR4_FILEID };
req.GetAttr(attr, sizeof(attr) / sizeof(Attribute)); req.GetAttr(attr, sizeof(attr) / sizeof(Attribute));
}
result = request.Send(); result = request.Send();
if (result != B_OK) 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.Open(cookie->fStateId, &cookie->fStateSeq, &confirm);
reply.GetFH(&fh); reply.GetFH(&fh);
uint64 fileId;
if (fFilesystem->IsAttrSupported(FATTR4_FILEID)) {
AttrValue* values; AttrValue* values;
uint32 count; uint32 count;
result = reply.GetAttr(&values, &count); result = reply.GetAttr(&values, &count);
if (result != B_OK) if (result != B_OK)
return result; return result;
uint64 fileId;
if (count == 1 && values[1].fAttribute == FATTR4_FILEID)
fileId = values[1].fData.fValue64; fileId = values[1].fData.fValue64;
else
fileId = fFilesystem->AllocFileId();
delete[] values; delete[] values;
} else
fileId = fFilesystem->AllocFileId();
*id = _FileIdToInoT(fileId); *id = _FileIdToInoT(fileId);
@@ -1194,8 +1196,11 @@ Inode::_ReadDirUp(struct dirent* de, uint32 pos, uint32 size)
req.PutFH(fHandle); req.PutFH(fHandle);
req.LookUpUp(); req.LookUpUp();
req.GetFH(); req.GetFH();
if (fFilesystem->IsAttrSupported(FATTR4_FILEID)) {
Attribute attr[] = { FATTR4_FILEID }; Attribute attr[] = { FATTR4_FILEID };
req.GetAttr(attr, sizeof(attr) / sizeof(Attribute)); req.GetAttr(attr, sizeof(attr) / sizeof(Attribute));
}
status_t result = request.Send(); status_t result = request.Send();
if (result != B_OK) if (result != B_OK)
@@ -1214,19 +1219,18 @@ Inode::_ReadDirUp(struct dirent* de, uint32 pos, uint32 size)
Filehandle fh; Filehandle fh;
reply.GetFH(&fh); reply.GetFH(&fh);
uint64 fileId;
if (fFilesystem->IsAttrSupported(FATTR4_FILEID)) {
AttrValue* values; AttrValue* values;
uint32 count; uint32 count;
reply.GetAttr(&values, &count); reply.GetAttr(&values, &count);
if (result != B_OK) if (result != B_OK)
return result; return result;
uint64 fileId;
if (count < 1 || values[0].fAttribute != FATTR4_FILEID) {
fileId = fFilesystem->AllocFileId();
} else
fileId = values[0].fData.fValue64; fileId = values[0].fData.fValue64;
delete[] values; delete[] values;
} else
fileId = fFilesystem->AllocFileId();
return _FillDirEntry(de, _FileIdToInoT(fileId), "..", pos, size); return _FillDirEntry(de, _FileIdToInoT(fileId), "..", pos, size);
} while (true); } while (true);