aboutsummaryrefslogtreecommitdiff
path: root/kernel/fs/s5fs/s5fs.c
diff options
context:
space:
mode:
authorsotech117 <michael_foiani@brown.edu>2024-05-15 07:48:27 +0000
committersotech117 <michael_foiani@brown.edu>2024-05-15 07:48:27 +0000
commite3e0b874c1ca34d16abafd96f804f4bdd63e245f (patch)
tree80193dc7b65c58ee725c91701fbed76b949394a1 /kernel/fs/s5fs/s5fs.c
parent466ae74b0809c795d8977ef872a97d27292b7973 (diff)
more s5 fixes rip
Diffstat (limited to 'kernel/fs/s5fs/s5fs.c')
-rw-r--r--kernel/fs/s5fs/s5fs.c106
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;
}