リビジョン | f9c0f1b75b818b5a4f3ed65f65d6aa0fb529f24c (tree) |
---|---|
日時 | 2018-09-15 13:52:46 |
作者 | relan <relan@user...> |
コミッター | relan |
Repairing: implement unknown entry type fix.
@@ -238,5 +238,7 @@ bool exfat_fix_invalid_vbr_checksum(const struct exfat* ef, void* sector, | ||
238 | 238 | uint32_t vbr_checksum); |
239 | 239 | bool exfat_fix_invalid_node_checksum(const struct exfat* ef, |
240 | 240 | struct exfat_node* node); |
241 | +bool exfat_fix_unknown_entry(struct exfat* ef, struct exfat_node* dir, | |
242 | + const struct exfat_entry* entry, off_t offset); | |
241 | 243 | |
242 | 244 | #endif /* ifndef EXFAT_H_INCLUDED */ |
@@ -517,7 +517,8 @@ static int readdir(struct exfat* ef, struct exfat_node* parent, | ||
517 | 517 | break; /* deleted entry, ignore it */ |
518 | 518 | |
519 | 519 | exfat_error("unknown entry type %#hhx", entry.type); |
520 | - return -EIO; | |
520 | + if (!EXFAT_REPAIR(unknown_entry, ef, parent, &entry, *offset)) | |
521 | + return -EIO; | |
521 | 522 | } |
522 | 523 | *offset += sizeof(entry); |
523 | 524 | } |
@@ -86,3 +86,17 @@ bool exfat_fix_invalid_node_checksum(const struct exfat* ef, | ||
86 | 86 | exfat_errors_fixed++; |
87 | 87 | return true; |
88 | 88 | } |
89 | + | |
90 | +bool exfat_fix_unknown_entry(struct exfat* ef, struct exfat_node* dir, | |
91 | + const struct exfat_entry* entry, off_t offset) | |
92 | +{ | |
93 | + struct exfat_entry deleted = *entry; | |
94 | + | |
95 | + deleted.type &= ~EXFAT_ENTRY_VALID; | |
96 | + if (exfat_generic_pwrite(ef, dir, &deleted, sizeof(struct exfat_entry), | |
97 | + offset) != sizeof(struct exfat_entry)) | |
98 | + return false; | |
99 | + | |
100 | + exfat_errors_fixed++; | |
101 | + return true; | |
102 | +} |