aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsotech117 <michael_foiani@brown.edu>2024-05-15 10:02:30 +0000
committersotech117 <michael_foiani@brown.edu>2024-05-15 10:02:30 +0000
commit883711347e22d9e21c6510fa987d3a05779d6fac (patch)
tree90578a236d5fdbeae82e55f32c0d0cb65807ecf3
parent3a367faa2d992427575358064ec6a7c97316b094 (diff)
final s5 tweaks
-rw-r--r--kernel/fs/s5fs/s5fs.c24
-rw-r--r--kernel/fs/s5fs/s5fs_subr.c2
2 files changed, 15 insertions, 11 deletions
diff --git a/kernel/fs/s5fs/s5fs.c b/kernel/fs/s5fs/s5fs.c
index 9a907a3..f41d00f 100644
--- a/kernel/fs/s5fs/s5fs.c
+++ b/kernel/fs/s5fs/s5fs.c
@@ -691,6 +691,7 @@ static long s5fs_mkdir(vnode_t *dir, const char *name, size_t namelen,
// NOT_YET_IMPLEMENTED("S5FS: s5fs_mkdir");
// Allocate a new inode, get its properties first
+ vlock(dir);
s5fs_t *s5fs = VNODE_TO_S5FS(dir);
uint16_t type = S5_TYPE_DIR;
@@ -704,46 +705,49 @@ static long s5fs_mkdir(vnode_t *dir, const char *name, size_t namelen,
}
// Create the new vnode
- vnode_t *new_vnode = vget(dir->vn_fs, inode_num);
+ vnode_t *new_vnode = vget_locked(dir->vn_fs, inode_num);
// Check if the vnode creation failed
if (!new_vnode)
{
s5_free_inode(s5fs, inode_num);
+ vput_locked(&new_vnode);
return -ENOMEM;
}
// Create the "." entry
- vlock(new_vnode);
long link = s5_link(VNODE_TO_S5NODE(new_vnode), ".", 1, VNODE_TO_S5NODE(new_vnode));
- vunlock(new_vnode);
// Check if the link operation failed
if (link < 0)
{
- vput(&new_vnode);
+ s5_free_inode(s5fs, inode_num);
+ vput_locked(&new_vnode);
return link;
}
// Create the ".." entry
- vlock(new_vnode);
long link2 = s5_link(VNODE_TO_S5NODE(new_vnode), "..", 2, VNODE_TO_S5NODE(dir));
- vunlock(new_vnode);
// Check if the link operation failed
if (link2 < 0)
{
- vput(&new_vnode);
+ s5_remove_dirent(VNODE_TO_S5NODE(new_vnode), ".", 1, VNODE_TO_S5FS(dir));
+ s5_free_inode(s5fs, inode_num);
+ vput_locked(&new_vnode);
return link2;
}
// Link the new directory to the parent
- vlock(dir);
long link3 = s5_link(VNODE_TO_S5NODE(dir), name, namelen, VNODE_TO_S5NODE(new_vnode));
- vunlock(dir);
// Check if the link operation failed
if (link3 < 0)
{
- vput(&new_vnode);
+ 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));
+ s5_free_inode(s5fs, inode_num);
+ vput_locked(&new_vnode);
return link3;
}
+ vunlock(new_vnode);
+ vunlock(dir);
// Set the out pointer to the new vnode
*out = new_vnode;
diff --git a/kernel/fs/s5fs/s5fs_subr.c b/kernel/fs/s5fs/s5fs_subr.c
index 78af47b..7b0af30 100644
--- a/kernel/fs/s5fs/s5fs_subr.c
+++ b/kernel/fs/s5fs/s5fs_subr.c
@@ -357,7 +357,7 @@ ssize_t s5_write_file(s5_node_t *sn, size_t pos, const char *buf, size_t len)
// Get the pframe containing the block data
pframe_t *pf;
- long err = s5_get_file_block(sn, file_blocknum, 1, &pf);
+ long err = s5_get_file_block(sn, file_blocknum, (long) 1, &pf);
// Propogate errors from s5_get_file_block
if (err < 0)
{