diff --git a/src/add-ons/kernel/file_systems/nfs4/DirectoryCache.cpp b/src/add-ons/kernel/file_systems/nfs4/DirectoryCache.cpp index 325a7646a3..b9483a0c07 100644 --- a/src/add-ons/kernel/file_systems/nfs4/DirectoryCache.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/DirectoryCache.cpp @@ -252,6 +252,25 @@ DirectoryCache::NotifyChanges(DirectoryCacheSnapshot* oldSnapshot, } else { notify_entry_created(fInode->GetFileSystem()->DevId(), fInode->ID(), newCurrent->fName, newCurrent->fNode); + + FileInfo fi; + fi.fFileId = newCurrent->fNode; + fi.fParent = fInode->fInfo.fHandle; + fi.fName = strdup(newCurrent->fName); + if (fi.fName != NULL) { + size_t pathLength = strlen(newCurrent->fName) + 2 + + strlen(fInode->fInfo.fPath); + char* path = reinterpret_cast(malloc(pathLength)); + if (path != NULL) { + strcpy(path, fInode->fInfo.fPath); + strcat(path, "/"); + strcat(path, newCurrent->fName); + fi.fPath = path; + + fInode->GetFileSystem()->InoIdMap()->AddEntry(fi, + Inode::FileIdToInoT(newCurrent->fNode)); + } + } } } else oldSnapshot->fEntries.Remove(prev, oldCurrent); diff --git a/src/add-ons/kernel/file_systems/nfs4/Inode.h b/src/add-ons/kernel/file_systems/nfs4/Inode.h index ab8feecec4..d4d16acdae 100644 --- a/src/add-ons/kernel/file_systems/nfs4/Inode.h +++ b/src/add-ons/kernel/file_systems/nfs4/Inode.h @@ -109,6 +109,7 @@ public: status_t LoadAttrDirHandle(); + static inline ino_t FileIdToInoT(uint64 fileid); protected: Inode(); @@ -133,8 +134,6 @@ protected: static inline status_t CheckLockType(short ltype, uint32 mode); - static inline ino_t FileIdToInoT(uint64 fileid); - private: uint32 fType; diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.h b/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.h index 62db373c8a..cd3c461c77 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.h +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Inode.h @@ -20,7 +20,7 @@ #include "ReplyInterpreter.h" -class NFS4Inode : protected NFS4Object { +class NFS4Inode : public NFS4Object { public: status_t GetChangeInfo(uint64* change, bool attrDir = false); status_t ReadLink(void* buffer, size_t* length); diff --git a/src/add-ons/kernel/file_systems/nfs4/NFS4Object.cpp b/src/add-ons/kernel/file_systems/nfs4/NFS4Object.cpp index 67cdb4ea6b..e29379d825 100644 --- a/src/add-ons/kernel/file_systems/nfs4/NFS4Object.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/NFS4Object.cpp @@ -50,9 +50,9 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv, if (result != B_TIMED_OUT) { release_sem(cookie->fSnoozeCancel); - return true; + return false; } - return false; + return true; } if (sequence != NULL) @@ -80,9 +80,9 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv, if (result != B_TIMED_OUT) { release_sem(cookie->fSnoozeCancel); - return true; + return false; } - return false; + return true; } if (sequence != NULL) @@ -104,7 +104,8 @@ NFS4Object::HandleErrors(uint32 nfs4Error, RPC::Server* serv, } return false; - // FileHandle has expired + // FileHandle has expired or is invalid + case NFS4ERR_BADHANDLE: case NFS4ERR_FHEXPIRED: if (fInfo.UpdateFileHandles(fFileSystem) == B_OK) return true;