ramfs: Set the vnode's cache object when opening files.
Now it is possible to run applications, do Git checkouts, etc. on a ramfs (and those seem to work just fine -- a git checkout followed by a git fsck both succeeded.)
This commit is contained in:
parent
a9be0efb2e
commit
58a582ff22
@ -41,6 +41,15 @@ DataContainer::InitCheck() const
|
|||||||
return (fVolume != NULL ? B_OK : B_ERROR);
|
return (fVolume != NULL ? B_OK : B_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetCache
|
||||||
|
VMCache*
|
||||||
|
DataContainer::GetCache()
|
||||||
|
{
|
||||||
|
if (!_IsCacheMode())
|
||||||
|
_SwitchToCacheMode();
|
||||||
|
return fCache;
|
||||||
|
}
|
||||||
|
|
||||||
// Resize
|
// Resize
|
||||||
status_t
|
status_t
|
||||||
DataContainer::Resize(off_t newSize)
|
DataContainer::Resize(off_t newSize)
|
||||||
@ -63,7 +72,7 @@ DataContainer::Resize(off_t newSize)
|
|||||||
// grow
|
// grow
|
||||||
if (_RequiresCacheMode(newSize)) {
|
if (_RequiresCacheMode(newSize)) {
|
||||||
if (!_IsCacheMode())
|
if (!_IsCacheMode())
|
||||||
error = _SwitchToCacheMode(fSize);
|
error = _SwitchToCacheMode();
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
@ -187,7 +196,7 @@ DataContainer::_CountBlocks() const
|
|||||||
|
|
||||||
// _SwitchToCacheMode
|
// _SwitchToCacheMode
|
||||||
status_t
|
status_t
|
||||||
DataContainer::_SwitchToCacheMode(size_t newBlockSize)
|
DataContainer::_SwitchToCacheMode()
|
||||||
{
|
{
|
||||||
status_t error = VMCacheFactory::CreateAnonymousCache(fCache, false, 0,
|
status_t error = VMCacheFactory::CreateAnonymousCache(fCache, false, 0,
|
||||||
0, false, VM_PRIORITY_SYSTEM);
|
0, false, VM_PRIORITY_SYSTEM);
|
||||||
@ -195,9 +204,9 @@ DataContainer::_SwitchToCacheMode(size_t newBlockSize)
|
|||||||
return error;
|
return error;
|
||||||
|
|
||||||
fCache->temporary = 1;
|
fCache->temporary = 1;
|
||||||
fCache->virtual_end = newBlockSize;
|
fCache->virtual_end = fSize;
|
||||||
|
|
||||||
error = fCache->Commit(newBlockSize, VM_PRIORITY_SYSTEM);
|
error = fCache->Commit(fSize, VM_PRIORITY_SYSTEM);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
@ -46,6 +46,8 @@ public:
|
|||||||
status_t Resize(off_t newSize);
|
status_t Resize(off_t newSize);
|
||||||
off_t GetSize() const { return fSize; }
|
off_t GetSize() const { return fSize; }
|
||||||
|
|
||||||
|
VMCache* GetCache();
|
||||||
|
|
||||||
virtual status_t ReadAt(off_t offset, void *buffer, size_t size,
|
virtual status_t ReadAt(off_t offset, void *buffer, size_t size,
|
||||||
size_t *bytesRead);
|
size_t *bytesRead);
|
||||||
virtual status_t WriteAt(off_t offset, const void *buffer, size_t size,
|
virtual status_t WriteAt(off_t offset, const void *buffer, size_t size,
|
||||||
@ -57,7 +59,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
inline bool _RequiresCacheMode(size_t size);
|
inline bool _RequiresCacheMode(size_t size);
|
||||||
inline bool _IsCacheMode() const;
|
inline bool _IsCacheMode() const;
|
||||||
status_t _SwitchToCacheMode(size_t newBlockSize);
|
status_t _SwitchToCacheMode();
|
||||||
void _GetPages(off_t offset, off_t length, bool isWrite, vm_page** pages);
|
void _GetPages(off_t offset, off_t length, bool isWrite, vm_page** pages);
|
||||||
void _PutPages(off_t offset, off_t length, vm_page** pages, bool success);
|
void _PutPages(off_t offset, off_t length, vm_page** pages, bool success);
|
||||||
status_t _DoCacheIO(const off_t offset, uint8* buffer, ssize_t length,
|
status_t _DoCacheIO(const off_t offset, uint8* buffer, ssize_t length,
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
#include <fs_interface.h>
|
#include <fs_interface.h>
|
||||||
#include <fs_query.h>
|
#include <fs_query.h>
|
||||||
#include <fs_volume.h>
|
#include <fs_volume.h>
|
||||||
|
#include <vfs.h>
|
||||||
#include <KernelExport.h>
|
#include <KernelExport.h>
|
||||||
#include <NodeMonitor.h>
|
#include <NodeMonitor.h>
|
||||||
#include <TypeConstants.h>
|
#include <TypeConstants.h>
|
||||||
@ -227,9 +228,9 @@ SET_ERROR(error, error);
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ramfs_read_vnode
|
// ramfs_get_vnode
|
||||||
static status_t
|
static status_t
|
||||||
ramfs_read_vnode(fs_volume* _volume, ino_t vnid, fs_vnode* node, int* _type,
|
ramfs_get_vnode(fs_volume* _volume, ino_t vnid, fs_vnode* node, int* _type,
|
||||||
uint32* _flags, bool reenter)
|
uint32* _flags, bool reenter)
|
||||||
{
|
{
|
||||||
// FUNCTION_START();
|
// FUNCTION_START();
|
||||||
@ -889,6 +890,13 @@ ramfs_open(fs_volume* _volume, fs_vnode* _node, int openMode, void** _cookie)
|
|||||||
// truncate if requested
|
// truncate if requested
|
||||||
if (error == B_OK && (openMode & O_TRUNC))
|
if (error == B_OK && (openMode & O_TRUNC))
|
||||||
error = node->SetSize(0);
|
error = node->SetSize(0);
|
||||||
|
// set cache in vnode
|
||||||
|
if (File *file = dynamic_cast<File*>(node)) {
|
||||||
|
struct vnode* vnode;
|
||||||
|
if (vfs_lookup_vnode(_volume->id, node->GetID(), &vnode) == B_OK) {
|
||||||
|
vfs_set_vnode_cache(vnode, file->GetCache());
|
||||||
|
}
|
||||||
|
}
|
||||||
NodeMTimeUpdater mTimeUpdater(node);
|
NodeMTimeUpdater mTimeUpdater(node);
|
||||||
// set result / cleanup on failure
|
// set result / cleanup on failure
|
||||||
if (error == B_OK)
|
if (error == B_OK)
|
||||||
@ -2146,7 +2154,7 @@ fs_volume_ops gRamFSVolumeOps = {
|
|||||||
&ramfs_read_fs_info,
|
&ramfs_read_fs_info,
|
||||||
&ramfs_write_fs_info,
|
&ramfs_write_fs_info,
|
||||||
&ramfs_sync,
|
&ramfs_sync,
|
||||||
&ramfs_read_vnode,
|
&ramfs_get_vnode,
|
||||||
|
|
||||||
/* index directory & index operations */
|
/* index directory & index operations */
|
||||||
&ramfs_open_index_dir,
|
&ramfs_open_index_dir,
|
||||||
|
Loading…
Reference in New Issue
Block a user