From c0b79d0957564889a9221c0f0378417052a80b89 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Crist=C3=B3v=C3=A3o=20Cruz?= Date: Tue, 9 Feb 2010 19:08:36 +0000 Subject: [PATCH] test_insued refactored --- test_inused.c | 196 +++++++++++++++++++++++++++------------------------------- 1 file changed, 92 insertions(+), 104 deletions(-) rewrite test_inused.c (79%) diff --git a/test_inused.c b/test_inused.c dissimilarity index 79% index cf41625..dc086ea 100644 --- a/test_inused.c +++ b/test_inused.c @@ -1,104 +1,92 @@ -#include - -#include "fsck.h" -#include "fsck_helper.h" -#include "sofs09.h" - -/* this function needs to be remade. IT IS NASTY */ -static bool parse_directory(uint32_t inodeidx) -{ - bool ret; - uint32_t fret; - uint32_t cn, den; - SOInode inode, newinode; - SODirEntry dec[DPC]; /* direntry cluster */ - ic_t icstat; - SOSuperBlock *sb; - - fetch_superblock(&sb); - - ret = true; - - fret = soReadInode(&inode, inodeidx); - if (fret < 0) FABORT(fret, "parse_directory"); - - ictable_get(inodeidx, &icstat); - switch (icstat) { - case bah: - ictable_set(inodeidx, busy); - break; - case idle: - printf ("Inode %d is marked as free but is in use.\n", inodeidx); - break; - case busy: - /* already parsed this inode */ - break; - default: - printf("BUM! ictable has something strange in it.\n"); - return false; - break; - } - - for (cn = 0; (cn*CLUSTER_SIZE < inode.size) && (ret != false) - && (icstat == bah); ++cn) { - /* read a new cluster */ - fret = soReadFileCluster(inodeidx, cn, dec); - if (fret < 0) FABORT(fret, "parse_directory"); - for (den = 0; (den < DPC) && ((cn*CLUSTER_SIZE + den*sizeof(SODirEntry)) - < inode.size) && (ret != false); ++den) { - /* process direntry */ - if (dec[den].name[0] != '\0') { - if (dec[den].inode >= sb->itotal) { - printf("Direntry number %d of inode %d is pointing to %d, " - "which lies outside inode table.\n", den+(cn*DPC), - inodeidx, dec[den].inode); - ret = false; - } else { - irtable_inc(dec[den].inode); - fret = soReadInode(&newinode, dec[den].inode); - if (fret < 0) FABORT(fret, "parse_directory"); - if ((newinode.mode & INODE_DIR) == INODE_DIR) { - ret = parse_directory(dec[den].inode); - } else { - ictable_get(dec[den].inode, &icstat); - switch (icstat) { - case bah: - ictable_set(dec[den].inode, busy); - break; - case idle: - printf - ("Inode %d is marked as free but is in " - "use.\n", dec[den].inode); - break; - case - busy: - /* already parsed this inode * */ - break; - default: - printf("BUM! ictable has something strange in " - "it.\n"); - return false; - break; - } - } - } - } - } - } - - return ret; -} - -testresult_t test_inused(void) -{ - testresult_t ret; - - ret = nice; - - /* begin in root directory */ - if (parse_directory(0) == false) { - ret = corrupt; - } - - return ret; -} +#include + +#include "fsck.h" +#include "fsck_helper.h" +#include "sofs09.h" + +static bool parse_directory(uint32_t inodeidx) +{ + bool ret; + uint32_t fret; + uint32_t den, den_max, den_mod; + SOInode inode, newinode; + SODirEntry dec[DPC]; /* direntry cluster */ + ic_t icstat; + SOSuperBlock *sb; + + fetch_superblock(&sb); + + ret = true; + + fret = soReadInode(&inode, inodeidx); + if (fret < 0) FABORT(fret, "parse_directory"); + + if ((inode.size % sizeof(SODirEntry)) != 0) { + printf("Inode %d is a directory but its size is not multiple of " + "sizeof(SODirEntry).\n", inodeidx); + return false; + } + + den_max = inode.size/sizeof(SODirEntry); + for (den = 0; den < den_max; ++den) { + /* read a new cluster when necessary */ + den_mod = den%DPC; + if (den_mod == 0) { + fret = soReadFileCluster(inodeidx, den/DPC, dec); + if (fret < 0) FABORT(fret, "parse_directory"); + } + /* process direntry */ + if (dec[den_mod].name[0] != '\0') { + /* check validity of inode address */ + if (dec[den_mod].inode >= sb->itotal) { + printf("Direntry number %d of inode %d is pointing to %d, " + "which lies outside inode table.\n", den, + inodeidx, dec[den_mod].inode); + return false; + } + + fret = soReadInode(&newinode, dec[den_mod].inode); + if (fret < 0) FABORT(fret, "parse_directory"); + + if ((newinode.mode & INODE_DIR) == INODE_DIR) { + ret = parse_directory(dec[den_mod].inode); + } + + /* update tables */ + irtable_inc(dec[den_mod].inode); + ictable_get(dec[den_mod].inode, &icstat); + switch (icstat) { + case bah: + ictable_set(dec[den_mod].inode, busy); + break; + case idle: + printf ("Inode %d is marked as free but is in use.\n", + dec[den_mod].inode); + break; + case busy: + /* already parsed this inode * */ + break; + default: + printf("BUM! ictable has something strange in it.\n"); + return false; + break; + } + } + } + + return ret; +} + +testresult_t test_inused(void) +{ + testresult_t ret; + + ret = nice; + + /* begin in root directory */ + if (parse_directory(0) == false) { + ret = corrupt; + } + + return ret; +} -- 2.11.4.GIT