From 3d6098f9a971719f7342d4bde1b4e2ccf649a023 Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 17 Oct 2022 15:04:24 -0300 Subject: [PATCH] filesystems: fix checks for file existance --- src/fs/devfs.c | 5 ++++- src/fs/vfs.c | 19 +++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/fs/devfs.c b/src/fs/devfs.c index a7eeec75..47293d61 100644 --- a/src/fs/devfs.c +++ b/src/fs/devfs.c @@ -98,6 +98,9 @@ void devfs_init(){ int devfs_newdevice(char* name, int type, dev_t dev, mode_t mode){ + if(hashtable_get(&devnodes, name)) + return EEXIST; + vnode_t* node = vfs_newnode(name, fs, 0); if(!node) return ENOMEM; @@ -106,7 +109,7 @@ int devfs_newdevice(char* name, int type, dev_t dev, mode_t mode){ vfs_destroynode(node); return ENOMEM; } - + node->st.st_rdev = dev; node->st.st_mode = MAKETYPE(type) | mode; node->st.st_ino = fs->data; diff --git a/src/fs/vfs.c b/src/fs/vfs.c index b9131e62..7736f41d 100644 --- a/src/fs/vfs.c +++ b/src/fs/vfs.c @@ -239,15 +239,16 @@ int vfs_create(dirnode_t* ref, char* path, mode_t mode){ int result = vfs_resolvepath(&buff, &parent, ref, path, name); + if(buff){ + spinlock_release(&lock); + return EEXIST; + } + if(!parent){ spinlock_release(&lock); return result; } - if(buff){ - spinlock_release(&lock); - return EEXIST; - } result = parent->vnode.fs->calls->create(parent, name, mode); spinlock_release(&lock); @@ -268,14 +269,16 @@ int vfs_mkdir(dirnode_t* ref, char* path, mode_t mode){ int result = vfs_resolvepath(&buff, &parent, ref, path, name); - if(!parent){ - spinlock_release(&lock); - return result; - } if(buff){ spinlock_release(&lock); return EEXIST; } + + if(!parent){ + spinlock_release(&lock); + return result; + } + result = parent->vnode.fs->calls->mkdir(parent, name, mode);