Renamed "calls" to "ops" (yeah, I know, that doesn't make really much sense :).
Completed load_file_system(). git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1178 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1006,7 +1006,7 @@ bootfs_write_stat(fs_volume _fs, fs_vnode _v, const struct stat *stat, int stat_
|
|||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
static struct fs_calls bootfs_calls = {
|
static struct fs_ops bootfs_ops = {
|
||||||
&bootfs_mount,
|
&bootfs_mount,
|
||||||
&bootfs_unmount,
|
&bootfs_unmount,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -1082,6 +1082,6 @@ bootstrap_bootfs(void)
|
|||||||
|
|
||||||
dprintf("bootstrap_bootfs: found bootdir at %p\n", bootdir);
|
dprintf("bootstrap_bootfs: found bootdir at %p\n", bootdir);
|
||||||
|
|
||||||
return vfs_register_filesystem("bootfs", &bootfs_calls);
|
return vfs_register_filesystem("bootfs", &bootfs_ops);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+21
-21
@@ -60,7 +60,7 @@ struct devfs_stream {
|
|||||||
} dir;
|
} dir;
|
||||||
struct stream_dev {
|
struct stream_dev {
|
||||||
void *ident;
|
void *ident;
|
||||||
device_hooks *calls;
|
device_hooks *ops;
|
||||||
struct devfs_part_map *part_map;
|
struct devfs_part_map *part_map;
|
||||||
} dev;
|
} dev;
|
||||||
struct stream_symlink {
|
struct stream_symlink {
|
||||||
@@ -368,13 +368,13 @@ devfs_set_partition( struct devfs *fs, struct devfs_vnode *v,
|
|||||||
part_node = devfs_create_vnode(fs, part_name);
|
part_node = devfs_create_vnode(fs, part_name);
|
||||||
|
|
||||||
if (part_node == NULL) {
|
if (part_node == NULL) {
|
||||||
res = ENOMEM;
|
res = B_NO_MEMORY;
|
||||||
goto err2;
|
goto err2;
|
||||||
}
|
}
|
||||||
|
|
||||||
part_node->stream.type = STREAM_TYPE_DEVICE;
|
part_node->stream.type = STREAM_TYPE_DEVICE;
|
||||||
part_node->stream.u.dev.ident = v->stream.u.dev.ident;
|
part_node->stream.u.dev.ident = v->stream.u.dev.ident;
|
||||||
part_node->stream.u.dev.calls = v->stream.u.dev.calls;
|
part_node->stream.u.dev.ops = v->stream.u.dev.ops;
|
||||||
part_node->stream.u.dev.part_map = part_map;
|
part_node->stream.u.dev.part_map = part_map;
|
||||||
|
|
||||||
hash_insert(fs->vnode_list_hash, part_node);
|
hash_insert(fs->vnode_list_hash, part_node);
|
||||||
@@ -645,7 +645,7 @@ devfs_open(fs_volume _fs, fs_vnode _v, int oflags, fs_cookie *_cookie)
|
|||||||
if (vnode->stream.type != STREAM_TYPE_DEVICE)
|
if (vnode->stream.type != STREAM_TYPE_DEVICE)
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
status = vnode->stream.u.dev.calls->open(vnode->name, oflags, &cookie->u.dev.dcookie);
|
status = vnode->stream.u.dev.ops->open(vnode->name, oflags, &cookie->u.dev.dcookie);
|
||||||
*_cookie = cookie;
|
*_cookie = cookie;
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
@@ -662,7 +662,7 @@ devfs_close(fs_volume _fs, fs_vnode _v, fs_cookie _cookie)
|
|||||||
|
|
||||||
if (vnode->stream.type == STREAM_TYPE_DEVICE) {
|
if (vnode->stream.type == STREAM_TYPE_DEVICE) {
|
||||||
// pass the call through to the underlying device
|
// pass the call through to the underlying device
|
||||||
return vnode->stream.u.dev.calls->close(cookie->u.dev.dcookie);
|
return vnode->stream.u.dev.ops->close(cookie->u.dev.dcookie);
|
||||||
}
|
}
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
@@ -679,7 +679,7 @@ devfs_free_cookie(fs_volume _fs, fs_vnode _v, fs_cookie _cookie)
|
|||||||
|
|
||||||
if (vnode->stream.type == STREAM_TYPE_DEVICE) {
|
if (vnode->stream.type == STREAM_TYPE_DEVICE) {
|
||||||
// pass the call through to the underlying device
|
// pass the call through to the underlying device
|
||||||
vnode->stream.u.dev.calls->free(cookie->u.dev.dcookie);
|
vnode->stream.u.dev.ops->free(cookie->u.dev.dcookie);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cookie)
|
if (cookie)
|
||||||
@@ -725,7 +725,7 @@ devfs_read(fs_volume _fs, fs_vnode _v, fs_cookie _cookie, off_t pos, void *buffe
|
|||||||
}
|
}
|
||||||
|
|
||||||
// pass the call through to the device
|
// pass the call through to the device
|
||||||
return vnode->stream.u.dev.calls->read(cookie->u.dev.dcookie, pos, buffer, length);
|
return vnode->stream.u.dev.ops->read(cookie->u.dev.dcookie, pos, buffer, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -752,7 +752,7 @@ devfs_write(fs_volume _fs, fs_vnode _v, fs_cookie _cookie, off_t pos, const void
|
|||||||
pos += part_map->offset;
|
pos += part_map->offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
written = vnode->stream.u.dev.calls->write(cookie->u.dev.dcookie, pos, buf, len);
|
written = vnode->stream.u.dev.ops->write(cookie->u.dev.dcookie, pos, buf, len);
|
||||||
return written;
|
return written;
|
||||||
}
|
}
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
@@ -888,7 +888,7 @@ devfs_ioctl(fs_volume _fs, fs_vnode _v, fs_cookie _cookie, ulong op, void *buf,
|
|||||||
return devfs_set_partition(fs, v, cookie, buf, len);
|
return devfs_set_partition(fs, v, cookie, buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
return v->stream.u.dev.calls->control(cookie->u.dev.dcookie, op, buf, len);
|
return v->stream.u.dev.ops->control(cookie->u.dev.dcookie, op, buf, len);
|
||||||
}
|
}
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
@@ -902,9 +902,9 @@ static int devfs_canpage(fs_volume _fs, fs_vnode _v)
|
|||||||
TRACE(("devfs_canpage: vnode 0x%x\n", v));
|
TRACE(("devfs_canpage: vnode 0x%x\n", v));
|
||||||
|
|
||||||
if(v->stream.type == STREAM_TYPE_DEVICE) {
|
if(v->stream.type == STREAM_TYPE_DEVICE) {
|
||||||
if(!v->stream.u.dev.calls->dev_canpage)
|
if(!v->stream.u.dev.ops->dev_canpage)
|
||||||
return 0;
|
return 0;
|
||||||
return v->stream.u.dev.calls->dev_canpage(v->stream.u.dev.ident);
|
return v->stream.u.dev.ops->dev_canpage(v->stream.u.dev.ident);
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -919,7 +919,7 @@ static ssize_t devfs_readpage(fs_volume _fs, fs_vnode _v, iovecs *vecs, off_t po
|
|||||||
if(v->stream.type == STREAM_TYPE_DEVICE) {
|
if(v->stream.type == STREAM_TYPE_DEVICE) {
|
||||||
struct devfs_part_map *part_map = v->stream.u.dev.part_map;
|
struct devfs_part_map *part_map = v->stream.u.dev.part_map;
|
||||||
|
|
||||||
if(!v->stream.u.dev.calls->dev_readpage)
|
if(!v->stream.u.dev.ops->dev_readpage)
|
||||||
return ERR_NOT_ALLOWED;
|
return ERR_NOT_ALLOWED;
|
||||||
|
|
||||||
if( part_map ) {
|
if( part_map ) {
|
||||||
@@ -934,7 +934,7 @@ static ssize_t devfs_readpage(fs_volume _fs, fs_vnode _v, iovecs *vecs, off_t po
|
|||||||
pos += part_map->offset;
|
pos += part_map->offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
return v->stream.u.dev.calls->dev_readpage(v->stream.u.dev.ident, vecs, pos);
|
return v->stream.u.dev.ops->dev_readpage(v->stream.u.dev.ident, vecs, pos);
|
||||||
} else {
|
} else {
|
||||||
return ERR_NOT_ALLOWED;
|
return ERR_NOT_ALLOWED;
|
||||||
}
|
}
|
||||||
@@ -949,7 +949,7 @@ static ssize_t devfs_writepage(fs_volume _fs, fs_vnode _v, iovecs *vecs, off_t p
|
|||||||
if(v->stream.type == STREAM_TYPE_DEVICE) {
|
if(v->stream.type == STREAM_TYPE_DEVICE) {
|
||||||
struct devfs_part_map *part_map = v->stream.u.dev.part_map;
|
struct devfs_part_map *part_map = v->stream.u.dev.part_map;
|
||||||
|
|
||||||
if(!v->stream.u.dev.calls->dev_writepage)
|
if(!v->stream.u.dev.ops->dev_writepage)
|
||||||
return ERR_NOT_ALLOWED;
|
return ERR_NOT_ALLOWED;
|
||||||
|
|
||||||
if( part_map ) {
|
if( part_map ) {
|
||||||
@@ -964,7 +964,7 @@ static ssize_t devfs_writepage(fs_volume _fs, fs_vnode _v, iovecs *vecs, off_t p
|
|||||||
pos += part_map->offset;
|
pos += part_map->offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
return v->stream.u.dev.calls->dev_writepage(v->stream.u.dev.ident, vecs, pos);
|
return v->stream.u.dev.ops->dev_writepage(v->stream.u.dev.ident, vecs, pos);
|
||||||
} else {
|
} else {
|
||||||
return ERR_NOT_ALLOWED;
|
return ERR_NOT_ALLOWED;
|
||||||
}
|
}
|
||||||
@@ -1045,7 +1045,7 @@ devfs_write_stat(fs_volume _fs, fs_vnode _v, const struct stat *stat, int stat_m
|
|||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
static struct fs_calls devfs_calls = {
|
static struct fs_ops devfs_ops = {
|
||||||
&devfs_mount,
|
&devfs_mount,
|
||||||
&devfs_unmount,
|
&devfs_unmount,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -1107,12 +1107,12 @@ bootstrap_devfs(void)
|
|||||||
|
|
||||||
TRACE(("bootstrap_devfs: entry\n"));
|
TRACE(("bootstrap_devfs: entry\n"));
|
||||||
|
|
||||||
return vfs_register_filesystem("devfs", &devfs_calls);
|
return vfs_register_filesystem("devfs", &devfs_ops);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
devfs_publish_device(const char *path, void *ident, device_hooks *calls)
|
devfs_publish_device(const char *path, void *ident, device_hooks *ops)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
int i, last;
|
int i, last;
|
||||||
@@ -1121,9 +1121,9 @@ devfs_publish_device(const char *path, void *ident, device_hooks *calls)
|
|||||||
struct devfs_vnode *v;
|
struct devfs_vnode *v;
|
||||||
bool at_leaf;
|
bool at_leaf;
|
||||||
|
|
||||||
TRACE(("devfs_publish_device: entry path '%s', ident %p, hooks %p\n", path, ident, calls));
|
TRACE(("devfs_publish_device: entry path '%s', ident %p, hooks %p\n", path, ident, ops));
|
||||||
|
|
||||||
if (calls == NULL || path == NULL) {
|
if (ops == NULL || path == NULL) {
|
||||||
panic("devfs_publish_device called with NULL pointer!\n");
|
panic("devfs_publish_device called with NULL pointer!\n");
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
@@ -1189,7 +1189,7 @@ devfs_publish_device(const char *path, void *ident, device_hooks *calls)
|
|||||||
// this is the last component
|
// this is the last component
|
||||||
v->stream.type = STREAM_TYPE_DEVICE;
|
v->stream.type = STREAM_TYPE_DEVICE;
|
||||||
v->stream.u.dev.ident = ident;
|
v->stream.u.dev.ident = ident;
|
||||||
v->stream.u.dev.calls = calls;
|
v->stream.u.dev.ops = ops;
|
||||||
} else {
|
} else {
|
||||||
// this is a dir
|
// this is a dir
|
||||||
v->stream.type = STREAM_TYPE_DIR;
|
v->stream.type = STREAM_TYPE_DIR;
|
||||||
|
|||||||
@@ -922,7 +922,7 @@ rootfs_write_stat(fs_volume _fs, fs_vnode _v, const struct stat *stat, int stat_
|
|||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
static struct fs_calls rootfs_calls = {
|
static struct fs_ops rootfs_ops = {
|
||||||
&rootfs_mount,
|
&rootfs_mount,
|
||||||
&rootfs_unmount,
|
&rootfs_unmount,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -983,5 +983,5 @@ bootstrap_rootfs(void)
|
|||||||
{
|
{
|
||||||
dprintf("bootstrap_rootfs: entry\n");
|
dprintf("bootstrap_rootfs: entry\n");
|
||||||
|
|
||||||
return vfs_register_filesystem("rootfs", &rootfs_calls);
|
return vfs_register_filesystem("rootfs", &rootfs_ops);
|
||||||
}
|
}
|
||||||
|
|||||||
+39
-20
@@ -85,18 +85,18 @@ struct vnode_hash_key {
|
|||||||
|
|
||||||
typedef struct file_system {
|
typedef struct file_system {
|
||||||
struct file_system *next;
|
struct file_system *next;
|
||||||
struct fs_calls *calls;
|
struct fs_ops *ops;
|
||||||
const char *name;
|
const char *name;
|
||||||
image_id image;
|
image_id image;
|
||||||
int32 ref_count;
|
int32 ref_count;
|
||||||
} file_system;
|
} file_system;
|
||||||
|
|
||||||
#define FS_CALL(vnode,call) (vnode->mount->fs->calls->call)
|
#define FS_CALL(vnode, op) (vnode->mount->fs->ops->op)
|
||||||
|
|
||||||
struct fs_mount {
|
struct fs_mount {
|
||||||
struct fs_mount *next;
|
struct fs_mount *next;
|
||||||
file_system *fs;
|
file_system *fs;
|
||||||
mount_id id;
|
mount_id id;
|
||||||
void *cookie;
|
void *cookie;
|
||||||
char *mount_point;
|
char *mount_point;
|
||||||
recursive_lock rlock;
|
recursive_lock rlock;
|
||||||
@@ -233,7 +233,7 @@ mount_hash(void *_m, const void *_key, unsigned int range)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static file_system *
|
static file_system *
|
||||||
new_file_system(const char *name, struct fs_calls *calls)
|
new_file_system(const char *name, struct fs_ops *ops)
|
||||||
{
|
{
|
||||||
file_system *fs;
|
file_system *fs;
|
||||||
|
|
||||||
@@ -244,7 +244,7 @@ new_file_system(const char *name, struct fs_calls *calls)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
fs->name = name;
|
fs->name = name;
|
||||||
fs->calls = calls;
|
fs->ops = ops;
|
||||||
fs->image = -1;
|
fs->image = -1;
|
||||||
fs->ref_count = 0;
|
fs->ref_count = 0;
|
||||||
|
|
||||||
@@ -281,8 +281,9 @@ static file_system *
|
|||||||
load_file_system(const char *name)
|
load_file_system(const char *name)
|
||||||
{
|
{
|
||||||
char path[SYS_MAX_PATH_LEN];
|
char path[SYS_MAX_PATH_LEN];
|
||||||
struct fs_calls **calls;
|
file_system *fs;
|
||||||
uint32 *version;
|
struct fs_ops **ops;
|
||||||
|
int32 *version;
|
||||||
void (*init)();
|
void (*init)();
|
||||||
image_id image;
|
image_id image;
|
||||||
|
|
||||||
@@ -299,11 +300,29 @@ load_file_system(const char *name)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
init = (void *)elf_lookup_symbol(image, "init_file_system");
|
init = (void *)elf_lookup_symbol(image, "init_file_system");
|
||||||
if (!init)
|
version = (int32 *)elf_lookup_symbol(image, "api_version");
|
||||||
|
ops = (fs_ops **)elf_lookup_symbol(image, "fs_entry");
|
||||||
|
if (init == NULL || version == NULL || ops == NULL) {
|
||||||
|
dprintf("vfs: add-on \"%s\" doesn't export all necessary symbols.\n", name);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*version != B_CURRENT_FS_API_VERSION) {
|
||||||
|
dprintf("vfs: add-on \"%s\" supports unknown API version %ld\n", name, *version);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
fs = new_file_system(name, *ops);
|
||||||
|
if (fs == NULL)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
fs->image = image;
|
||||||
|
|
||||||
|
// initialize file system add-on
|
||||||
init();
|
init();
|
||||||
|
|
||||||
|
return fs;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
elf_unload_kspace(path);
|
elf_unload_kspace(path);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1625,17 +1644,17 @@ vfs_bootstrap_all_filesystems(void)
|
|||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
vfs_register_filesystem(const char *name, struct fs_calls *calls)
|
vfs_register_filesystem(const char *name, struct fs_ops *ops)
|
||||||
{
|
{
|
||||||
status_t status = B_OK;
|
status_t status = B_OK;
|
||||||
file_system *fs;
|
file_system *fs;
|
||||||
|
|
||||||
if (name == NULL || *name == '\0' || calls == NULL)
|
if (name == NULL || *name == '\0' || ops == NULL)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
mutex_lock(&gFileSystemsMutex);
|
mutex_lock(&gFileSystemsMutex);
|
||||||
|
|
||||||
fs = new_file_system(name, calls);
|
fs = new_file_system(name, ops);
|
||||||
if (fs == NULL)
|
if (fs == NULL)
|
||||||
status = B_NO_MEMORY;
|
status = B_NO_MEMORY;
|
||||||
|
|
||||||
@@ -2660,7 +2679,7 @@ fs_mount(char *path, const char *device, const char *fsName, void *args, bool ke
|
|||||||
goto err3;
|
goto err3;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = mount->fs->calls->mount(mount->id, device, NULL, &mount->cookie, &root_id);
|
err = mount->fs->ops->mount(mount->id, device, NULL, &mount->cookie, &root_id);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
err = ERR_VFS_GENERAL;
|
err = ERR_VFS_GENERAL;
|
||||||
goto err3;
|
goto err3;
|
||||||
@@ -2688,7 +2707,7 @@ fs_mount(char *path, const char *device, const char *fsName, void *args, bool ke
|
|||||||
mount->covers_vnode = covered_vnode;
|
mount->covers_vnode = covered_vnode;
|
||||||
|
|
||||||
// mount it
|
// mount it
|
||||||
err = mount->fs->calls->mount(mount->id, device, NULL, &mount->cookie, &root_id);
|
err = mount->fs->ops->mount(mount->id, device, NULL, &mount->cookie, &root_id);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto err4;
|
goto err4;
|
||||||
}
|
}
|
||||||
@@ -2716,7 +2735,7 @@ fs_mount(char *path, const char *device, const char *fsName, void *args, bool ke
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err5:
|
err5:
|
||||||
mount->fs->calls->unmount(mount->cookie);
|
mount->fs->ops->unmount(mount->cookie);
|
||||||
err4:
|
err4:
|
||||||
if (mount->covers_vnode)
|
if (mount->covers_vnode)
|
||||||
put_vnode(mount->covers_vnode);
|
put_vnode(mount->covers_vnode);
|
||||||
@@ -2807,7 +2826,7 @@ fs_unmount(char *path, bool kernel)
|
|||||||
|
|
||||||
mutex_unlock(&gMountOpMutex);
|
mutex_unlock(&gMountOpMutex);
|
||||||
|
|
||||||
mount->fs->calls->unmount(mount->cookie);
|
mount->fs->ops->unmount(mount->cookie);
|
||||||
|
|
||||||
// release the file system
|
// release the file system
|
||||||
put_file_system(mount->fs);
|
put_file_system(mount->fs);
|
||||||
@@ -2837,7 +2856,7 @@ fs_sync(void)
|
|||||||
|
|
||||||
hash_open(gMountsTable, &iter);
|
hash_open(gMountsTable, &iter);
|
||||||
while ((mount = hash_next(gMountsTable, &iter))) {
|
while ((mount = hash_next(gMountsTable, &iter))) {
|
||||||
mount->fs->calls->sync(mount->cookie);
|
mount->fs->ops->sync(mount->cookie);
|
||||||
}
|
}
|
||||||
hash_close(gMountsTable, &iter, false);
|
hash_close(gMountsTable, &iter, false);
|
||||||
|
|
||||||
@@ -2862,8 +2881,8 @@ fs_read_info(dev_t device, struct fs_info *info)
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mount->fs->calls->read_fs_info)
|
if (mount->fs->ops->read_fs_info)
|
||||||
status = mount->fs->calls->read_fs_info(mount->cookie, info);
|
status = mount->fs->ops->read_fs_info(mount->cookie, info);
|
||||||
else
|
else
|
||||||
status = EOPNOTSUPP;
|
status = EOPNOTSUPP;
|
||||||
|
|
||||||
@@ -2891,8 +2910,8 @@ fs_write_info(dev_t device, const struct fs_info *info, int mask)
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mount->fs->calls->write_fs_info)
|
if (mount->fs->ops->write_fs_info)
|
||||||
status = mount->fs->calls->write_fs_info(mount->cookie, info, mask);
|
status = mount->fs->ops->write_fs_info(mount->cookie, info, mask);
|
||||||
else
|
else
|
||||||
status = EROFS;
|
status = EROFS;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user