nfs4: Do not let local changes invalidate cache

This commit is contained in:
Pawel Dziepak
2012-07-19 02:25:04 +02:00
parent 75fe7b90bb
commit 7b6f80fee2
4 changed files with 107 additions and 31 deletions
+64 -6
View File
@@ -304,7 +304,23 @@ Inode::Link(Inode* dir, const char* name)
reply.SaveFH(); reply.SaveFH();
reply.PutFH(); reply.PutFH();
return reply.Link(); uint64 before, after;
bool atomic;
result = reply.Link(&before, &after, atomic);
if (result != B_OK)
return result;
if (fCache->Lock() == B_OK) {
if (atomic && fCache->ChangeInfo() == before) {
// TODO: update cache
//fCache->AddEntry(name, );
fCache->SetChangeInfo(after);
} else if (fCache->ChangeInfo() != before)
fCache->Trash();
fCache->Unlock();
}
return B_OK;
} while (true); } while (true);
} }
@@ -361,9 +377,19 @@ Inode::Remove(const char* name, FileType type)
return result; return result;
reply.PutFH(); reply.PutFH();
result = reply.Remove();
// remove entry uint64 before, after;
bool atomic;
result = reply.Remove(&before, &after, atomic);
if (fCache->Lock() == B_OK) {
if (atomic && fCache->ChangeInfo() == before) {
fCache->RemoveEntry(name);
fCache->SetChangeInfo(after);
} else if (fCache->ChangeInfo() != before)
fCache->Trash();
fCache->Unlock();
}
fFileSystem->Root()->MakeInfoInvalid(); fFileSystem->Root()->MakeInfoInvalid();
@@ -415,9 +441,29 @@ Inode::Rename(Inode* from, Inode* to, const char* fromName, const char* toName)
reply.SaveFH(); reply.SaveFH();
reply.PutFH(); reply.PutFH();
result = reply.Rename(); uint64 fromBefore, fromAfter, toBefore, toAfter;
bool fromAtomic, toAtomic;
result = reply.Rename(&fromBefore, &fromAfter, fromAtomic, &toBefore,
&toAfter, toAtomic);
// remove entry if (from->fCache->Lock() == B_OK) {
if (fromAtomic && from->fCache->ChangeInfo() == fromBefore) {
from->fCache->RemoveEntry(fromName);
from->fCache->SetChangeInfo(fromAfter);
} else if (from->fCache->ChangeInfo() != fromBefore)
from->fCache->Trash();
from->fCache->Unlock();
}
if (to->fCache->Lock() == B_OK) {
if (toAtomic && to->fCache->ChangeInfo() == toBefore) {
// TODO: update cache
//fCache->AddEntry(toName, );
to->fCache->SetChangeInfo(toAfter);
} else if (to->fCache->ChangeInfo() != toBefore)
to->fCache->Trash();
to->fCache->Unlock();
};
return result; return result;
} while (true); } while (true);
@@ -474,10 +520,22 @@ Inode::CreateLink(const char* name, const char* path, int mode)
reply.PutFH(); reply.PutFH();
result = reply.Create(); uint64 before, after;
bool atomic;
result = reply.Create(&before, &after, atomic);
fFileSystem->Root()->MakeInfoInvalid(); fFileSystem->Root()->MakeInfoInvalid();
if (fCache->Lock() == B_OK) {
if (atomic && fCache->ChangeInfo() == before) {
// TODO: update cache
//fCache->AddEntry(name, );
fCache->SetChangeInfo(after);
} else if (fCache->ChangeInfo() != before)
fCache->Trash();
fCache->Unlock();
}
return result; return result;
} while (true); } while (true);
} }
@@ -67,7 +67,23 @@ Inode::CreateDir(const char* name, int mode)
reply.PutFH(); reply.PutFH();
return reply.Create(); uint64 before, after;
bool atomic;
result = reply.Create(&before, &after, atomic);
fFileSystem->Root()->MakeInfoInvalid();
if (fCache->Lock() == B_OK) {
if (atomic && fCache->ChangeInfo() == before) {
// TODO: update cache
//fCache->AddEntry(name, );
fCache->SetChangeInfo(after);
} else if (fCache->ChangeInfo() != before)
fCache->Trash();
fCache->Unlock();
}
return result;
} while (true); } while (true);
} }
@@ -126,15 +126,15 @@ ReplyInterpreter::Close()
status_t status_t
ReplyInterpreter::Create() ReplyInterpreter::Create(uint64* before, uint64* after, bool& atomic)
{ {
status_t res = _OperationError(OpCreate); status_t res = _OperationError(OpCreate);
if (res != B_OK) if (res != B_OK)
return res; return res;
fReply->Stream().GetBoolean(); atomic = fReply->Stream().GetBoolean();
fReply->Stream().GetUHyper(); *before = fReply->Stream().GetUHyper();
fReply->Stream().GetUHyper(); *after = fReply->Stream().GetUHyper();
uint32 count = fReply->Stream().GetUInt(); uint32 count = fReply->Stream().GetUInt();
for (uint32 i; i < count; i++) for (uint32 i; i < count; i++)
fReply->Stream().GetUInt(); fReply->Stream().GetUInt();
@@ -187,15 +187,15 @@ ReplyInterpreter::GetFH(FileHandle* fh)
status_t status_t
ReplyInterpreter::Link() ReplyInterpreter::Link(uint64* before, uint64* after, bool& atomic)
{ {
status_t res = _OperationError(OpLink); status_t res = _OperationError(OpLink);
if (res != B_OK) if (res != B_OK)
return res; return res;
fReply->Stream().GetBoolean(); atomic = fReply->Stream().GetBoolean();
fReply->Stream().GetUHyper(); *before = fReply->Stream().GetUHyper();
fReply->Stream().GetUHyper(); *after = fReply->Stream().GetUHyper();
return fReply->Stream().IsEOF() ? B_BAD_VALUE : B_OK; return fReply->Stream().IsEOF() ? B_BAD_VALUE : B_OK;
} }
@@ -369,35 +369,35 @@ ReplyInterpreter::ReadLink(void* buffer, uint32* size, uint32 maxSize)
status_t status_t
ReplyInterpreter::Remove() ReplyInterpreter::Remove(uint64* before, uint64* after, bool& atomic)
{ {
status_t res = _OperationError(OpRemove); status_t res = _OperationError(OpRemove);
if (res != B_OK) if (res != B_OK)
return res; return res;
fReply->Stream().GetBoolean(); atomic = fReply->Stream().GetBoolean();
fReply->Stream().GetUHyper(); *before = fReply->Stream().GetUHyper();
fReply->Stream().GetUHyper(); *after = fReply->Stream().GetUHyper();
return fReply->Stream().IsEOF() ? B_BAD_VALUE : B_OK; return fReply->Stream().IsEOF() ? B_BAD_VALUE : B_OK;
} }
status_t status_t
ReplyInterpreter::Rename() ReplyInterpreter::Rename(uint64* fromBefore, uint64* fromAfter,
bool& fromAtomic, uint64* toBefore, uint64* toAfter, bool& toAtomic)
{ {
status_t res = _OperationError(OpRename); status_t res = _OperationError(OpRename);
if (res != B_OK) if (res != B_OK)
return res; return res;
fReply->Stream().GetBoolean(); fromAtomic = fReply->Stream().GetBoolean();
fReply->Stream().GetUHyper(); *fromBefore = fReply->Stream().GetUHyper();
fReply->Stream().GetUHyper(); *fromAfter = fReply->Stream().GetUHyper();
fReply->Stream().GetBoolean();
fReply->Stream().GetUHyper();
fReply->Stream().GetUHyper();
toAtomic = fReply->Stream().GetBoolean();
*toBefore = fReply->Stream().GetUHyper();
*toAfter = fReply->Stream().GetUHyper();
return fReply->Stream().IsEOF() ? B_BAD_VALUE : B_OK; return fReply->Stream().IsEOF() ? B_BAD_VALUE : B_OK;
} }
@@ -69,10 +69,10 @@ public:
status_t Access(uint32* supported, uint32* allowed); status_t Access(uint32* supported, uint32* allowed);
status_t Close(); status_t Close();
status_t Create(); status_t Create(uint64* before, uint64* after, bool& atomic);
status_t GetAttr(AttrValue** attrs, uint32* count); status_t GetAttr(AttrValue** attrs, uint32* count);
status_t GetFH(FileHandle* fh); status_t GetFH(FileHandle* fh);
status_t Link(); status_t Link(uint64* before, uint64* after, bool& atomic);
status_t Lock(LockInfo* linfo); status_t Lock(LockInfo* linfo);
status_t LockT(uint64* pos, uint64* len, LockType* type); status_t LockT(uint64* pos, uint64* len, LockType* type);
status_t LockU(LockInfo* linfo); status_t LockU(LockInfo* linfo);
@@ -87,8 +87,10 @@ public:
status_t ReadDir(uint64* cookie, uint64* cookieVerf, status_t ReadDir(uint64* cookie, uint64* cookieVerf,
DirEntry** dirents, uint32* count, bool* eof); DirEntry** dirents, uint32* count, bool* eof);
status_t ReadLink(void* buffer, uint32* size, uint32 maxSize); status_t ReadLink(void* buffer, uint32* size, uint32 maxSize);
status_t Remove(); status_t Remove(uint64* before, uint64* after, bool& atomic);
status_t Rename(); status_t Rename(uint64* fromBefore, uint64* fromAfter,
bool& fromAtomic, uint64* toBefore, uint64* toAfter,
bool& toAtomic);
inline status_t Renew(); inline status_t Renew();
inline status_t SaveFH(); inline status_t SaveFH();
status_t SetAttr(); status_t SetAttr();