From e3e0b874c1ca34d16abafd96f804f4bdd63e245f Mon Sep 17 00:00:00 2001 From: sotech117 Date: Wed, 15 May 2024 07:48:27 +0000 Subject: more s5 fixes rip --- kernel/fs/s5fs/s5fs.c | 106 +++----------------------------------------------- 1 file changed, 5 insertions(+), 101 deletions(-) (limited to 'kernel/fs/s5fs/s5fs.c') diff --git a/kernel/fs/s5fs/s5fs.c b/kernel/fs/s5fs/s5fs.c index dedadaf..9a907a3 100644 --- a/kernel/fs/s5fs/s5fs.c +++ b/kernel/fs/s5fs/s5fs.c @@ -657,97 +657,7 @@ static long s5fs_rename(vnode_t *olddir, const char *oldname, size_t oldnamelen, size_t newnamelen) { // NOT_YET_IMPLEMENTED("S5FS: s5fs_rename"); - - // Check if the new name is too long - if (newnamelen >= NAME_LEN) - { - return -ENAMETOOLONG; - } - - // Find the old directory entry - s5_node_t *s5_node = VNODE_TO_S5NODE(olddir); - size_t filepos; - long ino = s5_find_dirent(s5_node, oldname, oldnamelen, &filepos); - // Check if the directory entry was not found - if (ino < 0) - { - return ino; - } - - // Get the found vnode - vnode_t *child = vget_locked(olddir->vn_fs, ino); - KASSERT(!S_ISDIR(child->vn_mode) && "should be handled at the VFS level"); - - // Check if the new directory is not a directory - if (!S_ISDIR(newdir->vn_mode)) - { - vput_locked(&child); - return -ENOTDIR; - } - - // Find the new directory entry - s5_node_t *new_s5_node = VNODE_TO_S5NODE(newdir); - size_t new_filepos; - long new_ino = s5_find_dirent(new_s5_node, newname, newnamelen, &new_filepos); - // Check if the directory entry is new - if (new_ino == -ENOENT) - { - // Link the new directory - long link = s5_link(new_s5_node, newname, newnamelen, VNODE_TO_S5NODE(child)); - // Check if the link operation failed - if (link < 0) - { - vput_locked(&child); - return link; - } - - // Remove the old directory entry - s5_remove_dirent(s5_node, oldname, oldnamelen, VNODE_TO_S5NODE(olddir)); - // Check if this failed (TODO: ask in hours) - - return link; - } - - // Else, the new directory entry was found and we need to replace it - // Get the new found vnode - vnode_t *new_child = vget_locked(newdir->vn_fs, new_ino); - KASSERT(!S_ISDIR(new_child->vn_mode) && "should be handled at the VFS level"); - - // Check if the old and new vnodes are the same - if (child->vn_vno == new_child->vn_vno) - { - vput_locked(&child); - vput_locked(&new_child); - return 0; - } - - // Check if the new vnode is a directory - if (S_ISDIR(new_child->vn_mode)) - { - vput_locked(&child); - vput_locked(&new_child); - return -EISDIR; - } - - // Remove the new directory entry - s5_remove_dirent(new_s5_node, newname, newnamelen, new_filepos); - // Check if this failed (TODO: ask in hours) - // Link the new directory - long link = s5_link(new_s5_node, newname, newnamelen, VNODE_TO_S5NODE(child)); - // Check if the link operation failed - if (link < 0) - { - vput_locked(&child); - vput_locked(&new_child); - return link; - } - - // Remove the old directory entry - s5_remove_dirent(s5_node, oldname, oldnamelen, VNODE_TO_S5NODE(olddir)); - - vput_locked(&child); - vput_locked(&new_child); - return link; + return -1; } /* Create a directory. @@ -786,7 +696,7 @@ static long s5fs_mkdir(vnode_t *dir, const char *name, size_t namelen, // Allocate the inode s5_inode_t *s5_inode; - long inode_num = s5_alloc_inode(s5fs, type, &s5_inode); + long inode_num = s5_alloc_inode(s5fs, type, 0); // Check if the inode allocation failed if (inode_num < 0) { @@ -809,8 +719,7 @@ static long s5fs_mkdir(vnode_t *dir, const char *name, size_t namelen, // Check if the link operation failed if (link < 0) { - vput(new_vnode); - s5_free_inode(s5fs, inode_num); + vput(&new_vnode); return link; } @@ -821,9 +730,7 @@ static long s5fs_mkdir(vnode_t *dir, const char *name, size_t namelen, // Check if the link operation failed if (link2 < 0) { - s5_remove_dirent(VNODE_TO_S5NODE(new_vnode), ".", 1, VNODE_TO_S5FS(dir)); - vput(new_vnode); - s5_free_inode(s5fs, inode_num); + vput(&new_vnode); return link2; } @@ -834,10 +741,7 @@ static long s5fs_mkdir(vnode_t *dir, const char *name, size_t namelen, // Check if the link operation failed if (link3 < 0) { - s5_remove_dirent(VNODE_TO_S5NODE(new_vnode), ".", 1, VNODE_TO_S5FS(dir)); - s5_remove_dirent(VNODE_TO_S5NODE(new_vnode), "..", 2, VNODE_TO_S5FS(dir)); - vput(new_vnode); - s5_free_inode(s5fs, inode_num); + vput(&new_vnode); return link3; } -- cgit v1.2.3-70-g09d2