From e189e20f7e9deda279950f0af10b0697d19713bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Fri, 27 Jun 2003 03:48:32 +0000 Subject: [PATCH] Simplified the vnode creation procedure. Removed unused headers. Some cleanup. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3685 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kernel/core/fs/rootfs.c | 88 +++++++++++++------------------------ 1 file changed, 31 insertions(+), 57 deletions(-) diff --git a/src/kernel/core/fs/rootfs.c b/src/kernel/core/fs/rootfs.c index 92bdee9792..96f62ea3df 100755 --- a/src/kernel/core/fs/rootfs.c +++ b/src/kernel/core/fs/rootfs.c @@ -3,24 +3,21 @@ ** Distributed under the terms of the NewOS License. */ -#include +#include #include #include #include -#include #include #include -#include -#include -#include -#include #include +#include +#include #include #include -#include "rootfs.h" +#include "builtin_fs.h" #define ROOTFS_TRACE 0 @@ -103,18 +100,26 @@ rootfs_vnode_compare_func(void *_v, const void *_key) static struct rootfs_vnode * -rootfs_create_vnode(struct rootfs *fs) +rootfs_create_vnode(struct rootfs *fs, const char *name, int type) { - struct rootfs_vnode *v; + struct rootfs_vnode *vnode; - v = malloc(sizeof(struct rootfs_vnode)); - if (v == NULL) + vnode = malloc(sizeof(struct rootfs_vnode)); + if (vnode == NULL) return NULL; - memset(v, 0, sizeof(struct rootfs_vnode)); - v->id = fs->next_vnode_id++; + memset(vnode, 0, sizeof(struct rootfs_vnode)); - return v; + vnode->name = strdup(name); + if (vnode->name == NULL) { + free(vnode); + return NULL; + } + + vnode->id = fs->next_vnode_id++; + vnode->stream.type = type; + + return vnode; } @@ -279,7 +284,7 @@ rootfs_mount(mount_id id, const char *device, void *args, fs_volume *_fs, vnode_ fs = malloc(sizeof(struct rootfs)); if (fs == NULL) - return ENOMEM; + return B_NO_MEMORY; fs->id = id; fs->next_vnode_id = 0; @@ -291,27 +296,18 @@ rootfs_mount(mount_id id, const char *device, void *args, fs_volume *_fs, vnode_ fs->vnode_list_hash = hash_init(ROOTFS_HASH_SIZE, (addr)&vnode->all_next - (addr)vnode, &rootfs_vnode_compare_func, &rootfs_vnode_hash_func); if (fs->vnode_list_hash == NULL) { - err = ENOMEM; + err = B_NO_MEMORY; goto err2; } // create the root vnode - vnode = rootfs_create_vnode(fs); + vnode = rootfs_create_vnode(fs, "", STREAM_TYPE_DIR); if (vnode == NULL) { - err = ENOMEM; + err = B_NO_MEMORY; goto err3; } - - // set it up vnode->parent = vnode; - vnode->name = strdup(""); - if (vnode->name == NULL) { - err = ENOMEM; - goto err4; - } - vnode->stream.type = STREAM_TYPE_DIR; - vnode->stream.dir.dir_head = NULL; fs->root_vnode = vnode; hash_insert(fs->vnode_list_hash, vnode); @@ -320,8 +316,6 @@ rootfs_mount(mount_id id, const char *device, void *args, fs_volume *_fs, vnode_ return 0; -err4: - rootfs_delete_vnode(fs, vnode, true); err3: hash_uninit(fs->vnode_list_hash); err2: @@ -347,7 +341,7 @@ rootfs_unmount(fs_volume _fs) // delete all of the vnodes hash_open(fs->vnode_list_hash, &i); - while((v = (struct rootfs_vnode *)hash_next(fs->vnode_list_hash, &i)) != NULL) { + while ((v = (struct rootfs_vnode *)hash_next(fs->vnode_list_hash, &i)) != NULL) { rootfs_delete_vnode(fs, v, true); } hash_close(fs->vnode_list_hash, &i, false); @@ -562,7 +556,6 @@ rootfs_create_dir(fs_volume _fs, fs_vnode _dir, const char *name, int perms, vno struct rootfs *fs = _fs; struct rootfs_vnode *dir = _dir; struct rootfs_vnode *vnode; - bool created_vnode = false; status_t status = 0; TRACE(("rootfs_create_dir: dir %p, name = '%s', perms = %d, id = 0x%Lx pointer id = %p\n", dir, name, perms,*new_vnid, new_vnid)); @@ -576,18 +569,11 @@ rootfs_create_dir(fs_volume _fs, fs_vnode _dir, const char *name, int perms, vno } dprintf("rootfs_create: creating new vnode\n"); - vnode = rootfs_create_vnode(fs); + vnode = rootfs_create_vnode(fs, name, STREAM_TYPE_DIR); if (vnode == NULL) { status = B_NO_MEMORY; goto err; } - created_vnode = true; - vnode->name = strdup(name); - if (vnode->name == NULL) { - status = B_NO_MEMORY; - goto err1; - } - vnode->stream.type = STREAM_TYPE_DIR; vnode->parent = dir; rootfs_insert_in_dir(dir, vnode); @@ -601,9 +587,6 @@ rootfs_create_dir(fs_volume _fs, fs_vnode _dir, const char *name, int perms, vno mutex_unlock(&fs->lock); return 0; -err1: - if (created_vnode) - rootfs_delete_vnode(fs, vnode, false); err: mutex_unlock(&fs->lock); @@ -762,7 +745,6 @@ rootfs_symlink(fs_volume _fs, fs_vnode _dir, const char *name, const char *path, struct rootfs *fs = _fs; struct rootfs_vnode *dir = _dir; struct rootfs_vnode *vnode; - bool created_vnode = false; status_t status = 0; TRACE(("rootfs_symlink: dir %p, name = '%s', path = %s\n", dir, name, path)); @@ -776,18 +758,11 @@ rootfs_symlink(fs_volume _fs, fs_vnode _dir, const char *name, const char *path, } dprintf("rootfs_create: creating new symlink\n"); - vnode = rootfs_create_vnode(fs); + vnode = rootfs_create_vnode(fs, name, STREAM_TYPE_SYMLINK); if (vnode == NULL) { status = B_NO_MEMORY; goto err; } - created_vnode = true; - vnode->name = strdup(name); - if (vnode->name == NULL) { - status = B_NO_MEMORY; - goto err1; - } - vnode->stream.type = STREAM_TYPE_SYMLINK; vnode->parent = dir; rootfs_insert_in_dir(dir, vnode); @@ -795,7 +770,7 @@ rootfs_symlink(fs_volume _fs, fs_vnode _dir, const char *name, const char *path, vnode->stream.symlink.path = strdup(path); if (vnode->stream.symlink.path == NULL) { - status = ENOMEM; + status = B_NO_MEMORY; goto err1; } vnode->stream.symlink.length = strlen(path); @@ -806,8 +781,7 @@ rootfs_symlink(fs_volume _fs, fs_vnode _dir, const char *name, const char *path, return 0; err1: - if (created_vnode) - rootfs_delete_vnode(fs, vnode, false); + rootfs_delete_vnode(fs, vnode, false); err: mutex_unlock(&fs->lock); return status; @@ -842,7 +816,7 @@ rootfs_rename(fs_volume _fs, fs_vnode _olddir, const char *oldname, fs_vnode _ne v1 = rootfs_find_in_dir(olddir, oldname); if (!v1) { - err = ERR_VFS_PATH_NOT_FOUND; + err = B_ENTRY_NOT_FOUND; goto err; } @@ -852,7 +826,7 @@ rootfs_rename(fs_volume _fs, fs_vnode _olddir, const char *oldname, fs_vnode _ne // rename to a different name in the same dir if (v2) { // target node exists - err = ERR_VFS_ALREADY_EXISTS; + err = B_NAME_IN_USE; goto err; } @@ -867,7 +841,7 @@ rootfs_rename(fs_volume _fs, fs_vnode _olddir, const char *oldname, fs_vnode _ne if (!v1->name) { // bad place to be, at least restore v1->name = ptr; - err = ENOMEM; + err = B_NO_MEMORY; goto err; } free(ptr);