test_clusterfree refactored
[fsck.sofs09.git] / test_inused.c
blobdc086ea3071ed1ddd76f8ddd05bfa03ca2cf6775
1 #include <stdio.h>
3 #include "fsck.h"
4 #include "fsck_helper.h"
5 #include "sofs09.h"
7 static bool parse_directory(uint32_t inodeidx)
9 bool ret;
10 uint32_t fret;
11 uint32_t den, den_max, den_mod;
12 SOInode inode, newinode;
13 SODirEntry dec[DPC]; /* direntry cluster */
14 ic_t icstat;
15 SOSuperBlock *sb;
17 fetch_superblock(&sb);
19 ret = true;
21 fret = soReadInode(&inode, inodeidx);
22 if (fret < 0) FABORT(fret, "parse_directory");
24 if ((inode.size % sizeof(SODirEntry)) != 0) {
25 printf("Inode %d is a directory but its size is not multiple of "
26 "sizeof(SODirEntry).\n", inodeidx);
27 return false;
30 den_max = inode.size/sizeof(SODirEntry);
31 for (den = 0; den < den_max; ++den) {
32 /* read a new cluster when necessary */
33 den_mod = den%DPC;
34 if (den_mod == 0) {
35 fret = soReadFileCluster(inodeidx, den/DPC, dec);
36 if (fret < 0) FABORT(fret, "parse_directory");
38 /* process direntry */
39 if (dec[den_mod].name[0] != '\0') {
40 /* check validity of inode address */
41 if (dec[den_mod].inode >= sb->itotal) {
42 printf("Direntry number %d of inode %d is pointing to %d, "
43 "which lies outside inode table.\n", den,
44 inodeidx, dec[den_mod].inode);
45 return false;
48 fret = soReadInode(&newinode, dec[den_mod].inode);
49 if (fret < 0) FABORT(fret, "parse_directory");
51 if ((newinode.mode & INODE_DIR) == INODE_DIR) {
52 ret = parse_directory(dec[den_mod].inode);
55 /* update tables */
56 irtable_inc(dec[den_mod].inode);
57 ictable_get(dec[den_mod].inode, &icstat);
58 switch (icstat) {
59 case bah:
60 ictable_set(dec[den_mod].inode, busy);
61 break;
62 case idle:
63 printf ("Inode %d is marked as free but is in use.\n",
64 dec[den_mod].inode);
65 break;
66 case busy:
67 /* already parsed this inode * */
68 break;
69 default:
70 printf("BUM! ictable has something strange in it.\n");
71 return false;
72 break;
77 return ret;
80 testresult_t test_inused(void)
82 testresult_t ret;
84 ret = nice;
86 /* begin in root directory */
87 if (parse_directory(0) == false) {
88 ret = corrupt;
91 return ret;