diff --git a/src/add-ons/kernel/file_systems/packagefs/Directory.cpp b/src/add-ons/kernel/file_systems/packagefs/Directory.cpp index e8b11901d5..e047223bde 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Directory.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/Directory.cpp @@ -210,3 +210,18 @@ Directory::RemoveDirectoryIterator(DirectoryIterator* iterator) { fIterators.Remove(iterator); } + + +RootDirectory::RootDirectory(ino_t id, const timespec& modifiedTime) + : + Directory(id), + fModifiedTime(modifiedTime) +{ +} + + +timespec +RootDirectory::ModifiedTime() const +{ + return fModifiedTime; +} diff --git a/src/add-ons/kernel/file_systems/packagefs/Directory.h b/src/add-ons/kernel/file_systems/packagefs/Directory.h index 06d55abddb..099fd74325 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Directory.h +++ b/src/add-ons/kernel/file_systems/packagefs/Directory.h @@ -10,7 +10,6 @@ #include "PackageDirectory.h" - struct DirectoryIterator : DoublyLinkedListLinkImpl { Node* node; @@ -83,4 +82,16 @@ Directory::NextChild(Node* node) const } +class RootDirectory : public Directory { +public: + RootDirectory(ino_t id, + const timespec& modifiedTime); + + virtual timespec ModifiedTime() const; + +private: + timespec fModifiedTime; +}; + + #endif // DIRECTORY_H diff --git a/src/add-ons/kernel/file_systems/packagefs/Volume.cpp b/src/add-ons/kernel/file_systems/packagefs/Volume.cpp index cf54c2c7db..20597ec247 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Volume.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/Volume.cpp @@ -358,8 +358,13 @@ Volume::Mount(const char* parameterString) RETURN_ERROR(B_BAD_VALUE); } + struct stat st; + if (stat(packages, &st) < 0) + RETURN_ERROR(B_ERROR); + // create the root node - fRootDirectory = new(std::nothrow) Directory(kRootDirectoryID); + fRootDirectory + = new(std::nothrow) ::RootDirectory(kRootDirectoryID, st.st_mtim); if (fRootDirectory == NULL) RETURN_ERROR(B_NO_MEMORY); fRootDirectory->Init(NULL, volumeName != NULL ? volumeName : "Package FS"); diff --git a/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp index b2bc3e0ef7..cd52cd6a11 100644 --- a/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/kernel_interface.cpp @@ -341,7 +341,7 @@ packagefs_read_stat(fs_volume* fsVolume, fs_vnode* fsNode, struct stat* st) st->st_ctim = st->st_mtim; // TODO: Perhaps manage a changed time (particularly for directories)? st->st_crtim = st->st_mtim; - st->st_blocks = st->st_size / 512; + st->st_blocks = (st->st_size + 511) / 512; return B_OK; }