Added a Haiku file cache implementation to the UserlandFSServer.
Basically reused the kernel implementation, but needed to hack it quite a bit and also add an emulation of the required VM interface. Completely untested yet. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20406 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
#include "Debug.h"
|
#include "Debug.h"
|
||||||
#include "kernel_emu.h"
|
#include "kernel_emu.h"
|
||||||
|
#include "haiku_fs_cache.h"
|
||||||
|
|
||||||
|
|
||||||
// constructor
|
// constructor
|
||||||
@@ -35,8 +36,22 @@ HaikuKernelVolume::Mount(const char* device, uint32 flags,
|
|||||||
{
|
{
|
||||||
if (!fFSModule->mount)
|
if (!fFSModule->mount)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
return fFSModule->mount(GetID(), device, flags, parameters, &fVolumeCookie,
|
|
||||||
rootID);
|
// make the volume know to the file cache emulation
|
||||||
|
status_t error
|
||||||
|
= UserlandFS::HaikuKernelEmu::file_cache_register_volume(this);
|
||||||
|
if (error != B_OK)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
// mount
|
||||||
|
error = fFSModule->mount(GetID(), device, flags, parameters,
|
||||||
|
&fVolumeCookie, rootID);
|
||||||
|
if (error != B_OK) {
|
||||||
|
UserlandFS::HaikuKernelEmu::file_cache_unregister_volume(this);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unmount
|
// Unmount
|
||||||
@@ -45,7 +60,14 @@ HaikuKernelVolume::Unmount()
|
|||||||
{
|
{
|
||||||
if (!fFSModule->unmount)
|
if (!fFSModule->unmount)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
return fFSModule->unmount(fVolumeCookie);
|
|
||||||
|
// unmount
|
||||||
|
status_t error = fFSModule->unmount(fVolumeCookie);
|
||||||
|
|
||||||
|
// unregister with the file cache emulation
|
||||||
|
UserlandFS::HaikuKernelEmu::file_cache_unregister_volume(this);
|
||||||
|
|
||||||
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sync
|
// Sync
|
||||||
@@ -76,6 +98,21 @@ HaikuKernelVolume::WriteFSInfo(const struct fs_info* info, uint32 mask)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark - file cache
|
||||||
|
|
||||||
|
|
||||||
|
// GetFileMap
|
||||||
|
status_t
|
||||||
|
HaikuKernelVolume::GetFileMap(fs_vnode node, off_t offset, size_t size,
|
||||||
|
struct file_io_vec* vecs, size_t* count)
|
||||||
|
{
|
||||||
|
if (!fFSModule->get_file_map)
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
return fFSModule->get_file_map(fVolumeCookie, node, offset, size, vecs,
|
||||||
|
count);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark - vnodes
|
// #pragma mark - vnodes
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,11 @@ public:
|
|||||||
virtual status_t WriteFSInfo(const struct fs_info* info,
|
virtual status_t WriteFSInfo(const struct fs_info* info,
|
||||||
uint32 mask);
|
uint32 mask);
|
||||||
|
|
||||||
|
// file cache
|
||||||
|
virtual status_t GetFileMap(fs_vnode node, off_t offset,
|
||||||
|
size_t size, struct file_io_vec* vecs,
|
||||||
|
size_t* count);
|
||||||
|
|
||||||
// vnodes
|
// vnodes
|
||||||
virtual status_t Lookup(fs_vnode dir, const char* entryName,
|
virtual status_t Lookup(fs_vnode dir, const char* entryName,
|
||||||
vnode_id* vnid, int* type);
|
vnode_id* vnid, int* type);
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ Application UserlandFSServer
|
|||||||
DispatcherFileSystem.cpp
|
DispatcherFileSystem.cpp
|
||||||
FileSystem.cpp
|
FileSystem.cpp
|
||||||
haiku_block_cache.cpp
|
haiku_block_cache.cpp
|
||||||
|
haiku_file_cache.cpp
|
||||||
haiku_hash.cpp
|
haiku_hash.cpp
|
||||||
haiku_lock.cpp
|
haiku_lock.cpp
|
||||||
HaikuKernelFileSystem.cpp
|
HaikuKernelFileSystem.cpp
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
#include "FileSystem.h"
|
#include "FileSystem.h"
|
||||||
#include "FSInfo.h"
|
#include "FSInfo.h"
|
||||||
#include "haiku_block_cache_priv.h"
|
#include "haiku_block_cache_priv.h"
|
||||||
|
#include "haiku_fs_cache.h"
|
||||||
#include "HaikuKernelFileSystem.h"
|
#include "HaikuKernelFileSystem.h"
|
||||||
#include "RequestThread.h"
|
#include "RequestThread.h"
|
||||||
#include "ServerDefs.h"
|
#include "ServerDefs.h"
|
||||||
@@ -281,6 +282,11 @@ UserlandFSServer::_CreateHaikuKernelInterface(const char* fsName,
|
|||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
RETURN_ERROR(error);
|
RETURN_ERROR(error);
|
||||||
|
|
||||||
|
// init file cache
|
||||||
|
error = UserlandFS::HaikuKernelEmu::file_cache_init();
|
||||||
|
if (error != B_OK)
|
||||||
|
RETURN_ERROR(error);
|
||||||
|
|
||||||
// init the FS
|
// init the FS
|
||||||
error = fileSystem->Init();
|
error = fileSystem->Init();
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -11,6 +11,9 @@
|
|||||||
|
|
||||||
|
|
||||||
namespace UserlandFS {
|
namespace UserlandFS {
|
||||||
|
|
||||||
|
class HaikuKernelVolume;
|
||||||
|
|
||||||
namespace HaikuKernelEmu {
|
namespace HaikuKernelEmu {
|
||||||
|
|
||||||
/* transactions */
|
/* transactions */
|
||||||
@@ -68,6 +71,11 @@ extern status_t file_cache_read(void *_cacheRef, off_t offset, void *bufferBase,
|
|||||||
extern status_t file_cache_write(void *_cacheRef, off_t offset,
|
extern status_t file_cache_write(void *_cacheRef, off_t offset,
|
||||||
const void *buffer, size_t *_size);
|
const void *buffer, size_t *_size);
|
||||||
|
|
||||||
|
// interface for the emulation layer
|
||||||
|
status_t file_cache_init();
|
||||||
|
status_t file_cache_register_volume(HaikuKernelVolume* volume);
|
||||||
|
status_t file_cache_unregister_volume(HaikuKernelVolume* volume);
|
||||||
|
|
||||||
} // namespace HaikuKernelEmu
|
} // namespace HaikuKernelEmu
|
||||||
} // namespace UserlandFS
|
} // namespace UserlandFS
|
||||||
|
|
||||||
|
|||||||
@@ -330,6 +330,81 @@ block_cache_put(void *_cache, off_t blockNumber)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark - File Cache
|
||||||
|
|
||||||
|
// file_cache_create
|
||||||
|
void *
|
||||||
|
file_cache_create(mount_id mountID, vnode_id vnodeID, off_t size, int fd)
|
||||||
|
{
|
||||||
|
return UserlandFS::HaikuKernelEmu::file_cache_create(mountID, vnodeID,
|
||||||
|
size, fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
// file_cache_delete
|
||||||
|
void
|
||||||
|
file_cache_delete(void *_cacheRef)
|
||||||
|
{
|
||||||
|
UserlandFS::HaikuKernelEmu::file_cache_delete(_cacheRef);
|
||||||
|
}
|
||||||
|
|
||||||
|
// file_cache_set_size
|
||||||
|
status_t
|
||||||
|
file_cache_set_size(void *_cacheRef, off_t size)
|
||||||
|
{
|
||||||
|
return UserlandFS::HaikuKernelEmu::file_cache_set_size(_cacheRef, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// file_cache_sync
|
||||||
|
status_t
|
||||||
|
file_cache_sync(void *_cache)
|
||||||
|
{
|
||||||
|
return UserlandFS::HaikuKernelEmu::file_cache_sync(_cache);
|
||||||
|
}
|
||||||
|
|
||||||
|
// file_cache_invalidate_file_map
|
||||||
|
status_t
|
||||||
|
file_cache_invalidate_file_map(void *_cacheRef, off_t offset, off_t size)
|
||||||
|
{
|
||||||
|
return UserlandFS::HaikuKernelEmu::file_cache_invalidate_file_map(
|
||||||
|
_cacheRef, offset, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// file_cache_read_pages
|
||||||
|
status_t
|
||||||
|
file_cache_read_pages(void *_cacheRef, off_t offset, const iovec *vecs,
|
||||||
|
size_t count, size_t *_numBytes)
|
||||||
|
{
|
||||||
|
return UserlandFS::HaikuKernelEmu::file_cache_read_pages(_cacheRef,
|
||||||
|
offset, vecs, count, _numBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
// file_cache_write_pages
|
||||||
|
status_t
|
||||||
|
file_cache_write_pages(void *_cacheRef, off_t offset, const iovec *vecs,
|
||||||
|
size_t count, size_t *_numBytes)
|
||||||
|
{
|
||||||
|
return UserlandFS::HaikuKernelEmu::file_cache_write_pages(_cacheRef,
|
||||||
|
offset, vecs, count, _numBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
// file_cache_read
|
||||||
|
status_t
|
||||||
|
file_cache_read(void *_cacheRef, off_t offset, void *bufferBase, size_t *_size)
|
||||||
|
{
|
||||||
|
return UserlandFS::HaikuKernelEmu::file_cache_read(_cacheRef, offset,
|
||||||
|
bufferBase, _size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// file_cache_write
|
||||||
|
status_t
|
||||||
|
file_cache_write(void *_cacheRef, off_t offset, const void *buffer,
|
||||||
|
size_t *_size)
|
||||||
|
{
|
||||||
|
return UserlandFS::HaikuKernelEmu::file_cache_write(_cacheRef, offset,
|
||||||
|
buffer, _size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark - Misc
|
// #pragma mark - Misc
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user