Work in progress to pass the image extents to the kernel,
- code is disabled yet as the bootloader doesn't have add_boot_item.. will need to pass via kernel args - add a GetFileMap() method to the vfs, and implement it in FAT code. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28445 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -22,6 +22,14 @@ struct file_map_run {
|
|||||||
off_t len;
|
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 {
|
class FileMap {
|
||||||
public:
|
public:
|
||||||
FileMap();
|
FileMap();
|
||||||
@@ -49,12 +57,13 @@ class FileMapDisk : public Node {
|
|||||||
size_t bufferSize);
|
size_t bufferSize);
|
||||||
|
|
||||||
virtual status_t GetName(char *nameBuffer, size_t bufferSize) const;
|
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;
|
virtual off_t Size() const;
|
||||||
|
|
||||||
status_t GetFileMap(FileMap **map);
|
|
||||||
|
|
||||||
static FileMapDisk *FindAnyFileMapDisk(Directory *volume);
|
static FileMapDisk *FindAnyFileMapDisk(Directory *volume);
|
||||||
|
|
||||||
|
status_t RegisterFileMapBootItem();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Node *fNode;
|
Node *fNode;
|
||||||
/*
|
/*
|
||||||
@@ -65,4 +74,6 @@ class FileMapDisk : public Node {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif // _BOOT_MODE
|
||||||
|
|
||||||
#endif // _BOOT_FILE_MAP_DISK_H
|
#endif // _BOOT_FILE_MAP_DISK_H
|
||||||
|
|||||||
@@ -14,6 +14,8 @@
|
|||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
||||||
|
struct file_map_run;
|
||||||
|
|
||||||
/** This is the base class for all VFS nodes */
|
/** This is the base class for all VFS nodes */
|
||||||
|
|
||||||
class Node : public DoublyLinkedListLinkImpl<Node> {
|
class Node : public DoublyLinkedListLinkImpl<Node> {
|
||||||
@@ -28,6 +30,7 @@ class Node : public DoublyLinkedListLinkImpl<Node> {
|
|||||||
virtual ssize_t WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize) = 0;
|
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 GetName(char *nameBuffer, size_t bufferSize) const;
|
||||||
|
virtual status_t GetFileMap(struct file_map_run *runs, int32 *count);
|
||||||
virtual int32 Type() const;
|
virtual int32 Type() const;
|
||||||
virtual off_t Size() const;
|
virtual off_t Size() const;
|
||||||
virtual ino_t Inode() const;
|
virtual ino_t Inode() const;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <boot/FileMapDisk.h>
|
#include <boot/FileMapDisk.h>
|
||||||
|
#include <boot_item.h>
|
||||||
|
|
||||||
#include <new>
|
#include <new>
|
||||||
|
|
||||||
@@ -117,7 +118,14 @@ FileMapDisk::GetName(char *nameBuffer, size_t bufferSize) const
|
|||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Size
|
|
||||||
|
status_t
|
||||||
|
FileMapDisk::GetFileMap(struct file_map_run *runs, int32 *count)
|
||||||
|
{
|
||||||
|
return fNode->GetFileMap(runs, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
off_t
|
off_t
|
||||||
FileMapDisk::Size() const
|
FileMapDisk::Size() const
|
||||||
{
|
{
|
||||||
@@ -127,14 +135,6 @@ FileMapDisk::Size() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
|
||||||
FileMapDisk::GetFileMap(FileMap **map)
|
|
||||||
{
|
|
||||||
return ENOSYS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// FindAnyFileMapDisk
|
|
||||||
FileMapDisk *
|
FileMapDisk *
|
||||||
FileMapDisk::FindAnyFileMapDisk(Directory *volume)
|
FileMapDisk::FindAnyFileMapDisk(Directory *volume)
|
||||||
{
|
{
|
||||||
@@ -168,3 +168,22 @@ FileMapDisk::FindAnyFileMapDisk(Directory *volume)
|
|||||||
|
|
||||||
return disk;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ File::~File()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
File::InitCheck()
|
File::InitCheck()
|
||||||
{
|
{
|
||||||
if (!fStream.InitCheck() < B_OK)
|
if (!fStream.InitCheck() < B_OK)
|
||||||
@@ -44,7 +44,7 @@ File::InitCheck()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
File::Open(void **_cookie, int mode)
|
File::Open(void **_cookie, int mode)
|
||||||
{
|
{
|
||||||
TRACE(("FATFS::File::%s(, %d)\n", __FUNCTION__, 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)
|
File::Close(void *cookie)
|
||||||
{
|
{
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ssize_t
|
ssize_t
|
||||||
File::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize)
|
File::ReadAt(void *cookie, off_t pos, void *buffer, size_t bufferSize)
|
||||||
{
|
{
|
||||||
TRACE(("FATFS::File::%s(, %Ld,, %d)\n", __FUNCTION__, pos, 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)
|
File::WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize)
|
||||||
{
|
{
|
||||||
return EROFS;
|
return EROFS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
File::GetName(char *nameBuffer, size_t bufferSize) const
|
File::GetName(char *nameBuffer, size_t bufferSize) const
|
||||||
{
|
{
|
||||||
return fStream.GetName(nameBuffer, bufferSize);
|
return fStream.GetName(nameBuffer, bufferSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
File::GetFileMap(struct file_map_run *runs, int32 *count)
|
||||||
|
{
|
||||||
|
return fStream.GetFileMap(runs, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32
|
int32
|
||||||
File::Type() const
|
File::Type() const
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ class File : public Node {
|
|||||||
virtual ssize_t WriteAt(void *cookie, off_t pos, const void *buffer, size_t bufferSize);
|
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 GetName(char *nameBuffer, size_t bufferSize) const;
|
||||||
|
virtual status_t GetFileMap(struct file_map_run *runs, int32 *count);
|
||||||
virtual int32 Type() const;
|
virtual int32 Type() const;
|
||||||
virtual off_t Size() const;
|
virtual off_t Size() const;
|
||||||
virtual ino_t Inode() const;
|
virtual ino_t Inode() const;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
#include "File.h"
|
#include "File.h"
|
||||||
|
|
||||||
#include <util/kernel_cpp.h>
|
#include <util/kernel_cpp.h>
|
||||||
|
#include <boot/FileMapDisk.h>
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -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
|
status_t
|
||||||
Stream::FindBlock(off_t pos, off_t &block, off_t &offset)
|
Stream::FindBlock(off_t pos, off_t &block, off_t &offset)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
class Node;
|
class Node;
|
||||||
|
|
||||||
|
struct file_map_run;
|
||||||
|
|
||||||
namespace FATFS {
|
namespace FATFS {
|
||||||
|
|
||||||
@@ -29,6 +30,7 @@ class Stream {
|
|||||||
Volume &GetVolume() const { return fVolume; }
|
Volume &GetVolume() const { return fVolume; }
|
||||||
|
|
||||||
status_t GetName(char *nameBuffer, size_t bufferSize) const;
|
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; }
|
off_t Size() const { return fSize; }
|
||||||
uint32 FirstCluster() const { return fFirstCluster; }
|
uint32 FirstCluster() const { return fFirstCluster; }
|
||||||
|
|
||||||
|
|||||||
@@ -243,6 +243,7 @@ Partition::_Mount(file_system_module_info *module, Directory **_fileSystem)
|
|||||||
FileMapDisk *disk = FileMapDisk::FindAnyFileMapDisk(fileSystem);
|
FileMapDisk *disk = FileMapDisk::FindAnyFileMapDisk(fileSystem);
|
||||||
if (disk) {
|
if (disk) {
|
||||||
TRACE(("%p Partition::_Mount: found FileMapDisk\n", this));
|
TRACE(("%p Partition::_Mount: found FileMapDisk\n", this));
|
||||||
|
disk->RegisterFileMapBootItem();
|
||||||
add_partitions_for(disk, true, false);
|
add_partitions_for(disk, true, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
int32
|
||||||
Node::Type() const
|
Node::Type() const
|
||||||
{
|
{
|
||||||
@@ -128,6 +135,7 @@ Node::Acquire()
|
|||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
Node::Release()
|
Node::Release()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user