From 9ab2ad5095cc59df11f1ef196a3e8ad9d4d95bfc Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 1 May 2023 19:21:04 -0300 Subject: [PATCH] vfs: change how the vfs_create return argument works and split the rdev vattr member --- kernel-src/fs/initrd.c | 6 +----- kernel-src/fs/vfs.c | 11 ++++++++++- kernel-src/include/kernel/vfs.h | 3 ++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/kernel-src/fs/initrd.c b/kernel-src/fs/initrd.c index e5044e9f..ac746650 100644 --- a/kernel-src/fs/initrd.c +++ b/kernel-src/fs/initrd.c @@ -159,11 +159,7 @@ void initrd_unpack() { VOP_RELEASE(node); break; case TAR_DIR: - err = vfs_create(vfsroot, entry.name, &entryattr, V_TYPE_DIR, &node); - if (err) - break; - - VOP_RELEASE(node); + err = vfs_create(vfsroot, entry.name, &entryattr, V_TYPE_DIR, NULL); break; case TAR_SYMLINK: err = vfs_link(NULL, entry.link, vfsroot, entry.name, V_TYPE_LINK, &entryattr); diff --git a/kernel-src/fs/vfs.c b/kernel-src/fs/vfs.c index 19b629ce..d87586bf 100644 --- a/kernel-src/fs/vfs.c +++ b/kernel-src/fs/vfs.c @@ -93,6 +93,7 @@ int vfs_open(vnode_t *ref, char *path, int flags, vnode_t **res) { return err; } +// if node is not NULL, then a reference is kept and the newnode is returned in node int vfs_create(vnode_t *ref, char *path, vattr_t *attr, int type, vnode_t **node) { vnode_t *parent; char *component = alloc(strlen(path) + 1); @@ -100,10 +101,18 @@ int vfs_create(vnode_t *ref, char *path, vattr_t *attr, int type, vnode_t **node if (err) goto cleanup; + vnode_t *ret; VOP_LOCK(parent); - err = VOP_CREATE(parent, component, attr, type, node, getcred()); + err = VOP_CREATE(parent, component, attr, type, &ret, getcred()); VOP_UNLOCK(parent); VOP_RELEASE(parent); + if (err) + goto cleanup; + + if (node) + *node = ret; + else + VOP_RELEASE(ret); cleanup: free(component); diff --git a/kernel-src/include/kernel/vfs.h b/kernel-src/include/kernel/vfs.h index 4aed9416..859af2ad 100644 --- a/kernel-src/include/kernel/vfs.h +++ b/kernel-src/include/kernel/vfs.h @@ -25,7 +25,8 @@ typedef struct { timespec_t atime; timespec_t mtime; timespec_t ctime; - int rdev; + int rdevmajor; + int rdevminor; size_t blocksused; } vattr_t;