test_clusterused refactoring complete
[fsck.sofs09.git] / test_infree.c
blob1af8f851a47c8a348c04c296e6d14246896d9682
1 #include <stdio.h>
2 #include "fsck.h"
3 #include "fsck_helper.h"
4 #include "sofs09.h"
6 testresult_t test_infree (void)
8 testresult_t ret;
9 uint32_t fret;
10 SOSuperBlock *sb;
11 uint32_t ifree;
12 SOInode inode;
13 uint32_t inodeidx;
14 ic_t icstat;
16 ret = nice;
18 fetch_superblock(&sb);
20 ifree = 0;
21 inodeidx = sb->ihead;
22 while ((inodeidx != NULL_INODE) && (ret != corrupt)) {
23 if (inodeidx < sb->itotal) {
24 ictable_get(inodeidx, &icstat);
25 switch (icstat) {
26 case bah:
27 fret = soReadInode(&inode, inodeidx);
28 if (fret < 0) FABORT(fret, "test_infree");
29 ifree++;
30 ictable_set(inodeidx, idle);
31 break;
32 case busy:
33 printf("Free inode list contains used inodes.\n");
34 ret = corrupt;
35 break;
36 case idle:
37 printf("Free inode list closes over itself.\n");
38 ret = corrupt;
39 break;
40 default:
41 printf("BUM! ictable has something strange in it.\n");
42 return corrupt;
43 break;
45 } else {
46 printf("Free inode list has a member pointing to %d, which is "
47 "outside the list.\n", inodeidx);
48 ret = corrupt;
50 inodeidx = inode.next;
53 if ((ret != corrupt) && (ifree != sb->ifree)) {
54 printf("ifree is incorrect.\n");
55 ret = corrupt;
58 return ret;