4 #include "fsck_helper.h"
7 static bool parse_directory(uint32_t inodeidx
)
12 SOInode inode
, newinode
;
13 SODirEntry dec
[DPC
]; /* direntry cluster */
17 fetch_superblock(&sb
);
18 printf("Parsing directory number %d.\n", inodeidx
);
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");
29 ictable_get(inodeidx
, &icstat
);
31 ictable_set(inodeidx
, busy
);
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
);
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
);
66 testresult_t
test_inused(void)
75 fetch_superblock(&sb
);
79 /* begin in root directory */
80 if (parse_directory(0) == false) {
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
);