sbfctablesize comparison corrected.
[fsck.sofs09.git] / test_inused.c
blobb2ed92572acb69cd7c4811dc60ed5448c1c1217d
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 cn, den;
12 SOInode inode, newinode;
13 SODirEntry dec[DPC]; /* direntry cluster */
14 ic_t icstat;
15 SOSuperBlock *sb;
17 fetch_superblock(&sb);
18 printf("Parsing directory number %d.\n", inodeidx);
20 ret = true;
22 fret = soReadInode(&inode, inodeidx);
23 if (fret < 0) FABORT(fret, "parse_directory");
25 if ((inode.mode & INODE_FREE) == INODE_FREE) {
26 printf("Some direntry is pointing to a free indoe.\n");
27 ret = false;
28 } else {
29 ictable_get(inodeidx, &icstat);
30 if (icstat == bah) {
31 ictable_set(inodeidx, busy);
32 cn = 0;
33 } else {
34 /* inode already processed */
35 cn = MAX_FILE_CLUSTERS+1;
39 /* cn was just set, so the following for may not always run */
40 for (; (cn*CLUSTER_SIZE < inode.size) && (ret != false); ++cn) {
41 /* read a new cluster */
42 fret = soReadFileCluster(inodeidx, cn, dec);
43 if (fret < 0) FABORT(fret, "parse_directory");
44 for (den = 0; (den < DPC) && (ret != false); ++den) {
45 /* process direntry */
46 if (dec[den].name[0] != '\0') {
47 if (dec[den].inode >= sb->itotal) {
48 printf("Direntry number %d of inode %d is corrupted.\n",
49 den+(cn*DPC), inodeidx);
50 ret = false;
51 } else {
52 irtable_inc(dec[den].inode);
53 fret = soReadInode(&newinode, dec[den].inode);
54 if (fret < 0) FABORT(fret, "parse_directory");
55 if ((newinode.mode & INODE_DIR) == INODE_DIR) {
56 ret = parse_directory(dec[den].inode);
63 return ret;
66 testresult_t test_inused(void)
68 testresult_t ret;
69 uint32_t fret;
70 uint32_t r;
71 uint32_t realrefc;
72 SOInode inode;
73 SOSuperBlock *sb;
75 fetch_superblock(&sb);
77 ret = nice;
79 /* begin in root directory */
80 if (parse_directory(0) == false) {
81 ret = corrupt;
82 } else {
83 for (r = 0; r < sb->itotal; ++r) {
84 fret = soReadInode(&inode, r);
85 if (fret < 0) FABORT(fret, "test_inused");
86 irtable_get(r, &realrefc);
87 if (realrefc != inode.refcount) {
88 printf("Refcount of inode %d is %d, should be %d.\n", r,
89 inode.refcount, realrefc);
90 ret = corrupt;
95 return ret;