fsck: repair unknown directory entries
if unknown directory entries are found,
Clear InUse bit in EntryType field.
Signed-off-by: Hyunchul Lee <hyc.lee@gmail.com>
diff --git a/fsck/fsck.c b/fsck/fsck.c
index 1e1d84d..9c2508f 100644
--- a/fsck/fsck.c
+++ b/fsck/fsck.c
@@ -89,9 +89,13 @@
#define repair_file_ask(iter, inode, code, fmt, ...) \
({ \
- exfat_resolve_path_parent(&path_resolve_ctx, \
- (iter)->parent, inode); \
- exfat_repair_ask(&exfat_fsck, code, \
+ if (inode) \
+ exfat_resolve_path_parent(&path_resolve_ctx, \
+ (iter)->parent, inode); \
+ else \
+ exfat_resolve_path(&path_resolve_ctx, \
+ (iter)->parent); \
+ exfat_repair_ask(&exfat_fsck, code, \
"ERROR: %s: " fmt " at %#" PRIx64, \
path_resolve_ctx.local_path, \
##__VA_ARGS__, \
@@ -951,18 +955,27 @@
} else
exfat_free_inode(node);
break;
+ case EXFAT_LAST:
+ goto out;
case EXFAT_VOLUME:
case EXFAT_BITMAP:
case EXFAT_UPCASE:
- break;
- case EXFAT_LAST:
- goto out;
+ if (dir == exfat->root)
+ break;
+ /* fallthrough */
default:
if (IS_EXFAT_DELETED(dentry->type))
break;
- exfat_err("unknown entry type. 0x%x\n", dentry->type);
- ret = -EINVAL;
- goto err;
+ if (repair_file_ask(de_iter, NULL, ER_DE_UNKNOWN,
+ "unknown entry type %#x at %07" PRIx64,
+ dentry->type,
+ exfat_de_iter_file_offset(de_iter))) {
+ struct exfat_dentry *dentry;
+
+ exfat_de_iter_get_dirty(de_iter, 0, &dentry);
+ dentry->type &= EXFAT_DELETE;
+ }
+ break;
}
exfat_de_iter_advance(de_iter, dentry_count);
diff --git a/fsck/repair.c b/fsck/repair.c
index 0721067..97c3ed6 100644
--- a/fsck/repair.c
+++ b/fsck/repair.c
@@ -38,6 +38,7 @@
{ER_BS_CHECKSUM, ERF_PREEN_YES, ERP_FIX},
{ER_BS_BOOT_REGION, 0, ERP_FIX},
{ER_DE_CHECKSUM, ERF_PREEN_YES, ERP_FIX},
+ {ER_DE_UNKNOWN, ERF_PREEN_YES, ERP_FIX},
{ER_FILE_VALID_SIZE, ERF_PREEN_YES, ERP_FIX},
{ER_FILE_INVALID_CLUS, ERF_PREEN_YES, ERP_TRUNCATE},
{ER_FILE_FIRST_CLUS, ERF_PREEN_YES, ERP_TRUNCATE},
diff --git a/fsck/repair.h b/fsck/repair.h
index fbdc607..4f36547 100644
--- a/fsck/repair.h
+++ b/fsck/repair.h
@@ -8,6 +8,7 @@
#define ER_BS_CHECKSUM 0x00000001
#define ER_BS_BOOT_REGION 0x00000002
#define ER_DE_CHECKSUM 0x00001001
+#define ER_DE_UNKNOWN 0x00001002
#define ER_FILE_VALID_SIZE 0x00002001
#define ER_FILE_INVALID_CLUS 0x00002002
#define ER_FILE_FIRST_CLUS 0x00002003