1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2019 Namjae Jeon <linkinjeon@kernel.org>
4 * Copyright (C) 2020 Hyunchul Lee <hyc.lee@gmail.com>
16 #include "exfat_ondisk.h"
20 #include "exfat_dir.h"
23 struct fsck_user_input {
24 struct exfat_user_input ei;
25 enum fsck_ui_options options;
28 #define EXFAT_MAX_UPCASE_CHARS 0x10000
30 #define FSCK_EXIT_NO_ERRORS 0x00
31 #define FSCK_EXIT_CORRECTED 0x01
32 #define FSCK_EXIT_NEED_REBOOT 0x02
33 #define FSCK_EXIT_ERRORS_LEFT 0x04
34 #define FSCK_EXIT_OPERATION_ERROR 0x08
35 #define FSCK_EXIT_SYNTAX_ERROR 0x10
36 #define FSCK_EXIT_USER_CANCEL 0x20
37 #define FSCK_EXIT_LIBRARY_ERROR 0x80
46 struct exfat_fsck exfat_fsck;
47 struct exfat_stat exfat_stat;
48 struct path_resolve_ctx path_resolve_ctx;
50 static struct option opts[] = {
51 {"repair", no_argument, NULL, 'r' },
52 {"repair-yes", no_argument, NULL, 'y' },
53 {"repair-no", no_argument, NULL, 'n' },
54 {"repair-auto", no_argument, NULL, 'p' },
55 {"rescue", no_argument, NULL, 's' },
56 {"version", no_argument, NULL, 'V' },
57 {"verbose", no_argument, NULL, 'v' },
58 {"help", no_argument, NULL, 'h' },
59 {"?", no_argument, NULL, '?' },
60 {"ignore-bad-fs", no_argument, NULL, 'b' },
64 static void usage(char *name)
66 fprintf(stderr, "Usage: %s\n", name);
67 fprintf(stderr, "\t-r | --repair Repair interactively\n");
68 fprintf(stderr, "\t-y | --repair-yes Repair without ask\n");
69 fprintf(stderr, "\t-n | --repair-no No repair\n");
70 fprintf(stderr, "\t-p | --repair-auto Repair automatically\n");
71 fprintf(stderr, "\t-a Repair automatically\n");
72 fprintf(stderr, "\t-b | --ignore-bad-fs Try to recover even if exfat is not found\n");
73 fprintf(stderr, "\t-s | --rescue Assign orphaned clusters to files\n");
74 fprintf(stderr, "\t-V | --version Show version\n");
75 fprintf(stderr, "\t-v | --verbose Print debug\n");
76 fprintf(stderr, "\t-h | --help Show help\n");
78 exit(FSCK_EXIT_SYNTAX_ERROR);
81 #define fsck_err(parent, inode, fmt, ...) \
83 exfat_resolve_path_parent(&path_resolve_ctx, \
85 exfat_err("ERROR: %s: " fmt, \
86 path_resolve_ctx.local_path, \
90 #define repair_file_ask(iter, inode, code, fmt, ...) \
93 exfat_resolve_path_parent(&path_resolve_ctx, \
94 (iter)->parent, inode); \
96 exfat_resolve_path(&path_resolve_ctx, \
98 exfat_repair_ask(&exfat_fsck, code, \
99 "ERROR: %s: " fmt " at %#" PRIx64, \
100 path_resolve_ctx.local_path, \
102 exfat_de_iter_device_offset(iter)); \
105 static int check_clus_chain(struct exfat_de_iter *de_iter,
106 struct exfat_inode *node)
108 struct exfat *exfat = de_iter->exfat;
109 struct exfat_dentry *stream_de;
110 clus_t clus, prev, next;
111 uint64_t count, max_count;
113 clus = node->first_clus;
114 prev = EXFAT_EOF_CLUSTER;
116 max_count = DIV_ROUND_UP(node->size, exfat->clus_size);
118 if (node->size == 0 && node->first_clus == EXFAT_FREE_CLUSTER)
121 /* the first cluster is wrong */
122 if ((node->size == 0 && node->first_clus != EXFAT_FREE_CLUSTER) ||
123 (node->size > 0 && !exfat_heap_clus(exfat, node->first_clus))) {
124 if (repair_file_ask(de_iter, node,
126 "size %#" PRIx64 ", but the first cluster %#x",
127 node->size, node->first_clus))
133 while (clus != EXFAT_EOF_CLUSTER) {
134 if (count >= max_count) {
135 if (node->is_contiguous)
137 if (repair_file_ask(de_iter, node,
138 ER_FILE_SMALLER_SIZE,
139 "more clusters are allocated. truncate to %"
141 count * exfat->clus_size))
148 * This cluster is already allocated. it may be shared with
149 * the other file, or there is a loop in cluster chain.
151 if (exfat_bitmap_get(exfat->alloc_bitmap, clus)) {
152 if (repair_file_ask(de_iter, node,
153 ER_FILE_DUPLICATED_CLUS,
154 "cluster is already allocated for the other file. truncated to %"
156 count * exfat->clus_size))
162 if (!exfat_bitmap_get(exfat->disk_bitmap, clus)) {
163 if (!repair_file_ask(de_iter, node,
164 ER_FILE_INVALID_CLUS,
165 "cluster %#x is marked as free",
170 /* This cluster is allocated or not */
171 if (exfat_get_inode_next_clus(exfat, node, clus, &next))
173 if (next == EXFAT_BAD_CLUSTER) {
174 if (repair_file_ask(de_iter, node,
175 ER_FILE_INVALID_CLUS,
176 "BAD cluster. truncate to %"
178 count * exfat->clus_size))
182 } else if (!node->is_contiguous) {
183 if (next != EXFAT_EOF_CLUSTER &&
184 !exfat_heap_clus(exfat, next)) {
185 if (repair_file_ask(de_iter, node,
186 ER_FILE_INVALID_CLUS,
187 "broken cluster chain. truncate to %"
189 (count + 1) * exfat->clus_size)) {
192 exfat_bitmap_set(exfat->alloc_bitmap,
202 exfat_bitmap_set(exfat->alloc_bitmap, clus);
207 if (count < max_count) {
208 if (repair_file_ask(de_iter, node, ER_FILE_LARGER_SIZE,
209 "less clusters are allocated. truncates to %"
211 count * exfat->clus_size))
219 node->size = count * exfat->clus_size;
220 if (!exfat_heap_clus(exfat, prev))
221 node->first_clus = EXFAT_FREE_CLUSTER;
223 exfat_de_iter_get_dirty(de_iter, 1, &stream_de);
224 if (count * exfat->clus_size <
225 le64_to_cpu(stream_de->stream_valid_size))
226 stream_de->stream_valid_size = cpu_to_le64(
227 count * exfat->clus_size);
228 if (!exfat_heap_clus(exfat, prev))
229 stream_de->stream_start_clu = EXFAT_FREE_CLUSTER;
230 stream_de->stream_size = cpu_to_le64(
231 count * exfat->clus_size);
233 /* remaining clusters will be freed while FAT is compared with
236 if (!node->is_contiguous && exfat_heap_clus(exfat, prev)) {
237 if (exfat_set_fat(exfat, prev, EXFAT_EOF_CLUSTER))
243 static int root_check_clus_chain(struct exfat *exfat,
244 struct exfat_inode *node,
247 clus_t clus, next, prev = EXFAT_EOF_CLUSTER;
249 if (!exfat_heap_clus(exfat, node->first_clus))
252 clus = node->first_clus;
256 if (exfat_bitmap_get(exfat->alloc_bitmap, clus)) {
257 if (exfat_repair_ask(&exfat_fsck,
258 ER_FILE_DUPLICATED_CLUS,
259 "ERROR: the cluster chain of root is cyclic"))
264 exfat_bitmap_set(exfat->alloc_bitmap, clus);
266 if (exfat_get_inode_next_clus(exfat, node, clus, &next)) {
267 exfat_err("ERROR: failed to read the fat entry of root");
271 if (next != EXFAT_EOF_CLUSTER && !exfat_heap_clus(exfat, next)) {
272 if (exfat_repair_ask(&exfat_fsck,
273 ER_FILE_INVALID_CLUS,
274 "ERROR: the cluster chain of root is broken")) {
275 if (next != EXFAT_BAD_CLUSTER) {
287 } while (clus != EXFAT_EOF_CLUSTER);
291 if (!exfat_heap_clus(exfat, prev)) {
292 exfat_err("ERROR: the start cluster of root is wrong\n");
295 node->size = *clus_count * exfat->clus_size;
296 return exfat_set_fat(exfat, prev, EXFAT_EOF_CLUSTER);
299 static int boot_region_checksum(int dev_fd,
300 int bs_offset, unsigned int sect_size)
307 sect = malloc(sect_size);
312 for (i = 0; i < 11; i++) {
313 if (exfat_read(dev_fd, sect, sect_size,
314 bs_offset * sect_size + i * sect_size) !=
315 (ssize_t)sect_size) {
316 exfat_err("failed to read boot region\n");
320 boot_calc_checksum(sect, sect_size, i == 0, &checksum);
323 if (exfat_read(dev_fd, sect, sect_size,
324 bs_offset * sect_size + 11 * sect_size) !=
325 (ssize_t)sect_size) {
326 exfat_err("failed to read a boot checksum sector\n");
331 for (i = 0; i < sect_size/sizeof(checksum); i++) {
332 if (le32_to_cpu(((__le32 *)sect)[i]) != checksum) {
333 exfat_err("checksum of boot region is not correct. %#x, but expected %#x\n",
334 le32_to_cpu(((__le32 *)sect)[i]), checksum);
344 static int exfat_mark_volume_dirty(struct exfat *exfat, bool dirty)
348 flags = le16_to_cpu(exfat->bs->bsx.vol_flags);
354 exfat->bs->bsx.vol_flags = cpu_to_le16(flags);
355 if (exfat_write(exfat->blk_dev->dev_fd, exfat->bs,
356 sizeof(struct pbr), 0) != (ssize_t)sizeof(struct pbr)) {
357 exfat_err("failed to set VolumeDirty\n");
361 if (fsync(exfat->blk_dev->dev_fd) != 0) {
362 exfat_err("failed to set VolumeDirty\n");
368 static int read_boot_region(struct exfat_blk_dev *bd, struct pbr **pbr,
369 int bs_offset, unsigned int sect_size,
376 bs = (struct pbr *)malloc(sizeof(struct pbr));
378 exfat_err("failed to allocate memory\n");
382 if (exfat_read(bd->dev_fd, bs, sizeof(*bs),
383 bs_offset * sect_size) != (ssize_t)sizeof(*bs)) {
384 exfat_err("failed to read a boot sector\n");
389 if (memcmp(bs->bpb.oem_name, "EXFAT ", 8) != 0) {
391 exfat_err("failed to find exfat file system\n");
395 ret = boot_region_checksum(bd->dev_fd, bs_offset, sect_size);
400 if (EXFAT_SECTOR_SIZE(bs) < 512 || EXFAT_SECTOR_SIZE(bs) > 4 * KB) {
402 exfat_err("too small or big sector size: %d\n",
403 EXFAT_SECTOR_SIZE(bs));
407 if (EXFAT_CLUSTER_SIZE(bs) > 32 * MB) {
409 exfat_err("too big cluster size: %d\n",
410 EXFAT_CLUSTER_SIZE(bs));
414 if (bs->bsx.fs_version[1] != 1 || bs->bsx.fs_version[0] != 0) {
416 exfat_err("unsupported exfat version: %d.%d\n",
417 bs->bsx.fs_version[1], bs->bsx.fs_version[0]);
421 if (bs->bsx.num_fats != 1) {
423 exfat_err("unsupported FAT count: %d\n",
428 if (le64_to_cpu(bs->bsx.vol_length) * EXFAT_SECTOR_SIZE(bs) >
431 exfat_err("too large sector count: %" PRIu64 ", expected: %llu\n",
432 le64_to_cpu(bs->bsx.vol_length),
437 if (le32_to_cpu(bs->bsx.clu_count) * EXFAT_CLUSTER_SIZE(bs) >
440 exfat_err("too large cluster count: %u, expected: %u\n",
441 le32_to_cpu(bs->bsx.clu_count),
453 static int restore_boot_region(struct exfat_blk_dev *bd, unsigned int sect_size)
459 sector = malloc(sect_size);
463 for (i = 0; i < 12; i++) {
464 if (exfat_read(bd->dev_fd, sector, sect_size,
465 BACKUP_BOOT_SEC_IDX * sect_size +
467 (ssize_t)sect_size) {
472 ((struct pbr *)sector)->bsx.perc_in_use = 0xff;
474 if (exfat_write(bd->dev_fd, sector, sect_size,
475 BOOT_SEC_IDX * sect_size +
477 (ssize_t)sect_size) {
483 if (fsync(bd->dev_fd)) {
494 static int exfat_boot_region_check(struct exfat_blk_dev *blkdev,
496 bool ignore_bad_fs_name)
498 struct pbr *boot_sect;
499 unsigned int sect_size;
502 /* First, find out the exfat sector size */
503 boot_sect = malloc(sizeof(*boot_sect));
504 if (boot_sect == NULL)
507 if (exfat_read(blkdev->dev_fd, boot_sect,
508 sizeof(*boot_sect), 0) != (ssize_t)sizeof(*boot_sect)) {
509 exfat_err("failed to read Main boot sector\n");
514 if (memcmp(boot_sect->bpb.oem_name, "EXFAT ", 8) != 0 &&
515 !ignore_bad_fs_name) {
516 exfat_err("Bad fs_name in boot sector, which does not describe a valid exfat filesystem\n");
521 sect_size = 1 << boot_sect->bsx.sect_size_bits;
524 /* check boot regions */
525 ret = read_boot_region(blkdev, bs,
526 BOOT_SEC_IDX, sect_size, true);
527 if (ret == -EINVAL &&
528 exfat_repair_ask(&exfat_fsck, ER_BS_BOOT_REGION,
529 "boot region is corrupted. try to restore the region from backup"
531 const unsigned int sector_sizes[] = {512, 4096, 1024, 2048};
534 if (sect_size >= 512 && sect_size <= EXFAT_MAX_SECTOR_SIZE) {
535 ret = read_boot_region(blkdev, bs,
536 BACKUP_BOOT_SEC_IDX, sect_size,
542 for (i = 0; i < sizeof(sector_sizes)/sizeof(sector_sizes[0]); i++) {
543 if (sector_sizes[i] == sect_size)
546 ret = read_boot_region(blkdev, bs,
548 sector_sizes[i], false);
550 sect_size = sector_sizes[i];
554 exfat_err("backup boot region is also corrupted\n");
559 ret = restore_boot_region(blkdev, sect_size);
561 exfat_err("failed to restore boot region from backup\n");
568 static uint16_t file_calc_checksum(struct exfat_de_iter *iter)
571 struct exfat_dentry *file_de, *de;
575 exfat_de_iter_get(iter, 0, &file_de);
577 exfat_calc_dentry_checksum(file_de, &checksum, true);
578 for (i = 1; i <= file_de->file_num_ext; i++) {
579 exfat_de_iter_get(iter, i, &de);
580 exfat_calc_dentry_checksum(de, &checksum, false);
586 * return 0 if there are no errors, or 1 if errors are fixed, or
589 static int check_inode(struct exfat_de_iter *iter, struct exfat_inode *node)
591 struct exfat *exfat = iter->exfat;
592 struct exfat_dentry *dentry;
597 ret = check_clus_chain(iter, node);
601 if (node->size > le32_to_cpu(exfat->bs->bsx.clu_count) *
602 (uint64_t)exfat->clus_size) {
603 fsck_err(iter->parent, node,
604 "size %" PRIu64 " is greater than cluster heap\n",
609 if (node->size == 0 && node->is_contiguous) {
610 if (repair_file_ask(iter, node, ER_FILE_ZERO_NOFAT,
611 "empty, but has no Fat chain")) {
612 exfat_de_iter_get_dirty(iter, 1, &dentry);
613 dentry->stream_flags &= ~EXFAT_SF_CONTIGUOUS;
619 if ((node->attr & ATTR_SUBDIR) &&
620 node->size % exfat->clus_size != 0) {
621 fsck_err(iter->parent, node,
622 "directory size %" PRIu64 " is not divisible by %d\n",
623 node->size, exfat->clus_size);
627 checksum = file_calc_checksum(iter);
628 exfat_de_iter_get(iter, 0, &dentry);
629 if (checksum != le16_to_cpu(dentry->file_checksum)) {
630 exfat_de_iter_get_dirty(iter, 0, &dentry);
631 dentry->file_checksum = cpu_to_le16(checksum);
635 return valid ? ret : -EINVAL;
638 static int handle_duplicated_filename(struct exfat_de_iter *iter,
639 struct exfat_inode *inode)
642 struct exfat_lookup_filter filter;
643 char filename[PATH_MAX + 1] = {0};
645 ret = exfat_lookup_file_by_utf16name(iter->exfat, iter->parent,
646 inode->name, &filter);
650 free(filter.out.dentry_set);
652 /* Hash is same, but filename is not same */
653 if (exfat_de_iter_device_offset(iter) == filter.out.dev_offset)
656 ret = exfat_utf16_dec(inode->name, NAME_BUFFER_SIZE, filename,
659 exfat_err("failed to decode filename\n");
663 return exfat_repair_rename_ask(&exfat_fsck, iter, filename,
664 ER_DE_DUPLICATED_NAME, "filename is duplicated");
667 static int check_name_dentry_set(struct exfat_de_iter *iter,
668 struct exfat_inode *inode)
670 struct exfat_dentry *stream_de;
674 exfat_de_iter_get(iter, 1, &stream_de);
676 name_len = exfat_utf16_len(inode->name, NAME_BUFFER_SIZE);
677 if (stream_de->stream_name_len != name_len) {
678 if (repair_file_ask(iter, NULL, ER_DE_NAME_LEN,
679 "the name length of a file is wrong")) {
680 exfat_de_iter_get_dirty(iter, 1, &stream_de);
681 stream_de->stream_name_len = (__u8)name_len;
687 hash = exfat_calc_name_hash(iter->exfat, inode->name, (int)name_len);
688 if (cpu_to_le16(hash) != stream_de->stream_name_hash) {
689 if (repair_file_ask(iter, NULL, ER_DE_NAME_HASH,
690 "the name hash of a file is wrong")) {
691 exfat_de_iter_get_dirty(iter, 1, &stream_de);
692 stream_de->stream_name_hash = cpu_to_le16(hash);
698 if (BITMAP_GET(iter->name_hash_bitmap, hash)) {
699 int ret = handle_duplicated_filename(iter, inode);
704 BITMAP_SET(iter->name_hash_bitmap, hash);
709 const __le16 MSDOS_DOT[ENTRY_NAME_MAX] = {cpu_to_le16(46), 0, };
710 const __le16 MSDOS_DOTDOT[ENTRY_NAME_MAX] = {cpu_to_le16(46), cpu_to_le16(46), 0, };
712 static int handle_dot_dotdot_filename(struct exfat_de_iter *iter,
713 struct exfat_dentry *dentry,
718 if (!memcmp(dentry->name_unicode, MSDOS_DOT, strm_name_len * 2))
720 else if (!memcmp(dentry->name_unicode, MSDOS_DOTDOT,
726 return exfat_repair_rename_ask(&exfat_fsck, iter, filename,
727 ER_DE_DOT_NAME, "filename is not allowed");
730 static int read_file_dentry_set(struct exfat_de_iter *iter,
731 struct exfat_inode **new_node, int *skip_dentries)
733 struct exfat_dentry *file_de, *stream_de, *dentry;
734 struct exfat_inode *node = NULL;
736 bool need_delete = false;
739 ret = exfat_de_iter_get(iter, 0, &file_de);
740 if (ret || file_de->type != EXFAT_FILE) {
741 exfat_err("failed to get file dentry\n");
745 checksum = file_calc_checksum(iter);
746 if (checksum != le16_to_cpu(file_de->file_checksum)) {
747 if (repair_file_ask(iter, NULL, ER_DE_CHECKSUM,
748 "the checksum of a file is wrong"))
754 if (file_de->file_num_ext < 2) {
755 if (repair_file_ask(iter, NULL, ER_DE_SECONDARY_COUNT,
756 "a file has too few secondary count. %d",
757 file_de->file_num_ext))
763 ret = exfat_de_iter_get(iter, 1, &stream_de);
764 if (ret || stream_de->type != EXFAT_STREAM) {
765 if (repair_file_ask(iter, NULL, ER_DE_STREAM,
766 "failed to get stream dentry"))
773 node = exfat_alloc_inode(le16_to_cpu(file_de->file_attr));
777 for (i = 2; i <= MIN(file_de->file_num_ext, 1 + MAX_NAME_DENTRIES); i++) {
778 ret = exfat_de_iter_get(iter, i, &dentry);
779 if (ret || dentry->type != EXFAT_NAME) {
780 if (i > 2 && repair_file_ask(iter, NULL, ER_DE_NAME,
781 "failed to get name dentry")) {
782 exfat_de_iter_get_dirty(iter, 0, &file_de);
783 file_de->file_num_ext = i - 1;
786 *skip_dentries = i + 1;
791 (i - 2) * ENTRY_NAME_MAX, dentry->name_unicode,
792 sizeof(dentry->name_unicode));
795 ret = check_name_dentry_set(iter, node);
797 *skip_dentries = file_de->file_num_ext + 1;
801 if (file_de->file_num_ext == 2 && stream_de->stream_name_len <= 2) {
802 ret = handle_dot_dotdot_filename(iter, dentry,
803 stream_de->stream_name_len);
805 *skip_dentries = file_de->file_num_ext + 1;
810 node->first_clus = le32_to_cpu(stream_de->stream_start_clu);
811 node->is_contiguous =
812 ((stream_de->stream_flags & EXFAT_SF_CONTIGUOUS) != 0);
813 node->size = le64_to_cpu(stream_de->stream_size);
815 if (node->size < le64_to_cpu(stream_de->stream_valid_size)) {
816 *skip_dentries = file_de->file_num_ext + 1;
817 if (repair_file_ask(iter, node, ER_FILE_VALID_SIZE,
818 "valid size %" PRIu64 " greater than size %" PRIu64,
819 le64_to_cpu(stream_de->stream_valid_size),
821 exfat_de_iter_get_dirty(iter, 1, &stream_de);
822 stream_de->stream_valid_size =
823 stream_de->stream_size;
825 *skip_dentries = file_de->file_num_ext + 1;
830 *skip_dentries = (file_de->file_num_ext + 1);
835 exfat_de_iter_get_dirty(iter, 0, &dentry);
836 dentry->type &= EXFAT_DELETE;
838 for (i = 1; i < *skip_dentries; i++) {
839 exfat_de_iter_get(iter, i, &dentry);
840 if (dentry->type == EXFAT_FILE)
843 exfat_de_iter_get_dirty(iter, i, &dentry);
844 dentry->type &= EXFAT_DELETE;
849 exfat_free_inode(node);
850 return need_delete ? 1 : -EINVAL;
853 static int read_file(struct exfat_de_iter *de_iter,
854 struct exfat_inode **new_node, int *dentry_count)
856 struct exfat_inode *node;
861 ret = read_file_dentry_set(de_iter, &node, dentry_count);
865 ret = check_inode(de_iter, node);
867 exfat_free_inode(node);
871 if (node->attr & ATTR_SUBDIR)
872 exfat_stat.dir_count++;
874 exfat_stat.file_count++;
879 static int read_bitmap(struct exfat *exfat)
881 struct exfat_lookup_filter filter = {
882 .in.type = EXFAT_BITMAP,
883 .in.dentry_count = 0,
887 struct exfat_dentry *dentry;
890 retval = exfat_lookup_dentry_set(exfat, exfat->root, &filter);
894 dentry = filter.out.dentry_set;
895 exfat_debug("start cluster %#x, size %#" PRIx64 "\n",
896 le32_to_cpu(dentry->bitmap_start_clu),
897 le64_to_cpu(dentry->bitmap_size));
899 if (le64_to_cpu(dentry->bitmap_size) <
900 DIV_ROUND_UP(exfat->clus_count, 8)) {
901 exfat_err("invalid size of allocation bitmap. 0x%" PRIx64 "\n",
902 le64_to_cpu(dentry->bitmap_size));
905 if (!exfat_heap_clus(exfat, le32_to_cpu(dentry->bitmap_start_clu))) {
906 exfat_err("invalid start cluster of allocate bitmap. 0x%x\n",
907 le32_to_cpu(dentry->bitmap_start_clu));
911 exfat->disk_bitmap_clus = le32_to_cpu(dentry->bitmap_start_clu);
912 exfat->disk_bitmap_size = DIV_ROUND_UP(exfat->clus_count, 8);
914 exfat_bitmap_set_range(exfat, exfat->alloc_bitmap,
915 le64_to_cpu(dentry->bitmap_start_clu),
916 DIV_ROUND_UP(exfat->disk_bitmap_size,
918 free(filter.out.dentry_set);
920 if (exfat_read(exfat->blk_dev->dev_fd, exfat->disk_bitmap,
921 exfat->disk_bitmap_size,
922 exfat_c2o(exfat, exfat->disk_bitmap_clus)) !=
923 (ssize_t)exfat->disk_bitmap_size)
928 static int decompress_upcase_table(const __le16 *in_table, size_t in_len,
929 __u16 *out_table, size_t out_len)
934 if (in_len > out_len)
937 for (k = 0; k < out_len; k++)
940 for (i = 0, k = 0; i < in_len && k < out_len; i++) {
941 ch = le16_to_cpu(in_table[i]);
943 if (ch == 0xFFFF && i + 1 < in_len) {
944 uint16_t len = le16_to_cpu(in_table[++i]);
954 static int read_upcase_table(struct exfat *exfat)
956 struct exfat_lookup_filter filter = {
957 .in.type = EXFAT_UPCASE,
958 .in.dentry_count = 0,
962 struct exfat_dentry *dentry = NULL;
963 __le16 *upcase = NULL;
968 retval = exfat_lookup_dentry_set(exfat, exfat->root, &filter);
972 dentry = filter.out.dentry_set;
974 if (!exfat_heap_clus(exfat, le32_to_cpu(dentry->upcase_start_clu))) {
975 exfat_err("invalid start cluster of upcase table. 0x%x\n",
976 le32_to_cpu(dentry->upcase_start_clu));
981 size = (ssize_t)le64_to_cpu(dentry->upcase_size);
982 if (size > (ssize_t)(EXFAT_MAX_UPCASE_CHARS * sizeof(__le16)) ||
983 size == 0 || size % sizeof(__le16)) {
984 exfat_err("invalid size of upcase table. 0x%" PRIx64 "\n",
985 le64_to_cpu(dentry->upcase_size));
990 upcase = (__le16 *)malloc(size);
992 exfat_err("failed to allocate upcase table\n");
997 if (exfat_read(exfat->blk_dev->dev_fd, upcase, size,
999 le32_to_cpu(dentry->upcase_start_clu))) != size) {
1000 exfat_err("failed to read upcase table\n");
1006 boot_calc_checksum((unsigned char *)upcase, size, false, &checksum);
1007 if (le32_to_cpu(dentry->upcase_checksum) != checksum) {
1008 exfat_err("corrupted upcase table %#x (expected: %#x)\n",
1009 checksum, le32_to_cpu(dentry->upcase_checksum));
1014 exfat_bitmap_set_range(exfat, exfat->alloc_bitmap,
1015 le32_to_cpu(dentry->upcase_start_clu),
1016 DIV_ROUND_UP(le64_to_cpu(dentry->upcase_size),
1019 exfat->upcase_table = calloc(1,
1020 sizeof(uint16_t) * EXFAT_UPCASE_TABLE_CHARS);
1021 if (!exfat->upcase_table) {
1026 decompress_upcase_table(upcase, size / 2,
1027 exfat->upcase_table, EXFAT_UPCASE_TABLE_CHARS);
1036 static int read_children(struct exfat_fsck *fsck, struct exfat_inode *dir)
1038 struct exfat *exfat = fsck->exfat;
1039 struct exfat_inode *node = NULL;
1040 struct exfat_dentry *dentry;
1041 struct exfat_de_iter *de_iter;
1045 de_iter = &fsck->de_iter;
1046 ret = exfat_de_iter_init(de_iter, exfat, dir, fsck->buffer_desc);
1052 de_iter->name_hash_bitmap = fsck->name_hash_bitmap;
1053 memset(fsck->name_hash_bitmap, 0,
1054 EXFAT_BITMAP_SIZE(EXFAT_MAX_HASH_COUNT));
1057 ret = exfat_de_iter_get(de_iter, 0, &dentry);
1061 fsck_err(dir->parent, dir,
1062 "failed to get a dentry. %d\n", ret);
1068 switch (dentry->type) {
1070 ret = read_file(de_iter, &node, &dentry_count);
1072 exfat_stat.error_count++;
1075 exfat_stat.error_count++;
1076 exfat_stat.fixed_count++;
1080 if ((node->attr & ATTR_SUBDIR) && node->size) {
1082 list_add_tail(&node->sibling,
1084 list_add_tail(&node->list,
1087 exfat_free_inode(node);
1097 if (dir == exfat->root)
1101 if (IS_EXFAT_DELETED(dentry->type))
1103 if (repair_file_ask(de_iter, NULL, ER_DE_UNKNOWN,
1104 "unknown entry type %#x at %07" PRIx64,
1106 exfat_de_iter_file_offset(de_iter))) {
1107 struct exfat_dentry *dentry;
1109 exfat_de_iter_get_dirty(de_iter, 0, &dentry);
1110 dentry->type &= EXFAT_DELETE;
1115 exfat_de_iter_advance(de_iter, dentry_count);
1118 exfat_de_iter_flush(de_iter);
1121 exfat_free_children(dir, false);
1122 INIT_LIST_HEAD(&dir->children);
1123 exfat_de_iter_flush(de_iter);
1127 /* write bitmap segments for clusters which are marked
1128 * as free, but allocated to files.
1130 static int write_bitmap(struct exfat_fsck *fsck)
1132 struct exfat *exfat = fsck->exfat;
1133 bitmap_t *disk_b, *alloc_b, *ohead_b;
1135 unsigned int i, bitmap_bytes, byte_offset, write_bytes;
1137 dev_offset = exfat_c2o(exfat, exfat->disk_bitmap_clus);
1138 bitmap_bytes = EXFAT_BITMAP_SIZE(le32_to_cpu(exfat->bs->bsx.clu_count));
1140 disk_b = (bitmap_t *)exfat->disk_bitmap;
1141 alloc_b = (bitmap_t *)exfat->alloc_bitmap;
1142 ohead_b = (bitmap_t *)exfat->ohead_bitmap;
1144 for (i = 0; i < bitmap_bytes / sizeof(bitmap_t); i++)
1145 ohead_b[i] = alloc_b[i] | disk_b[i];
1148 while (i < bitmap_bytes / sizeof(bitmap_t)) {
1149 if (ohead_b[i] == disk_b[i]) {
1154 byte_offset = ((i * sizeof(bitmap_t)) / 512) * 512;
1155 write_bytes = MIN(512, bitmap_bytes - byte_offset);
1157 if (exfat_write(exfat->blk_dev->dev_fd,
1158 (char *)ohead_b + byte_offset, write_bytes,
1159 dev_offset + byte_offset) != (ssize_t)write_bytes)
1162 i = (byte_offset + write_bytes) / sizeof(bitmap_t);
1169 * for each directory in @dir_list.
1170 * 1. read all dentries and allocate exfat_nodes for files and directories.
1171 * and append directory exfat_nodes to the head of @dir_list
1172 * 2. free all of file exfat_nodes.
1173 * 3. if the directory does not have children, free its exfat_node.
1175 static int exfat_filesystem_check(struct exfat_fsck *fsck)
1177 struct exfat *exfat = fsck->exfat;
1178 struct exfat_inode *dir;
1179 int ret = 0, dir_errors;
1182 exfat_err("root is NULL\n");
1186 fsck->name_hash_bitmap = malloc(EXFAT_BITMAP_SIZE(EXFAT_MAX_HASH_COUNT));
1187 if (!fsck->name_hash_bitmap) {
1188 exfat_err("failed to allocate name hash bitmap\n");
1192 list_add(&exfat->root->list, &exfat->dir_list);
1194 while (!list_empty(&exfat->dir_list)) {
1195 dir = list_entry(exfat->dir_list.next,
1196 struct exfat_inode, list);
1198 if (!(dir->attr & ATTR_SUBDIR)) {
1199 fsck_err(dir->parent, dir,
1200 "failed to travel directories. "
1201 "the node is not directory\n");
1206 dir_errors = read_children(fsck, dir);
1208 exfat_resolve_path(&path_resolve_ctx, dir);
1209 exfat_debug("failed to check dentries: %s\n",
1210 path_resolve_ctx.local_path);
1214 list_del(&dir->list);
1215 exfat_free_file_children(dir);
1216 exfat_free_ancestors(dir);
1219 exfat_free_dir_list(exfat);
1220 free(fsck->name_hash_bitmap);
1224 static int exfat_root_dir_check(struct exfat *exfat)
1226 struct exfat_inode *root;
1227 clus_t clus_count = 0;
1230 root = exfat_alloc_inode(ATTR_SUBDIR);
1235 root->first_clus = le32_to_cpu(exfat->bs->bsx.root_cluster);
1236 if (root_check_clus_chain(exfat, root, &clus_count)) {
1237 exfat_err("failed to follow the cluster chain of root\n");
1238 exfat_free_inode(root);
1242 root->size = clus_count * exfat->clus_size;
1244 exfat_stat.dir_count++;
1245 exfat_debug("root directory: start cluster[0x%x] size[0x%" PRIx64 "]\n",
1246 root->first_clus, root->size);
1248 err = exfat_read_volume_label(exfat);
1249 if (err && err != EOF)
1250 exfat_err("failed to read volume label\n");
1253 err = read_bitmap(exfat);
1255 exfat_err("failed to read bitmap\n");
1259 err = read_upcase_table(exfat);
1261 exfat_err("failed to read upcase table\n");
1265 root->dev_offset = 0;
1266 err = exfat_build_file_dentry_set(exfat, " ", ATTR_SUBDIR,
1267 &root->dentry_set, &root->dentry_count);
1269 exfat_free_inode(root);
1275 static int read_lostfound(struct exfat *exfat, struct exfat_inode **lostfound)
1277 struct exfat_lookup_filter filter;
1278 struct exfat_inode *inode;
1281 err = exfat_lookup_file(exfat, exfat->root, "LOST+FOUND", &filter);
1285 inode = exfat_alloc_inode(ATTR_SUBDIR);
1287 free(filter.out.dentry_set);
1291 inode->dentry_set = filter.out.dentry_set;
1292 inode->dentry_count = filter.out.dentry_count;
1293 inode->dev_offset = filter.out.dev_offset;
1296 le32_to_cpu(filter.out.dentry_set[1].dentry.stream.start_clu);
1298 le64_to_cpu(filter.out.dentry_set[1].dentry.stream.size);
1304 /* Create temporary files under LOST+FOUND and assign orphan
1305 * chains of clusters to these files.
1307 static int rescue_orphan_clusters(struct exfat_fsck *fsck)
1309 struct exfat *exfat = fsck->exfat;
1310 struct exfat_inode *lostfound;
1311 bitmap_t *disk_b, *alloc_b, *ohead_b;
1312 struct exfat_dentry *dset;
1313 clus_t clu_count, clu, s_clu, e_clu;
1316 char name[] = "FILE0000000.CHK";
1317 struct exfat_dentry_loc loc;
1318 struct exfat_lookup_filter lf = {
1319 .in.type = EXFAT_INVAL,
1320 .in.dentry_count = 0,
1324 clu_count = le32_to_cpu(exfat->bs->bsx.clu_count);
1326 /* find clusters which are not marked as free, but not allocated to
1329 disk_b = (bitmap_t *)exfat->disk_bitmap;
1330 alloc_b = (bitmap_t *)exfat->alloc_bitmap;
1331 ohead_b = (bitmap_t *)exfat->ohead_bitmap;
1332 for (i = 0; i < EXFAT_BITMAP_SIZE(clu_count) / sizeof(bitmap_t); i++)
1333 ohead_b[i] = disk_b[i] & ~alloc_b[i];
1335 /* no orphan clusters */
1336 if (exfat_bitmap_find_one(exfat, exfat->ohead_bitmap,
1337 EXFAT_FIRST_CLUSTER, &s_clu))
1340 err = exfat_create_file(exfat_fsck.exfat,
1341 exfat_fsck.exfat->root,
1345 exfat_err("failed to create LOST+FOUND directory\n");
1349 if (fsync(exfat_fsck.exfat->blk_dev->dev_fd) != 0) {
1350 exfat_err("failed to sync()\n");
1354 err = read_lostfound(exfat, &lostfound);
1356 exfat_err("failed to find LOST+FOUND\n");
1360 /* get the last empty region of LOST+FOUND */
1361 err = exfat_lookup_dentry_set(exfat, lostfound, &lf);
1362 if (err && err != EOF) {
1363 exfat_err("failed to find the last empty slot in LOST+FOUND\n");
1367 loc.parent = lostfound;
1368 loc.file_offset = lf.out.file_offset;
1369 loc.dev_offset = lf.out.dev_offset;
1371 /* build a template dentry set */
1372 err = exfat_build_file_dentry_set(exfat, name, 0, &dset, &dcount);
1374 exfat_err("failed to create a temporary file in LOST+FOUNDn");
1377 dset[1].dentry.stream.flags |= EXFAT_SF_CONTIGUOUS;
1379 /* create temporary files and allocate contiguous orphan clusters
1382 for (clu = EXFAT_FIRST_CLUSTER; clu < clu_count + EXFAT_FIRST_CLUSTER &&
1383 exfat_bitmap_find_one(exfat, exfat->ohead_bitmap, clu, &s_clu) == 0;) {
1384 if (exfat_bitmap_find_zero(exfat, exfat->ohead_bitmap, s_clu, &e_clu))
1385 e_clu = clu_count + EXFAT_FIRST_CLUSTER;
1388 snprintf(name, sizeof(name), "FILE%07d.CHK",
1389 (unsigned int)(loc.file_offset >> 5));
1390 err = exfat_update_file_dentry_set(exfat, dset, dcount,
1391 name, s_clu, e_clu - s_clu);
1394 err = exfat_add_dentry_set(exfat, &loc, dset, dcount, true);
1402 exfat_free_inode(lostfound);
1406 static char *bytes_to_human_readable(size_t bytes)
1408 static const char * const units[] = {"B", "KB", "MB", "GB", "TB", "PB"};
1409 static char buf[15*4];
1410 unsigned int i, shift, quoti, remain;
1411 i = sizeof(units) / sizeof(units[0]) - 1;
1413 while (i && (bytes >> i * 10) == 0)
1417 quoti = (unsigned int)(bytes / (1ULL << shift));
1420 remain = (unsigned int)
1421 ((bytes & ((1ULL << shift) - 1)) >> (shift - 10));
1422 remain = (remain * 100) / 1024;
1425 snprintf(buf, sizeof(buf), "%u.%02u %s", quoti, remain, units[i]);
1429 static void exfat_show_info(struct exfat_fsck *fsck, const char *dev_name)
1431 struct exfat *exfat = fsck->exfat;
1434 exfat_info("sector size: %s\n",
1435 bytes_to_human_readable(1 << exfat->bs->bsx.sect_size_bits));
1436 exfat_info("cluster size: %s\n",
1437 bytes_to_human_readable(exfat->clus_size));
1438 exfat_info("volume size: %s\n",
1439 bytes_to_human_readable(exfat->blk_dev->size));
1441 clean = exfat_stat.error_count == 0 ||
1442 exfat_stat.error_count == exfat_stat.fixed_count;
1443 printf("%s: %s. directories %ld, files %ld\n", dev_name,
1444 clean ? "clean" : "corrupted",
1445 exfat_stat.dir_count, exfat_stat.file_count);
1446 if (exfat_stat.error_count)
1447 printf("%s: files corrupted %ld, files fixed %ld\n", dev_name,
1448 exfat_stat.error_count - exfat_stat.fixed_count,
1449 exfat_stat.fixed_count);
1452 int main(int argc, char * const argv[])
1454 struct fsck_user_input ui;
1455 struct exfat_blk_dev bd;
1456 struct pbr *bs = NULL;
1457 int c, ret, exit_code;
1458 bool version_only = false;
1460 memset(&ui, 0, sizeof(ui));
1461 memset(&bd, 0, sizeof(bd));
1463 print_level = EXFAT_ERROR;
1465 if (!setlocale(LC_CTYPE, ""))
1466 exfat_err("failed to init locale/codeset\n");
1469 while ((c = getopt_long(argc, argv, "arynpbsVvh", opts, NULL)) != EOF) {
1472 if (ui.options & FSCK_OPTS_REPAIR_ALL)
1474 ui.options |= FSCK_OPTS_REPAIR_NO;
1477 if (ui.options & FSCK_OPTS_REPAIR_ALL)
1479 ui.options |= FSCK_OPTS_REPAIR_ASK;
1482 if (ui.options & FSCK_OPTS_REPAIR_ALL)
1484 ui.options |= FSCK_OPTS_REPAIR_YES;
1488 if (ui.options & FSCK_OPTS_REPAIR_ALL)
1490 ui.options |= FSCK_OPTS_REPAIR_AUTO;
1493 ui.options |= FSCK_OPTS_IGNORE_BAD_FS_NAME;
1496 ui.options |= FSCK_OPTS_RESCUE_CLUS;
1499 version_only = true;
1502 if (print_level < EXFAT_DEBUG)
1513 if (optind != argc - 1)
1517 exit(FSCK_EXIT_SYNTAX_ERROR);
1518 if (ui.options & FSCK_OPTS_REPAIR_WRITE)
1519 ui.ei.writeable = true;
1521 if (ui.options & (FSCK_OPTS_IGNORE_BAD_FS_NAME |
1522 FSCK_OPTS_RESCUE_CLUS))
1524 ui.options |= FSCK_OPTS_REPAIR_NO;
1525 ui.ei.writeable = false;
1528 exfat_fsck.options = ui.options;
1530 snprintf(ui.ei.dev_name, sizeof(ui.ei.dev_name), "%s", argv[optind]);
1531 ret = exfat_get_blk_dev_info(&ui.ei, &bd);
1533 exfat_err("failed to open %s. %d\n", ui.ei.dev_name, ret);
1534 return FSCK_EXIT_OPERATION_ERROR;
1537 ret = exfat_boot_region_check(&bd, &bs,
1538 ui.options & FSCK_OPTS_IGNORE_BAD_FS_NAME ?
1543 exfat_fsck.exfat = exfat_alloc_exfat(&bd, bs);
1544 if (!exfat_fsck.exfat) {
1549 exfat_fsck.buffer_desc = exfat_alloc_buffer(2,
1550 exfat_fsck.exfat->clus_size,
1551 exfat_fsck.exfat->sect_size);
1552 if (!exfat_fsck.buffer_desc) {
1557 if ((exfat_fsck.options & FSCK_OPTS_REPAIR_WRITE) &&
1558 exfat_mark_volume_dirty(exfat_fsck.exfat, true)) {
1563 exfat_debug("verifying root directory...\n");
1564 ret = exfat_root_dir_check(exfat_fsck.exfat);
1566 exfat_err("failed to verify root directory.\n");
1570 exfat_debug("verifying directory entries...\n");
1571 ret = exfat_filesystem_check(&exfat_fsck);
1575 if (exfat_fsck.options & FSCK_OPTS_RESCUE_CLUS) {
1576 rescue_orphan_clusters(&exfat_fsck);
1577 exfat_fsck.dirty = true;
1578 exfat_fsck.dirty_fat = true;
1581 if (exfat_fsck.options & FSCK_OPTS_REPAIR_WRITE) {
1582 ret = write_bitmap(&exfat_fsck);
1584 exfat_err("failed to write bitmap\n");
1589 if (ui.ei.writeable && fsync(bd.dev_fd)) {
1590 exfat_err("failed to sync\n");
1594 if (exfat_fsck.options & FSCK_OPTS_REPAIR_WRITE)
1595 exfat_mark_volume_dirty(exfat_fsck.exfat, false);
1598 exfat_show_info(&exfat_fsck, ui.ei.dev_name);
1600 if (ret && ret != -EINVAL)
1601 exit_code = FSCK_EXIT_OPERATION_ERROR;
1602 else if (ret == -EINVAL ||
1603 exfat_stat.error_count != exfat_stat.fixed_count)
1604 exit_code = FSCK_EXIT_ERRORS_LEFT;
1605 else if (exfat_fsck.dirty)
1606 exit_code = FSCK_EXIT_CORRECTED;
1608 exit_code = FSCK_EXIT_NO_ERRORS;
1610 if (exfat_fsck.buffer_desc)
1611 exfat_free_buffer(exfat_fsck.buffer_desc, 2);
1612 if (exfat_fsck.exfat)
1613 exfat_free_exfat(exfat_fsck.exfat);