diff --git a/headers/private/kernel/boot/FileMapDisk.h b/headers/private/kernel/boot/FileMapDisk.h index 9651c82d2c..5ed11ea0d5 100644 --- a/headers/private/kernel/boot/FileMapDisk.h +++ b/headers/private/kernel/boot/FileMapDisk.h @@ -22,6 +22,14 @@ struct file_map_run { off_t len; }; +struct file_map_boot_item { + int32 block_size; + int32 num_runs; + struct file_map_run runs[FMAP_MAX_RUNS]; +}; + +#ifdef _BOOT_MODE + class FileMap { public: FileMap(); @@ -49,12 +57,13 @@ class FileMapDisk : public Node { size_t bufferSize); virtual status_t GetName(char *nameBuffer, size_t bufferSize) const; + virtual status_t GetFileMap(struct file_map_run *runs, int32 *count); virtual off_t Size() const; - status_t GetFileMap(FileMap **map); - static FileMapDisk *FindAnyFileMapDisk(Directory *volume); + status_t RegisterFileMapBootItem(); + private: Node *fNode; /* @@ -65,4 +74,6 @@ class FileMapDisk : public Node { }; +#endif // _BOOT_MODE + #endif // _BOOT_FILE_MAP_DISK_H diff --git a/headers/private/kernel/boot/vfs.h b/headers/private/kernel/boot/vfs.h index e6a6fb045e..970638e440 100644 --- a/headers/private/kernel/boot/vfs.h +++ b/headers/private/kernel/boot/vfs.h @@ -14,6 +14,8 @@ #ifdef __cplusplus +struct file_map_run; + /** This is the base class for all VFS nodes */ class Node : public DoublyLinkedListLinkImpl { @@ -28,6 +30,7 @@ class Node : public DoublyLinkedListLinkImpl { virtual ssize_t WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize) = 0; virtual status_t GetName(char *nameBuffer, size_t bufferSize) const; + virtual status_t GetFileMap(struct file_map_run *runs, int32 *count); virtual int32 Type() const; virtual off_t Size() const; virtual ino_t Inode() const; diff --git a/src/system/boot/loader/FileMapDisk.cpp b/src/system/boot/loader/FileMapDisk.cpp index 48a49f6d5b..c6e31bbb0a 100644 --- a/src/system/boot/loader/FileMapDisk.cpp +++ b/src/system/boot/loader/FileMapDisk.cpp @@ -4,6 +4,7 @@ */ #include +#include #include @@ -117,7 +118,14 @@ FileMapDisk::GetName(char *nameBuffer, size_t bufferSize) const return B_OK; } -// Size + +status_t +FileMapDisk::GetFileMap(struct file_map_run *runs, int32 *count) +{ + return fNode->GetFileMap(runs, count); +} + + off_t FileMapDisk::Size() const { @@ -127,14 +135,6 @@ FileMapDisk::Size() const } -status_t -FileMapDisk::GetFileMap(FileMap **map) -{ - return ENOSYS; -} - - -// FindAnyFileMapDisk FileMapDisk * FileMapDisk::FindAnyFileMapDisk(Directory *volume) { @@ -168,3 +168,22 @@ FileMapDisk::FindAnyFileMapDisk(Directory *volume) return disk; } + + +status_t +FileMapDisk::RegisterFileMapBootItem() +{ + return B_ERROR; + struct file_map_boot_item *item; + item = (struct file_map_boot_item *)malloc(sizeof(struct file_map_boot_item)); + item->num_runs = FMAP_MAX_RUNS; + status_t err; + err = GetFileMap(item->runs, &item->num_runs); + if (err < B_OK) + return err; +// err = add_boot_item("file_map_disk", item, sizeof(struct file_map_boot_item)); + err = B_ERROR; + return err; +} + + diff --git a/src/system/boot/loader/file_systems/fat/File.cpp b/src/system/boot/loader/file_systems/fat/File.cpp index 690bd49db7..833be2dcd1 100644 --- a/src/system/boot/loader/file_systems/fat/File.cpp +++ b/src/system/boot/loader/file_systems/fat/File.cpp @@ -34,7 +34,7 @@ File::~File() } -status_t +status_t File::InitCheck() { if (!fStream.InitCheck() < B_OK) @@ -44,7 +44,7 @@ File::InitCheck() } -status_t +status_t File::Open(void **_cookie, int mode) { TRACE(("FATFS::File::%s(, %d)\n", __FUNCTION__, mode)); @@ -55,14 +55,14 @@ File::Open(void **_cookie, int mode) } -status_t +status_t File::Close(void *cookie) { return B_OK; } -ssize_t +ssize_t File::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize) { TRACE(("FATFS::File::%s(, %Ld,, %d)\n", __FUNCTION__, pos, bufferSize)); @@ -74,20 +74,27 @@ File::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize) } -ssize_t +ssize_t File::WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize) { return EROFS; } -status_t +status_t File::GetName(char *nameBuffer, size_t bufferSize) const { return fStream.GetName(nameBuffer, bufferSize); } +status_t +File::GetFileMap(struct file_map_run *runs, int32 *count) +{ + return fStream.GetFileMap(runs, count); +} + + int32 File::Type() const { diff --git a/src/system/boot/loader/file_systems/fat/File.h b/src/system/boot/loader/file_systems/fat/File.h index 61cb92498d..fcc23e2167 100644 --- a/src/system/boot/loader/file_systems/fat/File.h +++ b/src/system/boot/loader/file_systems/fat/File.h @@ -28,6 +28,7 @@ class File : public Node { virtual ssize_t WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize); virtual status_t GetName(char *nameBuffer, size_t bufferSize) const; + virtual status_t GetFileMap(struct file_map_run *runs, int32 *count); virtual int32 Type() const; virtual off_t Size() const; virtual ino_t Inode() const; diff --git a/src/system/boot/loader/file_systems/fat/Stream.cpp b/src/system/boot/loader/file_systems/fat/Stream.cpp index cd03d5ec02..f908cb23a4 100644 --- a/src/system/boot/loader/file_systems/fat/Stream.cpp +++ b/src/system/boot/loader/file_systems/fat/Stream.cpp @@ -13,6 +13,7 @@ #include "File.h" #include +#include #include #include @@ -69,6 +70,39 @@ Stream::GetName(char *nameBuffer, size_t bufferSize) const } +status_t +Stream::GetFileMap(struct file_map_run *runs, int32 *count) +{ + int32 i; + uint32 cluster = fFirstCluster; + uint32 next = fVolume.InvalidClusterID(); + off_t offset = 0LL; + + for (i = 0; i < *count; i++) { + runs[i].offset = offset; + runs[i].block = fVolume.ToBlock(cluster); + runs[i].len = fVolume.ClusterSize(); + do { + next = fVolume.NextCluster(cluster); + if (next != cluster + 1) + break; + runs[i].len += fVolume.ClusterSize(); + } while (true); + if (!fVolume.IsValidCluster(next)) + break; + cluster = next; + offset += runs[i].len; + } + + // too big + if (i == *count && fVolume.IsValidCluster(next)) + return B_ERROR; + + *count = i; + return B_OK; +} + + status_t Stream::FindBlock(off_t pos, off_t &block, off_t &offset) { diff --git a/src/system/boot/loader/file_systems/fat/Stream.h b/src/system/boot/loader/file_systems/fat/Stream.h index 8796a25ca6..73a504e8c6 100644 --- a/src/system/boot/loader/file_systems/fat/Stream.h +++ b/src/system/boot/loader/file_systems/fat/Stream.h @@ -17,6 +17,7 @@ class Node; +struct file_map_run; namespace FATFS { @@ -29,6 +30,7 @@ class Stream { Volume &GetVolume() const { return fVolume; } status_t GetName(char *nameBuffer, size_t bufferSize) const; + status_t GetFileMap(struct file_map_run *runs, int32 *count); off_t Size() const { return fSize; } uint32 FirstCluster() const { return fFirstCluster; } diff --git a/src/system/boot/loader/partitions.cpp b/src/system/boot/loader/partitions.cpp index f0a9d7bbde..1b6ab268b0 100644 --- a/src/system/boot/loader/partitions.cpp +++ b/src/system/boot/loader/partitions.cpp @@ -243,6 +243,7 @@ Partition::_Mount(file_system_module_info *module, Directory **_fileSystem) FileMapDisk *disk = FileMapDisk::FindAnyFileMapDisk(fileSystem); if (disk) { TRACE(("%p Partition::_Mount: found FileMapDisk\n", this)); + disk->RegisterFileMapBootItem(); add_partitions_for(disk, true, false); } } diff --git a/src/system/boot/loader/vfs.cpp b/src/system/boot/loader/vfs.cpp index 801401581e..bdef06bc35 100644 --- a/src/system/boot/loader/vfs.cpp +++ b/src/system/boot/loader/vfs.cpp @@ -99,6 +99,13 @@ Node::GetName(char *nameBuffer, size_t bufferSize) const } +status_t +Node::GetFileMap(struct file_map_run *runs, int32 *count) +{ + return B_ERROR; +} + + int32 Node::Type() const { @@ -128,6 +135,7 @@ Node::Acquire() return B_OK; } + status_t Node::Release() {