From 4de89d57f1ad217ba3cd009567ad63ba0afd275f Mon Sep 17 00:00:00 2001 From: hasslesstech Date: Sat, 26 Apr 2025 15:28:17 +0300 Subject: [PATCH] rearrange code to reduce nesting --- src/fs.c | 87 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 43 insertions(+), 44 deletions(-) diff --git a/src/fs.c b/src/fs.c index 6269e33..0219f3d 100644 --- a/src/fs.c +++ b/src/fs.c @@ -502,54 +502,53 @@ static int fs_remove_fname_from_directory(unsigned int dir_inode_ptr, char *fnam f.ref_count--; write_block(read_inode_ptr(recs[k].inode_no), (void *) &f); - // if it drops to zero, nullify inode_ptr pointing to this inode - if (!f.ref_count) { - pr("ref_count=0, clearing inode_ptr\n"); - write_inode_ptr(recs[k].inode_no, 0); - - // if no fd reference this inode, clean it up altogether - int i; - for (i = 0; i < FS_MAX_OPEN_FD; i++) - if (fs_file_descriptions[i].inode == inode_location_cache) - break; - - if (i == FS_MAX_OPEN_FD) { - pr("No open fd reference inode %d, cleaning up\n", inode_location_cache); - - struct fs_inode f; - read_block(inode_location_cache, (void *) &f); - - // clear blocks referenced in base inode - for (int i = 0; i < BLOCK_ADDRESSES_PER_INODE; i++) { - if (f.blocks[i]) - mark_free(f.blocks[i]); - } - mark_free(inode_location_cache); - - // clear blocks referenced in inode extensions - struct fs_inode_extension ext; - unsigned int next_extension = f.next_extension; - - while (next_extension) { - mark_free(next_extension); - read_block(next_extension, (void *) &ext); - next_extension = ext.next_extension; - - for (int i = 0; i < BLOCK_ADDRESSES_PER_INODE_EXTENSION; i++) { - if (ext.blocks[i]) - mark_free(ext.blocks[i]); - } - } - } else { - pr("Inode %d is still referenced by fd %d, not removing it\n", - inode_location_cache, i); - } - } - // clear directory record inode_ptr recs[k].inode_no = 0; write_block(dir.blocks[i], (void *) &recs); + // if it drops to zero, nullify inode_ptr pointing to this inode + if (f.ref_count) + goto fs_remove_fname_from_directory_finish; + + pr("ref_count=0, clearing inode_ptr\n"); + write_inode_ptr(recs[k].inode_no, 0); + + // if no fd reference this inode, clean it up altogether + int i; + for (i = 0; i < FS_MAX_OPEN_FD; i++) + if (fs_file_descriptions[i].inode == inode_location_cache) + break; + + if (i != FS_MAX_OPEN_FD) { + pr("Inode %d is still referenced by fd %d, not removing it\n", + inode_location_cache, i); + goto fs_remove_fname_from_directory_finish; + } + + pr("No open fd reference inode %d, cleaning up\n", inode_location_cache); + + // clear blocks referenced in base inode + for (int i = 0; i < BLOCK_ADDRESSES_PER_INODE; i++) { + if (f.blocks[i]) + mark_free(f.blocks[i]); + } + mark_free(inode_location_cache); + + // clear blocks referenced in inode extensions + struct fs_inode_extension ext; + unsigned int next_extension = f.next_extension; + + while (next_extension) { + mark_free(next_extension); + read_block(next_extension, (void *) &ext); + next_extension = ext.next_extension; + + for (int i = 0; i < BLOCK_ADDRESSES_PER_INODE_EXTENSION; i++) { + if (ext.blocks[i]) + mark_free(ext.blocks[i]); + } + } + goto fs_remove_fname_from_directory_finish; } }