nfs4: Take advantage of supported_attrs attribute
This commit is contained in:
@@ -734,8 +734,10 @@ Inode::Create(const char* name, int mode, int perms, OpenFileCookie* cookie,
|
|||||||
|
|
||||||
req.GetFH();
|
req.GetFH();
|
||||||
|
|
||||||
Attribute attr[] = { FATTR4_FILEID };
|
if (fFilesystem->IsAttrSupported(FATTR4_FILEID)) {
|
||||||
req.GetAttr(attr, sizeof(attr) / sizeof(Attribute));
|
Attribute attr[] = { FATTR4_FILEID };
|
||||||
|
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);
|
||||||
|
|
||||||
AttrValue* values;
|
|
||||||
uint32 count;
|
|
||||||
result = reply.GetAttr(&values, &count);
|
|
||||||
if (result != B_OK)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
uint64 fileId;
|
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;
|
fileId = values[1].fData.fValue64;
|
||||||
else
|
|
||||||
|
delete[] values;
|
||||||
|
} else
|
||||||
fileId = fFilesystem->AllocFileId();
|
fileId = fFilesystem->AllocFileId();
|
||||||
|
|
||||||
delete[] values;
|
|
||||||
|
|
||||||
*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();
|
||||||
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();
|
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);
|
||||||
|
|
||||||
AttrValue* values;
|
|
||||||
uint32 count;
|
|
||||||
reply.GetAttr(&values, &count);
|
|
||||||
if (result != B_OK)
|
|
||||||
return result;
|
|
||||||
|
|
||||||
uint64 fileId;
|
uint64 fileId;
|
||||||
if (count < 1 || values[0].fAttribute != FATTR4_FILEID) {
|
if (fFilesystem->IsAttrSupported(FATTR4_FILEID)) {
|
||||||
fileId = fFilesystem->AllocFileId();
|
AttrValue* values;
|
||||||
} else
|
uint32 count;
|
||||||
fileId = values[0].fData.fValue64;
|
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);
|
return _FillDirEntry(de, _FileIdToInoT(fileId), "..", pos, size);
|
||||||
} while (true);
|
} while (true);
|
||||||
|
|||||||
Reference in New Issue
Block a user