diff options
author | sotech117 <michael_foiani@brown.edu> | 2024-05-15 10:02:30 +0000 |
---|---|---|
committer | sotech117 <michael_foiani@brown.edu> | 2024-05-15 10:02:30 +0000 |
commit | 883711347e22d9e21c6510fa987d3a05779d6fac (patch) | |
tree | 90578a236d5fdbeae82e55f32c0d0cb65807ecf3 | |
parent | 3a367faa2d992427575358064ec6a7c97316b094 (diff) |
final s5 tweaks
-rw-r--r-- | kernel/fs/s5fs/s5fs.c | 24 | ||||
-rw-r--r-- | kernel/fs/s5fs/s5fs_subr.c | 2 |
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) { |