tweak the last of the nodes; break apart old style file_system_module_info; add fVolume to Volume to replicate bfs style

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42042 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Alexander von Gluck IV
2011-06-08 02:25:42 +00:00
parent 84a474186f
commit 6305a11cd4
3 changed files with 178 additions and 137 deletions
@@ -130,36 +130,40 @@ class EntryListenerTree : public _EntryListenerTree {};
*/ */
// constructor // constructor
Volume::Volume() Volume::Volume(fs_volume* volume)
: fID(0), :
fNextNodeID(kRootParentID + 1), fVolume(volume),
fNodeTable(NULL), fID(0),
fDirectoryEntryTable(NULL), fNextNodeID(kRootParentID + 1),
fNodeAttributeTable(NULL), fNodeTable(NULL),
fIndexDirectory(NULL), fDirectoryEntryTable(NULL),
fRootDirectory(NULL), fNodeAttributeTable(NULL),
fName(kDefaultVolumeName), fIndexDirectory(NULL),
fLocker("volume"), fRootDirectory(NULL),
fIteratorLocker("iterators"), fName(kDefaultVolumeName),
fQueryLocker("queries"), fLocker("volume"),
fNodeListeners(NULL), fIteratorLocker("iterators"),
fAnyNodeListeners(), fQueryLocker("queries"),
fEntryListeners(NULL), fNodeListeners(NULL),
fAnyEntryListeners(), fAnyNodeListeners(),
fBlockAllocator(NULL), fEntryListeners(NULL),
fBlockSize(kDefaultBlockSize), fAnyEntryListeners(),
fAllocatedBlocks(0), fBlockAllocator(NULL),
fAccessTime(0), fBlockSize(kDefaultBlockSize),
fMounted(false) fAllocatedBlocks(0),
fAccessTime(0),
fMounted(false)
{ {
} }
// destructor // destructor
Volume::~Volume() Volume::~Volume()
{ {
Unmount(); Unmount();
} }
// Mount // Mount
status_t status_t
Volume::Mount(dev_t id) Volume::Mount(dev_t id)
@@ -100,6 +100,7 @@ public:
status_t Unmount(); status_t Unmount();
dev_t GetID() const { return fID; } dev_t GetID() const { return fID; }
fs_volume* FSVolume() const { return fVolume; }
off_t GetBlockSize() const; off_t GetBlockSize() const;
off_t CountBlocks() const; off_t CountBlocks() const;
@@ -176,6 +177,9 @@ public:
bool IteratorLock(); bool IteratorLock();
void IteratorUnlock(); void IteratorUnlock();
protected:
fs_volume* fVolume;
private: private:
typedef DoublyLinkedList<Query> QueryList; typedef DoublyLinkedList<Query> QueryList;
@@ -186,7 +186,7 @@ ramfs_lookup(fs_volume* _volume, fs_vnode* _dir, const char *entryName,
{ {
// FUNCTION_START(); // FUNCTION_START();
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Directory *dir = dynamic_cast<Directory*>((Node*)_dir); Directory* dir = dynamic_cast<Directory*>((Node*)_dir);
FUNCTION(("dir: (%llu), entry: `%s'\n", (dir ? dir->GetID() : -1), FUNCTION(("dir: (%llu), entry: `%s'\n", (dir ? dir->GetID() : -1),
entryName)); entryName));
@@ -241,7 +241,7 @@ ramfs_read_vnode(fs_volume* _volume, ino_t vnid, fs_vnode* node, bool reenter)
if (VolumeReadLocker locker = volume) { if (VolumeReadLocker locker = volume) {
error = volume->FindNode(vnid, &foundNode); error = volume->FindNode(vnid, &foundNode);
if (error == B_OK) if (error == B_OK)
*node = foundNode; node->private_node = foundNode;
} else } else
SET_ERROR(error, B_ERROR); SET_ERROR(error, B_ERROR);
RETURN_ERROR(error); RETURN_ERROR(error);
@@ -270,7 +270,7 @@ ramfs_remove_vnode(fs_volume* _volume, fs_vnode* _node, bool /*reenter*/)
{ {
FUNCTION(("node: %Ld\n", ((Node*)_node)->GetID())); FUNCTION(("node: %Ld\n", ((Node*)_node)->GetID()));
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node* node = (Node*)_node; Node* node = (Node*)_node->private_node;
status_t error = B_OK; status_t error = B_OK;
if (VolumeWriteLocker locker = volume) { if (VolumeWriteLocker locker = volume) {
@@ -357,13 +357,13 @@ ramfs_fsync(fs_volume /*fs*/, fs_vnode /*node*/)
// ramfs_read_symlink // ramfs_read_symlink
static status_t static status_t
ramfs_read_symlink(fs_volume* _volume, fs_vnode _node, char *buffer, ramfs_read_symlink(fs_volume* _volume, fs_vnode* _node, char *buffer,
size_t *bufferSize) size_t *bufferSize)
{ {
FUNCTION_START(); FUNCTION_START();
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node* node = (Node*)_node->private_node;
Node *node = (Node*)_node;
status_t error = B_OK; status_t error = B_OK;
if (VolumeReadLocker locker = volume) { if (VolumeReadLocker locker = volume) {
// read symlinks only // read symlinks only
@@ -391,13 +391,13 @@ ramfs_read_symlink(fs_volume* _volume, fs_vnode _node, char *buffer,
// ramfs_create_symlink // ramfs_create_symlink
static status_t static status_t
ramfs_create_symlink(fs_volume* _volume, fs_vnode _dir, const char *name, ramfs_create_symlink(fs_volume* _volume, fs_vnode* _dir, const char *name,
const char *path, int mode) const char *path, int mode)
{ {
FUNCTION(("name: `%s', path: `%s'\n", name, path)); FUNCTION(("name: `%s', path: `%s'\n", name, path));
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Directory* dir = dynamic_cast<Directory*>((Node*)_dir->private_node);
Directory *dir = dynamic_cast<Directory*>((Node*)_dir);
status_t error = B_OK; status_t error = B_OK;
// check name // check name
if (!name || *name == '\0') { if (!name || *name == '\0') {
@@ -409,8 +409,8 @@ ramfs_create_symlink(fs_volume* _volume, fs_vnode _dir, const char *name,
NodeMTimeUpdater mTimeUpdater(dir); NodeMTimeUpdater mTimeUpdater(dir);
// directory deleted? // directory deleted?
bool removed; bool removed;
if (get_vnode_removed(volume->GetID(), dir->GetID(), &removed) != B_OK if (get_vnode_removed(volume->FSVolume(), dir->GetID(), &removed)
|| removed) { != B_OK || removed) {
SET_ERROR(error, B_NOT_ALLOWED); SET_ERROR(error, B_NOT_ALLOWED);
} }
// check directory write permissions // check directory write permissions
@@ -449,13 +449,14 @@ ramfs_create_symlink(fs_volume* _volume, fs_vnode _dir, const char *name,
// ramfs_link // ramfs_link
static status_t static status_t
ramfs_link(fs_volume* _volume, fs_vnode _dir, const char *name, fs_vnode _node) ramfs_link(fs_volume* _volume, fs_vnode* _dir, const char *name,
fs_vnode* _node)
{ {
FUNCTION(("name: `%s'\n", name)); FUNCTION(("name: `%s'\n", name));
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Directory* dir = dynamic_cast<Directory*>((Node*)_dir->private_node);
Node* node = (Node*)_node->private_node;
Directory *dir = dynamic_cast<Directory*>((Node*)_dir);
Node *node = (Node*)_node;
status_t error = B_OK; status_t error = B_OK;
// check directory // check directory
if (!dir) { if (!dir) {
@@ -464,8 +465,8 @@ ramfs_link(fs_volume* _volume, fs_vnode _dir, const char *name, fs_vnode _node)
NodeMTimeUpdater mTimeUpdater(dir); NodeMTimeUpdater mTimeUpdater(dir);
// directory deleted? // directory deleted?
bool removed; bool removed;
if (get_vnode_removed(volume->GetID(), dir->GetID(), &removed) != B_OK if (get_vnode_removed(volume->FSVolume(), dir->GetID(), &removed)
|| removed) { != B_OK || removed) {
SET_ERROR(error, B_NOT_ALLOWED); SET_ERROR(error, B_NOT_ALLOWED);
} }
// check directory write permissions // check directory write permissions
@@ -493,13 +494,13 @@ ramfs_link(fs_volume* _volume, fs_vnode _dir, const char *name, fs_vnode _node)
// ramfs_unlink // ramfs_unlink
static status_t static status_t
ramfs_unlink(fs_volume* _volume, fs_vnode _dir, const char *name) ramfs_unlink(fs_volume* _volume, fs_vnode* _dir, const char *name)
{ {
FUNCTION(("name: `%s'\n", name)); FUNCTION(("name: `%s'\n", name));
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Directory* dir = dynamic_cast<Directory*>((Node*)_dir->private_node);
Directory *dir = dynamic_cast<Directory*>((Node*)_dir);
status_t error = B_OK; status_t error = B_OK;
// check name // check name
if (!name || *name == '\0' || !strcmp(name, ".") || !strcmp(name, "..")) { if (!name || *name == '\0' || !strcmp(name, ".") || !strcmp(name, "..")) {
SET_ERROR(error, B_BAD_VALUE); SET_ERROR(error, B_BAD_VALUE);
@@ -538,13 +539,13 @@ ramfs_unlink(fs_volume* _volume, fs_vnode _dir, const char *name)
// ramfs_rename // ramfs_rename
static status_t static status_t
ramfs_rename(fs_volume* _volume, fs_vnode _oldDir, const char *oldName, ramfs_rename(fs_volume* _volume, fs_vnode* _oldDir, const char *oldName,
fs_vnode _newDir, const char *newName) fs_vnode* _newDir, const char *newName)
{ {
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Directory *oldDir = dynamic_cast<Directory*>((Node*)_oldDir); Directory* oldDir = dynamic_cast<Directory*>((Node*)_oldDir->private_node);
Directory *newDir = dynamic_cast<Directory*>((Node*)_newDir); Directory* newDir = dynamic_cast<Directory*>((Node*)_newDir->private_node);
status_t error = B_OK; status_t error = B_OK;
if (VolumeWriteLocker locker = volume) { if (VolumeWriteLocker locker = volume) {
@@ -555,9 +556,8 @@ oldDir->GetID(), oldName, newDir->GetID(), newName));
// target directory deleted? // target directory deleted?
bool removed; bool removed;
if (get_vnode_removed(volume->GetID(), newDir->GetID(), &removed) if (get_vnode_removed(volume->FSVolume(), newDir->GetID(), &removed)
!= B_OK != B_OK || removed) {
|| removed) {
SET_ERROR(error, B_NOT_ALLOWED); SET_ERROR(error, B_NOT_ALLOWED);
} }
@@ -656,11 +656,11 @@ oldDir->GetID(), oldName, newDir->GetID(), newName));
// ramfs_access // ramfs_access
static status_t static status_t
ramfs_access(fs_volume* _volume, fs_vnode _node, int mode) ramfs_access(fs_volume* _volume, fs_vnode* _node, int mode)
{ {
FUNCTION_START(); FUNCTION_START();
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node *node = (Node*)_node; Node* node = (Node*)_node->private_node;
status_t error = B_OK; status_t error = B_OK;
if (VolumeReadLocker locker = volume) { if (VolumeReadLocker locker = volume) {
@@ -673,11 +673,11 @@ ramfs_access(fs_volume* _volume, fs_vnode _node, int mode)
// ramfs_read_stat // ramfs_read_stat
static status_t static status_t
ramfs_read_stat(fs_volume* _volume, fs_vnode _node, struct stat *st) ramfs_read_stat(fs_volume* _volume, fs_vnode* _node, struct stat *st)
{ {
// FUNCTION_START(); // FUNCTION_START();
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node *node = (Node*)_node; Node* node = (Node*)_node->private_node;
FUNCTION(("node: %Ld\n", node->GetID())); FUNCTION(("node: %Ld\n", node->GetID()));
status_t error = B_OK; status_t error = B_OK;
@@ -702,11 +702,11 @@ ramfs_read_stat(fs_volume* _volume, fs_vnode _node, struct stat *st)
// ramfs_write_stat // ramfs_write_stat
static status_t static status_t
ramfs_write_stat(fs_volume* _volume, fs_vnode _node, const struct stat *st, ramfs_write_stat(fs_volume* _volume, fs_vnode* _node, const struct stat *st,
uint32 mask) uint32 mask)
{ {
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node *node = (Node*)_node; Node* node = (Node*)_node->private_node;
FUNCTION(("mask: %lx\n", mask)); FUNCTION(("mask: %lx\n", mask));
status_t error = B_OK; status_t error = B_OK;
@@ -779,14 +779,14 @@ private:
// ramfs_create // ramfs_create
static status_t static status_t
ramfs_create(fs_volume* _volume, fs_vnode _dir, const char *name, int openMode, ramfs_create(fs_volume* _volume, fs_vnode* _dir, const char *name, int openMode,
int mode, void** _cookie, ino_t *vnid) int mode, void** _cookie, ino_t *vnid)
{ {
// FUNCTION_START(); // FUNCTION_START();
FUNCTION(("name: `%s', open mode: %x, mode: %x\n", name, openMode, mode)); FUNCTION(("name: `%s', open mode: %x, mode: %x\n", name, openMode, mode));
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Directory* dir = dynamic_cast<Directory*>((Node*)_dir->private_node);
Directory *dir = dynamic_cast<Directory*>((Node*)_dir);
status_t error = B_OK; status_t error = B_OK;
// check name // check name
if (!name || *name == '\0') { if (!name || *name == '\0') {
@@ -798,8 +798,8 @@ ramfs_create(fs_volume* _volume, fs_vnode _dir, const char *name, int openMode,
NodeMTimeUpdater mTimeUpdater(dir); NodeMTimeUpdater mTimeUpdater(dir);
// directory deleted? // directory deleted?
bool removed; bool removed;
if (get_vnode_removed(volume->GetID(), dir->GetID(), &removed) != B_OK if (get_vnode_removed(volume->FSVolume(), dir->GetID(), &removed)
|| removed) { != B_OK || removed) {
SET_ERROR(error, B_NOT_ALLOWED); SET_ERROR(error, B_NOT_ALLOWED);
} }
// create the file cookie // create the file cookie
@@ -864,11 +864,11 @@ ramfs_create(fs_volume* _volume, fs_vnode _dir, const char *name, int openMode,
// ramfs_open // ramfs_open
static status_t static status_t
ramfs_open(fs_volume* _volume, fs_vnode _node, int openMode, void** _cookie) ramfs_open(fs_volume* _volume, fs_vnode* _node, int openMode, void** _cookie)
{ {
// FUNCTION_START(); // FUNCTION_START();
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node *node = (Node*)_node; Node* node = (Node*)_node->private_node;
FUNCTION(("node: %Ld\n", node->GetID())); FUNCTION(("node: %Ld\n", node->GetID()));
status_t error = B_OK; status_t error = B_OK;
@@ -907,11 +907,11 @@ ramfs_open(fs_volume* _volume, fs_vnode _node, int openMode, void** _cookie)
// ramfs_close // ramfs_close
static status_t static status_t
ramfs_close(fs_volume* _volume, fs_vnode _node, void** /*cookie*/) ramfs_close(fs_volume* _volume, fs_vnode* _node, void** /*cookie*/)
{ {
// FUNCTION_START(); // FUNCTION_START();
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node *node = (Node*)_node; Node* node = (Node*)_node->private_node;
FUNCTION(("node: %Ld\n", node->GetID())); FUNCTION(("node: %Ld\n", node->GetID()));
status_t error = B_OK; status_t error = B_OK;
@@ -938,12 +938,12 @@ ramfs_free_cookie(fs_volume /*fs*/, fs_vnode /*_node*/, void** _cookie)
// ramfs_read // ramfs_read
static status_t static status_t
ramfs_read(fs_volume* _volume, fs_vnode _node, void** _cookie, off_t pos, ramfs_read(fs_volume* _volume, fs_vnode* _node, void** _cookie, off_t pos,
void *buffer, size_t *bufferSize) void *buffer, size_t *bufferSize)
{ {
// FUNCTION_START(); // FUNCTION_START();
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node *node = (Node*)_node; Node* node = (Node*)_node->private_node;
FileCookie *cookie = (FileCookie*)_cookie; FileCookie *cookie = (FileCookie*)_cookie;
// FUNCTION(("((%lu, %lu), %Ld, %p, %lu)\n", node->GetDirID(), // FUNCTION(("((%lu, %lu), %Ld, %p, %lu)\n", node->GetDirID(),
@@ -975,12 +975,12 @@ ramfs_read(fs_volume* _volume, fs_vnode _node, void** _cookie, off_t pos,
// ramfs_write // ramfs_write
static status_t static status_t
ramfs_write(fs_volume* _volume, fs_vnode _node, void** _cookie, off_t pos, ramfs_write(fs_volume* _volume, fs_vnode* _node, void** _cookie, off_t pos,
const void *buffer, size_t *bufferSize) const void *buffer, size_t *bufferSize)
{ {
// FUNCTION_START(); // FUNCTION_START();
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node *node = (Node*)_node; Node* node = (Node*)_node->private_node;
FileCookie *cookie = (FileCookie*)_cookie; FileCookie *cookie = (FileCookie*)_cookie;
// FUNCTION(("((%lu, %lu), %Ld, %p, %lu)\n", node->GetDirID(), // FUNCTION(("((%lu, %lu), %Ld, %p, %lu)\n", node->GetDirID(),
@@ -1107,12 +1107,12 @@ vint32 DirectoryCookie::fNextIteratorID = 0;
// ramfs_create_dir // ramfs_create_dir
static status_t static status_t
ramfs_create_dir(fs_volume* _volume, fs_vnode _dir, const char *name, int mode) ramfs_create_dir(fs_volume* _volume, fs_vnode* _dir, const char *name, int mode)
{ {
FUNCTION(("name: `%s', mode: %x\n", name, mode)); FUNCTION(("name: `%s', mode: %x\n", name, mode));
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Directory* dir = dynamic_cast<Directory*>((Node*)_dir->private_node);
Directory *dir = dynamic_cast<Directory*>((Node*)_dir);
status_t error = B_OK; status_t error = B_OK;
// check name // check name
if (!name || *name == '\0') { if (!name || *name == '\0') {
@@ -1124,8 +1124,8 @@ ramfs_create_dir(fs_volume* _volume, fs_vnode _dir, const char *name, int mode)
NodeMTimeUpdater mTimeUpdater(dir); NodeMTimeUpdater mTimeUpdater(dir);
// directory deleted? // directory deleted?
bool removed; bool removed;
if (get_vnode_removed(volume->GetID(), dir->GetID(), &removed) != B_OK if (get_vnode_removed(volume->FSVolume(), dir->GetID(), &removed)
|| removed) { != B_OK || removed) {
SET_ERROR(error, B_NOT_ALLOWED); SET_ERROR(error, B_NOT_ALLOWED);
} }
// check directory write permissions // check directory write permissions
@@ -1164,13 +1164,13 @@ ramfs_create_dir(fs_volume* _volume, fs_vnode _dir, const char *name, int mode)
// ramfs_remove_dir // ramfs_remove_dir
static status_t static status_t
ramfs_remove_dir(fs_volume* _volume, fs_vnode _dir, const char *name) ramfs_remove_dir(fs_volume* _volume, fs_vnode* _dir, const char *name)
{ {
FUNCTION(("name: `%s'\n", name)); FUNCTION(("name: `%s'\n", name));
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Directory* dir = dynamic_cast<Directory*>((Node*)_dir->private_node);
Directory *dir = dynamic_cast<Directory*>((Node*)_dir);
status_t error = B_OK; status_t error = B_OK;
// check name // check name
if (!name || *name == '\0' || !strcmp(name, ".") || !strcmp(name, "..")) { if (!name || *name == '\0' || !strcmp(name, ".") || !strcmp(name, "..")) {
SET_ERROR(error, B_BAD_VALUE); SET_ERROR(error, B_BAD_VALUE);
@@ -1209,12 +1209,13 @@ ramfs_remove_dir(fs_volume* _volume, fs_vnode _dir, const char *name)
// ramfs_open_dir // ramfs_open_dir
static status_t static status_t
ramfs_open_dir(fs_volume /*fs*/, fs_vnode _node, void** _cookie) ramfs_open_dir(fs_volume /*fs*/, fs_vnode* _node, void** _cookie)
{ {
// FUNCTION_START(); // FUNCTION_START();
// Volume *volume = (Volume*)fs; // Volume *volume = (Volume*)fs;
Node *node = (Node*)_node; Node* node = (Node*)_node->private_node;
FUNCTION(("dir: (%Lu)\n", node->GetID()));
FUNCTION(("dir: (%Lu)\n", node->GetID()));
// get the Directory // get the Directory
status_t error = (node->IsDirectory() ? B_OK : B_NOT_A_DIRECTORY); status_t error = (node->IsDirectory() ? B_OK : B_NOT_A_DIRECTORY);
Directory *dir = NULL; Directory *dir = NULL;
@@ -1248,7 +1249,7 @@ static status_t
ramfs_close_dir(fs_volume /*fs*/, fs_vnode DARG(_node), void** _cookie) ramfs_close_dir(fs_volume /*fs*/, fs_vnode DARG(_node), void** _cookie)
{ {
FUNCTION_START(); FUNCTION_START();
FUNCTION(("dir: (%Lu)\n", ((Node*)_node)->GetID())); FUNCTION(("dir: (%Lu)\n", ((Node*)_node)->GetID()));
// No locking needed, since the Directory is guaranteed to live at this // No locking needed, since the Directory is guaranteed to live at this
// time and for iterators there is a separate locking. // time and for iterators there is a separate locking.
DirectoryCookie *cookie = (DirectoryCookie*)_cookie; DirectoryCookie *cookie = (DirectoryCookie*)_cookie;
@@ -1333,11 +1334,11 @@ ramfs_rewind_dir(fs_volume /*fs*/, fs_vnode /*_node*/, void** _cookie)
// ramfs_open_attr_dir // ramfs_open_attr_dir
static status_t static status_t
ramfs_open_attr_dir(fs_volume* _volume, fs_vnode _node, void** _cookie) ramfs_open_attr_dir(fs_volume* _volume, fs_vnode* _node, void** _cookie)
{ {
FUNCTION_START(); FUNCTION_START();
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node *node = (Node*)_node; Node* node = (Node*)_node->private_node;
status_t error = B_OK; status_t error = B_OK;
if (VolumeReadLocker locker = volume) { if (VolumeReadLocker locker = volume) {
@@ -1490,12 +1491,12 @@ private:
// ramfs_create_attr // ramfs_create_attr
static status_t static status_t
ramfs_create_attr(fs_volume* _volume, fs_vnode _node, const char *name, ramfs_create_attr(fs_volume* _volume, fs_vnode* _node, const char *name,
uint32 type, int openMode, void** _cookie) uint32 type, int openMode, void** _cookie)
{ {
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node *node = (Node*)_node; Node* node = (Node*)_node->private_node;
if (VolumeWriteLocker locker = volume) { if (VolumeWriteLocker locker = volume) {
// try to find the attribute // try to find the attribute
@@ -1561,12 +1562,12 @@ ramfs_create_attr(fs_volume* _volume, fs_vnode _node, const char *name,
// ramfs_open_attr // ramfs_open_attr
static status_t static status_t
ramfs_open_attr(fs_volume* _volume, fs_vnode _node, const char *name, ramfs_open_attr(fs_volume* _volume, fs_vnode* _node, const char *name,
int openMode, void** _cookie) int openMode, void** _cookie)
{ {
// FUNCTION_START(); // FUNCTION_START();
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node *node = (Node*)_node; Node* node = (Node*)_node->private_node;
FUNCTION(("node: %lld\n", node->GetID())); FUNCTION(("node: %lld\n", node->GetID()));
status_t error = B_OK; status_t error = B_OK;
@@ -1621,11 +1622,11 @@ ramfs_open_attr(fs_volume* _volume, fs_vnode _node, const char *name,
// ramfs_close_attr // ramfs_close_attr
static status_t static status_t
ramfs_close_attr(fs_volume* _volume, fs_vnode _node, void** _cookie) ramfs_close_attr(fs_volume* _volume, fs_vnode* _node, void** _cookie)
{ {
// FUNCTION_START(); // FUNCTION_START();
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node *node = (Node*)_node; Node* node = (Node*)_node->private_node;
FUNCTION(("node: %lld\n", node->GetID())); FUNCTION(("node: %lld\n", node->GetID()));
status_t error = B_OK; status_t error = B_OK;
@@ -1653,12 +1654,13 @@ ramfs_free_attr_cookie(fs_volume /*fs*/, fs_vnode /*_node*/, void** _cookie)
// ramfs_read_attr // ramfs_read_attr
static status_t static status_t
ramfs_read_attr(fs_volume* _volume, fs_vnode _node, void** _cookie, off_t pos, ramfs_read_attr(fs_volume* _volume, fs_vnode* _node, void** _cookie, off_t pos,
void *buffer, size_t *bufferSize) void *buffer, size_t *bufferSize)
{ {
// FUNCTION_START(); // FUNCTION_START();
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node *node = (Node*)_node; Node* node = (Node*)_node->private_node;
AttributeCookie *cookie = (AttributeCookie*)_cookie; AttributeCookie *cookie = (AttributeCookie*)_cookie;
status_t error = B_OK; status_t error = B_OK;
@@ -1684,12 +1686,12 @@ ramfs_read_attr(fs_volume* _volume, fs_vnode _node, void** _cookie, off_t pos,
// ramfs_write_attr // ramfs_write_attr
static status_t static status_t
ramfs_write_attr(fs_volume* _volume, fs_vnode _node, void** _cookie, ramfs_write_attr(fs_volume* _volume, fs_vnode* _node, void** _cookie,
off_t pos, const void *buffer, size_t *bufferSize) off_t pos, const void *buffer, size_t *bufferSize)
{ {
// FUNCTION_START(); // FUNCTION_START();
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node *node = (Node*)_node; Node* node = (Node*)_node->private_node;
AttributeCookie *cookie = (AttributeCookie*)_cookie; AttributeCookie *cookie = (AttributeCookie*)_cookie;
status_t error = B_OK; status_t error = B_OK;
@@ -1733,12 +1735,12 @@ ramfs_write_attr(fs_volume* _volume, fs_vnode _node, void** _cookie,
// ramfs_read_attr_stat // ramfs_read_attr_stat
static status_t static status_t
ramfs_read_attr_stat(fs_volume* _volume, fs_vnode _node, void** _cookie, ramfs_read_attr_stat(fs_volume* _volume, fs_vnode* _node, void** _cookie,
struct stat *st) struct stat *st)
{ {
// FUNCTION_START(); // FUNCTION_START();
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node *node = (Node*)_node; Node* node = (Node*)_node->private_node;
AttributeCookie *cookie = (AttributeCookie*)_cookie; AttributeCookie *cookie = (AttributeCookie*)_cookie;
status_t error = B_OK; status_t error = B_OK;
@@ -1776,12 +1778,11 @@ ramfs_rename_attr(fs_volume /*fs*/, fs_vnode /*_fromNode*/,
// ramfs_remove_attr // ramfs_remove_attr
static status_t static status_t
ramfs_remove_attr(fs_volume* _volume, fs_vnode _node, const char *name) ramfs_remove_attr(fs_volume* _volume, fs_vnode* _node, const char *name)
{ {
FUNCTION_START(); FUNCTION_START();
Volume* volume = (Volume*)_volume->private_volume; Volume* volume = (Volume*)_volume->private_volume;
Node *node = (Node*)_node; Node* node = (Node*)_node->private_node;
status_t error = B_OK; status_t error = B_OK;
if (VolumeWriteLocker locker = volume) { if (VolumeWriteLocker locker = volume) {
@@ -2145,47 +2146,55 @@ ramfs_std_ops(int32 op, ...)
} }
static file_system_module_info sRamFSModuleInfo = { fs_volume_ops gRamFSVolumeOps = {
{
"file_systems/ramfs" B_CURRENT_FS_API_VERSION,
0,
ramfs_std_ops,
},
"ramfs", // short_name
"RAM File System", // pretty_name
B_DISK_SYSTEM_SUPPORTS_WRITING, // DDM flags
// scanning
NULL, // identify_partition()
NULL, // scan_partition()
NULL, // free_identify_partition_cookie()
NULL, // free_partition_content_cookie()
&ramfs_mount,
&ramfs_unmount, &ramfs_unmount,
&ramfs_read_fs_info, &ramfs_read_fs_info,
&ramfs_write_fs_info, &ramfs_write_fs_info,
&ramfs_sync, &ramfs_sync,
&ramfs_get_vnode,
/* index directory & index operations */
&ramfs_open_index_dir,
&ramfs_close_index_dir,
&ramfs_free_index_dir_cookie,
&ramfs_read_index_dir,
&ramfs_rewind_index_dir,
&ramfs_create_index,
&ramfs_remove_index,
&ramfs_read_index_stat,
/* query operations */
&ramfs_open_query,
&ramfs_close_query,
&ramfs_free_query_cookie,
&ramfs_read_query,
NULL // rewind_query
};
fs_vnode_ops gRamFSVnodeOps = {
/* vnode operations */ /* vnode operations */
&ramfs_lookup, &ramfs_lookup, // lookup
NULL, // &ramfs_get_vnode_name, NULL, // get name
&ramfs_read_vnode, &ramfs_read_vnode, // read
&ramfs_write_vnode, &ramfs_write_vnode, // write
&ramfs_remove_vnode, &ramfs_remove_vnode, // remove
/* VM file access */ /* VM file access */
NULL, // &ramfs_can_page, NULL, // can_page
NULL, // &ramfs_read_pages, NULL, // read pages
NULL, // &ramfs_write_pages, NULL, // write pages
NULL, // &ramfs_get_file_map, NULL, // io?
NULL, // cancel io
NULL, // get file map
&ramfs_ioctl, &ramfs_ioctl,
&ramfs_set_flags, &ramfs_set_flags,
NULL, // &ramfs_select, NULL, // &ramfs_select,
NULL, // &ramfs_deselect, NULL, // &ramfs_deselect,
&ramfs_fsync, &ramfs_fsync,
&ramfs_read_symlink, &ramfs_read_symlink,
@@ -2198,7 +2207,7 @@ static file_system_module_info sRamFSModuleInfo = {
&ramfs_access, &ramfs_access,
&ramfs_read_stat, &ramfs_read_stat,
&ramfs_write_stat, &ramfs_write_stat,
NULL, // &ramfs_preallocate, NULL, // &ramfs_preallocate,
/* file operations */ /* file operations */
&ramfs_create, &ramfs_create,
@@ -2233,27 +2242,51 @@ static file_system_module_info sRamFSModuleInfo = {
&ramfs_write_attr, &ramfs_write_attr,
&ramfs_read_attr_stat, &ramfs_read_attr_stat,
NULL, // &ramfs_write_attr_stat, NULL, // &ramfs_write_attr_stat,
&ramfs_rename_attr, &ramfs_rename_attr,
&ramfs_remove_attr, &ramfs_remove_attr,
NULL // create_special_node
};
/* index directory & index operations */ static file_system_module_info sRamFSModuleInfo = {
&ramfs_open_index_dir, {
&ramfs_close_index_dir, "file_systems/ramfs" B_CURRENT_FS_API_VERSION,
&ramfs_free_index_dir_cookie, 0,
&ramfs_read_index_dir, ramfs_std_ops,
&ramfs_rewind_index_dir, },
&ramfs_create_index, "ramfs", // short_name
&ramfs_remove_index, "RAM File System", // pretty_name
&ramfs_read_index_stat, 0 // DDM flags
| B_DISK_SYSTEM_SUPPORTS_WRITING,
/* query operations */ // scanning
&ramfs_open_query, NULL, // identify_partition()
&ramfs_close_query, NULL, // scan_partition()
&ramfs_free_query_cookie, NULL, // free_identify_partition_cookie()
&ramfs_read_query, NULL, // free_partition_content_cookie()
NULL, // &ramfs_rewind_query,
&ramfs_mount,
NULL, // TODO : &ramfs_get_supported_operations
NULL, // validate_resize
NULL, // validate_move
NULL, // validate_set_content_name
NULL, // validate_set_content_parameters
NULL, // validate_initialize,
/* shadow partition modification */
NULL, // shadow_changed
/* writing */
NULL, // defragment
NULL, // repair
NULL, // resize
NULL, // move
NULL, // set_content_name
NULL, // set_content_parameters
NULL // bfs_initialize
}; };
module_info *modules[] = { module_info *modules[] = {