Merge Ingo's reiserfs changes which he accidentally commited to his branch: Adopted reiserfs add-on to the new fs API and added it to the image.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26209 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus
2008-07-01 22:46:54 +00:00
parent d7c321236f
commit e8679dcdc7
4 changed files with 98 additions and 111 deletions
+1 -1
View File
@@ -135,7 +135,7 @@ BEOS_ADD_ONS_DRIVERS_NET = $(X86_ONLY)3com etherpci $(X86_ONLY)ipro1000
BEOS_ADD_ONS_BUS_MANAGERS = pci $(X86_ONLY)ps2 $(X86_ONLY)isa ide scsi
config_manager agp_gart usb #firewire
;
BEOS_ADD_ONS_FILE_SYSTEMS = bfs cdda ext2 fat iso9660 ;
BEOS_ADD_ONS_FILE_SYSTEMS = bfs cdda ext2 fat iso9660 $(GPL_ONLY)reiserfs ;
#googlefs nfs $(GPL_ONLY)ntfs ;
@@ -40,6 +40,10 @@
#include "Tree.h"
#include "VNode.h"
extern fs_vnode_ops gReiserFSVnodeOps;
// min and max
// We don't want to include <algobase.h> otherwise we also get <iostream.h>
// and other undesired things.
@@ -63,7 +67,7 @@ static inline C max(const C &a, const C &b) { return (a > b ? a : b); }
// constructor
Volume::Volume()
: fID(0),
: fFSVolume(NULL),
fDevice(-1),
fBlockCache(NULL),
fTree(NULL),
@@ -84,11 +88,11 @@ Volume::~Volume()
// Mount
status_t
Volume::Mount(dev_t id, const char *path)
Volume::Mount(fs_volume *fsVolume, const char *path)
{
Unmount();
status_t error = (path ? B_OK : B_BAD_VALUE);
fID = id;
fFSVolume = fsVolume;
// load the settings
if (error == B_OK) {
fSettings = new(nothrow) Settings;
@@ -148,8 +152,10 @@ REPORT_ERROR(error);
error = FindVNode(REISERFS_ROOT_PARENT_OBJECTID,
REISERFS_ROOT_OBJECTID, fRootVNode);
REPORT_ERROR(error);
if (error == B_OK)
error = publish_vnode(fID, fRootVNode->GetID(), fRootVNode);
if (error == B_OK) {
error = publish_vnode(fFSVolume, fRootVNode->GetID(),
fRootVNode, &gReiserFSVnodeOps, S_IFDIR, 0);
}
REPORT_ERROR(error);
} else
error = B_NO_MEMORY;
@@ -200,7 +206,7 @@ Volume::Unmount()
}
fNegativeEntries.MakeEmpty();
fHashFunction = NULL;
fID = 0;
fFSVolume = NULL;
return B_OK;
}
@@ -257,14 +263,14 @@ Volume::GetKeyOffsetForName(const char *name, int len, uint64 *result)
status_t
Volume::GetVNode(ino_t id, VNode **node)
{
return get_vnode(GetID(), id, (void**)node);
return get_vnode(GetFSVolume(), id, (void**)node);
}
// PutVNode
status_t
Volume::PutVNode(ino_t id)
{
return put_vnode(GetID(), id);
return put_vnode(GetFSVolume(), id);
}
// FindVNode
@@ -41,10 +41,11 @@ public:
Volume();
~Volume();
status_t Mount(dev_t nsid, const char *path);
status_t Mount(fs_volume *fsVolume, const char *path);
status_t Unmount();
dev_t GetID() const { return fID; }
dev_t GetID() const { return fFSVolume->id; }
fs_volume *GetFSVolume() const { return fFSVolume; }
off_t GetBlockSize() const;
off_t CountBlocks() const;
@@ -89,7 +90,7 @@ private:
void _InitNegativeEntries();
private:
dev_t fID;
fs_volume *fFSVolume;
int fDevice;
BlockCache *fBlockCache;
Tree *fTree;
@@ -46,6 +46,9 @@
static const size_t kOptimalIOSize = 65536;
extern fs_volume_ops gReiserFSVolumeOps;
extern fs_vnode_ops gReiserFSVnodeOps;
inline static bool is_user_in_group(gid_t gid);
@@ -55,8 +58,8 @@ inline static bool is_user_in_group(gid_t gid);
// reiserfs_mount
static status_t
reiserfs_mount(dev_t nsid, const char *device, uint32 flags,
const char *parameters, fs_volume *data, ino_t *rootID)
reiserfs_mount(fs_volume *_volume, const char *device, uint32 flags,
const char *parameters, ino_t *rootID)
{
TOUCH(flags); TOUCH(parameters);
FUNCTION_START();
@@ -68,12 +71,13 @@ reiserfs_mount(dev_t nsid, const char *device, uint32 flags,
if (!volume)
error = B_NO_MEMORY;
if (error == B_OK)
error = volume->Mount(nsid, device);
error = volume->Mount(_volume, device);
// set the results
if (error == B_OK) {
*rootID = volume->GetRootVNode()->GetID();
*data = volume;
_volume->private_volume = volume;
_volume->ops = &gReiserFSVolumeOps;
}
// cleanup on failure
@@ -82,12 +86,13 @@ reiserfs_mount(dev_t nsid, const char *device, uint32 flags,
RETURN_ERROR(error);
}
// reiserfs_unmount
static status_t
reiserfs_unmount(fs_volume fs)
reiserfs_unmount(fs_volume* fs)
{
FUNCTION_START();
Volume *volume = (Volume*)fs;
Volume *volume = (Volume*)fs->private_volume;
status_t error = volume->Unmount();
if (error == B_OK)
delete volume;
@@ -96,10 +101,10 @@ reiserfs_unmount(fs_volume fs)
// reiserfs_read_fs_info
static status_t
reiserfs_read_fs_info(fs_volume fs, struct fs_info *info)
reiserfs_read_fs_info(fs_volume* fs, struct fs_info *info)
{
FUNCTION_START();
Volume *volume = (Volume*)fs;
Volume *volume = (Volume*)fs->private_volume;
info->flags = B_FS_IS_PERSISTENT | B_FS_IS_READONLY;
info->block_size = volume->GetBlockSize();
info->io_size = kOptimalIOSize;
@@ -117,12 +122,12 @@ reiserfs_read_fs_info(fs_volume fs, struct fs_info *info)
// reiserfs_lookup
static status_t
reiserfs_lookup(fs_volume fs, fs_vnode _dir, const char *entryName,
ino_t *vnid, int *type)
reiserfs_lookup(fs_volume* fs, fs_vnode* _dir, const char *entryName,
ino_t *vnid)
{
// FUNCTION_START();
Volume *volume = (Volume*)fs;
VNode *dir = (VNode*)_dir;
Volume *volume = (Volume*)fs->private_volume;
VNode *dir = (VNode*)_dir->private_node;
FUNCTION(("dir: (%Ld: %lu, %lu), entry: `%s'\n", dir->GetID(), dir->GetDirID(),
dir->GetObjectID(), entryName));
status_t error = B_OK;
@@ -161,30 +166,30 @@ FUNCTION(("dir: (%Ld: %lu, %lu), entry: `%s'\n", dir->GetID(), dir->GetDirID(),
}
}
// get type
if (error == B_OK)
*type = entryNode->GetStatData()->GetMode() & S_IFMT;
RETURN_ERROR(error);
}
// reiserfs_read_vnode
static status_t
reiserfs_read_vnode(fs_volume fs, ino_t vnid, fs_vnode *node, bool reenter)
reiserfs_read_vnode(fs_volume *fs, ino_t vnid, fs_vnode *node, int *_type,
uint32 *_flags, bool reenter)
{
TOUCH(reenter);
// FUNCTION_START();
FUNCTION(("(%Ld: %lu, %ld)\n", vnid, VNode::GetDirIDFor(vnid),
VNode::GetObjectIDFor(vnid)));
Volume *volume = (Volume*)fs;
Volume *volume = (Volume*)fs->private_volume;
status_t error = B_OK;
VNode *foundNode = new(nothrow) VNode;
if (foundNode) {
error = volume->FindVNode(vnid, foundNode);
if (error == B_OK)
*node = foundNode;
else
delete foundNode;;
if (error == B_OK) {
node->private_node = foundNode;
node->ops = &gReiserFSVnodeOps;
*_type = foundNode->GetStatData()->GetMode() & S_IFMT;
*_flags = 0;
} else
delete foundNode;
} else
error = B_NO_MEMORY;
RETURN_ERROR(error);
@@ -192,7 +197,7 @@ reiserfs_read_vnode(fs_volume fs, ino_t vnid, fs_vnode *node, bool reenter)
// reiserfs_write_vnode
static status_t
reiserfs_write_vnode(fs_volume fs, fs_vnode _node, bool reenter)
reiserfs_write_vnode(fs_volume *fs, fs_vnode *_node, bool reenter)
{
TOUCH(reenter);
// DANGER: If dbg_printf() is used, this thread will enter another FS and
@@ -201,8 +206,8 @@ reiserfs_write_vnode(fs_volume fs, fs_vnode _node, bool reenter)
// called from another FS may cause the VFS layer to free vnodes and thus
// invoke this hook.
// FUNCTION_START();
Volume *volume = (Volume*)fs;
VNode *node = (VNode*)_node;
Volume *volume = (Volume*)fs->private_volume;
VNode *node = (VNode*)_node->private_node;
status_t error = B_OK;
if (node != volume->GetRootVNode())
delete node;
@@ -216,12 +221,12 @@ reiserfs_write_vnode(fs_volume fs, fs_vnode _node, bool reenter)
// reiserfs_read_symlink
static status_t
reiserfs_read_symlink(fs_volume fs, fs_vnode _node, char *buffer,
reiserfs_read_symlink(fs_volume *fs, fs_vnode *_node, char *buffer,
size_t *bufferSize)
{
// FUNCTION_START();
Volume *volume = (Volume*)fs;
VNode *node = (VNode*)_node;
Volume *volume = (Volume*)fs->private_volume;
VNode *node = (VNode*)_node->private_node;
FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
node->GetObjectID()));
status_t error = B_OK;
@@ -236,12 +241,12 @@ FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
// reiserfs_access
static status_t
reiserfs_access(fs_volume fs, fs_vnode _node, int mode)
reiserfs_access(fs_volume *fs, fs_vnode *_node, int mode)
{
TOUCH(fs);
// FUNCTION_START();
// Volume *volume = (Volume*)fs;
VNode *node = (VNode*)_node;
// Volume *volume = (Volume*)fs->private_volume;
VNode *node = (VNode*)_node->private_node;
FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
node->GetObjectID()));
// write access requested?
@@ -278,11 +283,11 @@ FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
// reiserfs_read_stat
static status_t
reiserfs_read_stat(fs_volume fs, fs_vnode _node, struct stat *st)
reiserfs_read_stat(fs_volume *fs, fs_vnode *_node, struct stat *st)
{
// FUNCTION_START();
Volume *volume = (Volume*)fs;
VNode *node = (VNode*)_node;
Volume *volume = (Volume*)fs->private_volume;
VNode *node = (VNode*)_node->private_node;
FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
node->GetObjectID()));
status_t error = B_OK;
@@ -307,11 +312,11 @@ FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
// reiserfs_open
static status_t
reiserfs_open(fs_volume fs, fs_vnode _node, int openMode, fs_cookie *cookie)
reiserfs_open(fs_volume *fs, fs_vnode *_node, int openMode, void **cookie)
{
// FUNCTION_START();
Volume *volume = (Volume*)fs;
VNode *node = (VNode*)_node;
Volume *volume = (Volume*)fs->private_volume;
VNode *node = (VNode*)_node->private_node;
FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
node->GetObjectID()));
status_t error = B_OK;
@@ -338,11 +343,11 @@ FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
// reiserfs_close
static status_t
reiserfs_close(fs_volume fs, fs_vnode _node, fs_cookie cookie)
reiserfs_close(fs_volume *fs, fs_vnode *_node, void *cookie)
{
TOUCH(fs); TOUCH(cookie);
// FUNCTION_START();
VNode *node = (VNode*)_node;
VNode *node = (VNode*)_node->private_node;
FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
node->GetObjectID()));
TOUCH(node);
@@ -351,11 +356,11 @@ FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
// reiserfs_free_cookie
static status_t
reiserfs_free_cookie(fs_volume fs, fs_vnode _node, fs_cookie cookie)
reiserfs_free_cookie(fs_volume *fs, fs_vnode *_node, void *cookie)
{
TOUCH(fs);
// FUNCTION_START();
VNode *node = (VNode*)_node;
VNode *node = (VNode*)_node->private_node;
FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
node->GetObjectID()));
TOUCH(node);
@@ -366,13 +371,13 @@ FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
// reiserfs_read
static status_t
reiserfs_read(fs_volume fs, fs_vnode _node, fs_cookie cookie, off_t pos,
reiserfs_read(fs_volume *fs, fs_vnode *_node, void *cookie, off_t pos,
void *buffer, size_t *bufferSize)
{
TOUCH(fs);
// FUNCTION_START();
// Volume *volume = (Volume*)ns;
VNode *node = (VNode*)_node;
// Volume *volume = (Volume*)fs->private_volume;
VNode *node = (VNode*)_node->private_node;
FUNCTION(("((%Ld: %lu, %lu), %Ld, %p, %lu)\n", node->GetID(),
node->GetDirID(), node->GetObjectID(), pos, buffer,
*bufferSize));
@@ -438,11 +443,11 @@ public:
// reiserfs_open_dir
static status_t
reiserfs_open_dir(fs_volume fs, fs_vnode _node, fs_cookie *cookie)
reiserfs_open_dir(fs_volume *fs, fs_vnode *_node, void **cookie)
{
// FUNCTION_START();
Volume *volume = (Volume*)fs;
VNode *node = (VNode*)_node;
Volume *volume = (Volume*)fs->private_volume;
VNode *node = (VNode*)_node->private_node;
FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
node->GetObjectID()));
status_t error = (node->IsDir() ? B_OK : B_BAD_VALUE);
@@ -479,11 +484,11 @@ set_dirent_name(struct dirent *buffer, size_t bufferSize,
// reiserfs_close_dir
static status_t
reiserfs_close_dir(void *ns, void *_node, void *cookie)
reiserfs_close_dir(fs_volume *fs, fs_vnode *_node, void *cookie)
{
TOUCH(ns); TOUCH(cookie);
TOUCH(fs); TOUCH(cookie);
// FUNCTION_START();
VNode *node = (VNode*)_node;
VNode *node = (VNode*)_node->private_node;
FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
node->GetObjectID()));
TOUCH(node);
@@ -492,11 +497,11 @@ FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
// reiserfs_free_dir_cookie
static status_t
reiserfs_free_dir_cookie(void *ns, void *_node, void *cookie)
reiserfs_free_dir_cookie(fs_volume *fs, fs_vnode *_node, void *cookie)
{
TOUCH(ns);
TOUCH(fs);
// FUNCTION_START();
VNode *node = (VNode*)_node;
VNode *node = (VNode*)_node->private_node;
FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
node->GetObjectID()));
TOUCH(node);
@@ -507,12 +512,12 @@ FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
// reiserfs_read_dir
static status_t
reiserfs_read_dir(fs_volume fs, fs_vnode _node, fs_cookie cookie,
reiserfs_read_dir(fs_volume *fs, fs_vnode *_node, void *cookie,
struct dirent *buffer, size_t bufferSize, uint32 *count)
{
// FUNCTION_START();
Volume *volume = (Volume*)fs;
VNode *node = (VNode*)_node;
Volume *volume = (Volume*)fs->private_volume;
VNode *node = (VNode*)_node->private_node;
FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
node->GetObjectID()));
DirectoryCookie *iterator = (DirectoryCookie*)cookie;
@@ -601,11 +606,11 @@ PRINT(("returning %ld entries\n", *count));
// reiserfs_rewind_dir
static status_t
reiserfs_rewind_dir(fs_volume fs, fs_vnode _node, fs_cookie cookie)
reiserfs_rewind_dir(fs_volume *fs, fs_vnode *_node, void *cookie)
{
TOUCH(fs);
// FUNCTION_START();
VNode *node = (VNode*)_node;
VNode *node = (VNode*)_node->private_node;
FUNCTION(("node: (%Ld: %lu, %lu)\n", node->GetID(), node->GetDirID(),
node->GetObjectID()));
TOUCH(node);
@@ -642,6 +647,9 @@ reiserfs_std_ops(int32 op, ...)
}
}
static file_system_module_info sReiserFSModuleInfo = {
{
"file_systems/reiserfs" B_CURRENT_FS_API_VERSION,
@@ -653,22 +661,31 @@ static file_system_module_info sReiserFSModuleInfo = {
"Reiser File System", // pretty_name
0, // DDM flags
// scanning
NULL, // identify_partition()
NULL, // scan_partition()
NULL, // free_identify_partition_cookie()
NULL, // free_partition_content_cookie()
&reiserfs_mount,
&reiserfs_mount
};
fs_volume_ops gReiserFSVolumeOps = {
&reiserfs_unmount,
&reiserfs_read_fs_info,
NULL, // &reiserfs_write_fs_info,
NULL, // &reiserfs_sync,
&reiserfs_read_vnode
};
fs_vnode_ops gReiserFSVnodeOps = {
/* vnode operations */
&reiserfs_lookup,
NULL, // &reiserfs_get_vnode_name,
&reiserfs_read_vnode,
&reiserfs_write_vnode,
NULL, // &reiserfs_remove_vnode,
@@ -711,47 +728,10 @@ static file_system_module_info sReiserFSModuleInfo = {
&reiserfs_close_dir,
&reiserfs_free_dir_cookie,
&reiserfs_read_dir,
&reiserfs_rewind_dir,
/* attribute directory operations */
NULL, // &reiserfs_open_attr_dir,
NULL, // &reiserfs_close_attr_dir,
NULL, // &reiserfs_free_attr_dir_cookie,
NULL, // &reiserfs_read_attr_dir,
NULL, // &reiserfs_rewind_attr_dir,
/* attribute operations */
NULL, // &reiserfs_create_attr,
NULL, // &reiserfs_open_attr,
NULL, // &reiserfs_close_attr,
NULL, // &reiserfs_free_attr_cookie,
NULL, // &reiserfs_read_attr,
NULL, // &reiserfs_write_attr,
NULL, // &reiserfs_read_attr_stat,
NULL, // &reiserfs_write_attr_stat,
NULL, // &reiserfs_rename_attr,
NULL, // &reiserfs_remove_attr,
/* index directory & index operations */
NULL, // &reiserfs_open_index_dir,
NULL, // &reiserfs_close_index_dir,
NULL, // &reiserfs_free_index_dir_cookie,
NULL, // &reiserfs_read_index_dir,
NULL, // &reiserfs_rewind_index_dir,
NULL, // &reiserfs_create_index,
NULL, // &reiserfs_remove_index,
NULL, // &reiserfs_read_index_stat,
/* query operations */
NULL, // &reiserfs_open_query,
NULL, // &reiserfs_close_query,
NULL, // &reiserfs_free_query_cookie,
NULL, // &reiserfs_read_query,
NULL, // &reiserfs_rewind_query,
&reiserfs_rewind_dir
};
module_info *modules[] = {
(module_info *)&sReiserFSModuleInfo,
NULL,