diff options
author | sotech117 <michael_foiani@brown.edu> | 2024-05-15 07:48:27 +0000 |
---|---|---|
committer | sotech117 <michael_foiani@brown.edu> | 2024-05-15 07:48:27 +0000 |
commit | e3e0b874c1ca34d16abafd96f804f4bdd63e245f (patch) | |
tree | 80193dc7b65c58ee725c91701fbed76b949394a1 /kernel/fs/s5fs/s5fs.c | |
parent | 466ae74b0809c795d8977ef872a97d27292b7973 (diff) |
more s5 fixes rip
Diffstat (limited to 'kernel/fs/s5fs/s5fs.c')
-rw-r--r-- | kernel/fs/s5fs/s5fs.c | 106 |
1 files changed, 5 insertions, 101 deletions
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; } |