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