]> git.sven.stormbind.net Git - sven/exfatprogs.git/blob - fsck/fsck.c
00d1ca7f2c3620770547fc014ffc14a2d99d70e3
[sven/exfatprogs.git] / fsck / fsck.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *   Copyright (C) 2019 Namjae Jeon <linkinjeon@kernel.org>
4  *   Copyright (C) 2020 Hyunchul Lee <hyc.lee@gmail.com>
5  */
6
7 #include <unistd.h>
8 #include <stdlib.h>
9 #include <stdio.h>
10 #include <getopt.h>
11 #include <inttypes.h>
12 #include <string.h>
13 #include <errno.h>
14 #include <locale.h>
15
16 #include "exfat_ondisk.h"
17 #include "libexfat.h"
18 #include "fsck.h"
19 #include "repair.h"
20
21 struct fsck_user_input {
22         struct exfat_user_input         ei;
23         enum fsck_ui_options            options;
24 };
25
26 #define EXFAT_MAX_UPCASE_CHARS  0x10000
27
28 #ifdef WORDS_BIGENDIAN
29 typedef __u8    bitmap_t;
30 #else
31 typedef __u32   bitmap_t;
32 #endif
33
34 #define BITS_PER        (sizeof(bitmap_t) * 8)
35 #define BIT_MASK(__c)   (1 << ((__c) % BITS_PER))
36 #define BIT_ENTRY(__c)  ((__c) / BITS_PER)
37
38 #define EXFAT_BITMAP_SIZE(__c_count)    \
39         (DIV_ROUND_UP(__c_count, BITS_PER) * sizeof(bitmap_t))
40 #define EXFAT_BITMAP_GET(__bmap, __c)   \
41                         (((bitmap_t *)(__bmap))[BIT_ENTRY(__c)] & BIT_MASK(__c))
42 #define EXFAT_BITMAP_SET(__bmap, __c)   \
43                         (((bitmap_t *)(__bmap))[BIT_ENTRY(__c)] |= \
44                          BIT_MASK(__c))
45
46 #define FSCK_EXIT_NO_ERRORS             0x00
47 #define FSCK_EXIT_CORRECTED             0x01
48 #define FSCK_EXIT_NEED_REBOOT           0x02
49 #define FSCK_EXIT_ERRORS_LEFT           0x04
50 #define FSCK_EXIT_OPERATION_ERROR       0x08
51 #define FSCK_EXIT_SYNTAX_ERROR          0x10
52 #define FSCK_EXIT_USER_CANCEL           0x20
53 #define FSCK_EXIT_LIBRARY_ERROR         0x80
54
55 struct exfat_stat {
56         long            dir_count;
57         long            file_count;
58         long            error_count;
59         long            fixed_count;
60 };
61
62 struct path_resolve_ctx {
63         struct exfat_inode      *ancestors[255];
64         __le16                  utf16_path[PATH_MAX + 2];
65         char                    local_path[PATH_MAX * MB_LEN_MAX + 1];
66 };
67
68 struct exfat_stat exfat_stat;
69 struct path_resolve_ctx path_resolve_ctx;
70
71 static struct option opts[] = {
72         {"repair",      no_argument,    NULL,   'r' },
73         {"repair-yes",  no_argument,    NULL,   'y' },
74         {"repair-no",   no_argument,    NULL,   'n' },
75         {"repair-auto", no_argument,    NULL,   'p' },
76         {"version",     no_argument,    NULL,   'V' },
77         {"verbose",     no_argument,    NULL,   'v' },
78         {"help",        no_argument,    NULL,   'h' },
79         {"?",           no_argument,    NULL,   '?' },
80         {NULL,          0,              NULL,    0  }
81 };
82
83 static void usage(char *name)
84 {
85         fprintf(stderr, "Usage: %s\n", name);
86         fprintf(stderr, "\t-r | --repair        Repair interactively\n");
87         fprintf(stderr, "\t-y | --repair-yes    Repair without ask\n");
88         fprintf(stderr, "\t-n | --repair-no     No repair\n");
89         fprintf(stderr, "\t-p | --repair-auto   Repair automatically\n");
90         fprintf(stderr, "\t-a                   Repair automatically\n");
91         fprintf(stderr, "\t-V | --version       Show version\n");
92         fprintf(stderr, "\t-v | --verbose       Print debug\n");
93         fprintf(stderr, "\t-h | --help          Show help\n");
94
95         exit(FSCK_EXIT_SYNTAX_ERROR);
96 }
97
98 #define fsck_err(parent, inode, fmt, ...)               \
99 ({                                                      \
100                 resolve_path_parent(&path_resolve_ctx,  \
101                         parent, inode);                 \
102                 exfat_err("ERROR: %s: " fmt,            \
103                         path_resolve_ctx.local_path,    \
104                         ##__VA_ARGS__);                 \
105 })
106
107 static struct exfat_inode *alloc_exfat_inode(__u16 attr)
108 {
109         struct exfat_inode *node;
110         int size;
111
112         size = offsetof(struct exfat_inode, name) + NAME_BUFFER_SIZE;
113         node = (struct exfat_inode *)calloc(1, size);
114         if (!node) {
115                 exfat_err("failed to allocate exfat_node\n");
116                 return NULL;
117         }
118
119         node->parent = NULL;
120         INIT_LIST_HEAD(&node->children);
121         INIT_LIST_HEAD(&node->sibling);
122         INIT_LIST_HEAD(&node->list);
123
124         node->last_pclus = EXFAT_EOF_CLUSTER;
125         node->attr = attr;
126         if (attr & ATTR_SUBDIR)
127                 exfat_stat.dir_count++;
128         else
129                 exfat_stat.file_count++;
130         return node;
131 }
132
133 static void free_exfat_inode(struct exfat_inode *node)
134 {
135         free(node);
136 }
137
138 static void inode_free_children(struct exfat_inode *dir, bool file_only)
139 {
140         struct exfat_inode *node, *i;
141
142         list_for_each_entry_safe(node, i, &dir->children, sibling) {
143                 if (file_only) {
144                         if (!(node->attr & ATTR_SUBDIR)) {
145                                 list_del(&node->sibling);
146                                 free_exfat_inode(node);
147                         }
148                 } else {
149                         list_del(&node->sibling);
150                         list_del(&node->list);
151                         free_exfat_inode(node);
152                 }
153         }
154 }
155
156 static void inode_free_file_children(struct exfat_inode *dir)
157 {
158         inode_free_children(dir, true);
159 }
160
161 /* delete @child and all ancestors that does not have
162  * children
163  */
164 static void inode_free_ancestors(struct exfat_inode *child)
165 {
166         struct exfat_inode *parent;
167
168         if (!list_empty(&child->children))
169                 return;
170
171         do {
172                 if (!(child->attr & ATTR_SUBDIR)) {
173                         exfat_err("not directory.\n");
174                         return;
175                 }
176
177                 parent = child->parent;
178                 list_del(&child->sibling);
179                 free_exfat_inode(child);
180
181                 child = parent;
182         } while (child && list_empty(&child->children));
183
184         return;
185 }
186
187 static void free_exfat(struct exfat *exfat)
188 {
189         int i;
190
191         if (exfat) {
192                 if (exfat->bs)
193                         free(exfat->bs);
194                 if (exfat->alloc_bitmap)
195                         free(exfat->alloc_bitmap);
196                 if (exfat->disk_bitmap)
197                         free(exfat->disk_bitmap);
198                 for (i = 0; i < 2; i++) {
199                         if (exfat->buffer_desc[i].buffer)
200                                 free(exfat->buffer_desc[i].buffer);
201                         if (exfat->buffer_desc[i].dirty)
202                                 free(exfat->buffer_desc[i].dirty);
203                 }
204                 free(exfat);
205         }
206 }
207
208 static int init_exfat(struct exfat *exfat, struct pbr *bs)
209 {
210         int i;
211
212         INIT_LIST_HEAD(&exfat->dir_list);
213         exfat->bs = bs;
214         exfat->clus_count = le32_to_cpu(bs->bsx.clu_count);
215         exfat->clus_size = EXFAT_CLUSTER_SIZE(bs);
216         exfat->sect_size = EXFAT_SECTOR_SIZE(bs);
217
218         /* TODO: bitmap could be very large. */
219         exfat->alloc_bitmap = (char *)calloc(1,
220                         EXFAT_BITMAP_SIZE(exfat->clus_count));
221         if (!exfat->alloc_bitmap) {
222                 exfat_err("failed to allocate bitmap\n");
223                 goto err;
224         }
225
226         exfat->disk_bitmap = (char *)malloc(
227                                 EXFAT_BITMAP_SIZE(exfat->clus_count));
228         if (!exfat->disk_bitmap) {
229                 exfat_err("failed to allocate bitmap\n");
230                 goto err;
231         }
232
233         /* allocate cluster buffers */
234         for (i = 0; i < 2; i++) {
235                 exfat->buffer_desc[i].buffer =
236                         (char *)malloc(exfat->clus_size);
237                 if (!exfat->buffer_desc[i].buffer)
238                         goto err;
239                 exfat->buffer_desc[i].dirty =
240                         (char *)calloc(
241                         (exfat->clus_size / exfat->sect_size), 1);
242                 if (!exfat->buffer_desc[i].dirty)
243                         goto err;
244         }
245         return 0;
246 err:
247         free_exfat(exfat);
248         return -ENOMEM;
249 }
250
251 static void exfat_free_dir_list(struct exfat *exfat)
252 {
253         struct exfat_inode *dir, *i;
254
255         list_for_each_entry_safe(dir, i, &exfat->dir_list, list) {
256                 inode_free_file_children(dir);
257                 list_del(&dir->list);
258                 free_exfat_inode(dir);
259         }
260 }
261
262 /*
263  * get references of ancestors that include @child until the count of
264  * ancesters is not larger than @count and the count of characters of
265  * their names is not larger than @max_char_len.
266  * return true if root is reached.
267  */
268 bool get_ancestors(struct exfat_inode *child,
269                 struct exfat_inode **ancestors, int count,
270                 int max_char_len,
271                 int *ancestor_count)
272 {
273         struct exfat_inode *dir;
274         int name_len, char_len;
275         int root_depth, depth, i;
276
277         root_depth = 0;
278         char_len = 0;
279         max_char_len += 1;
280
281         dir = child;
282         while (dir) {
283                 name_len = exfat_utf16_len(dir->name, NAME_BUFFER_SIZE);
284                 if (char_len + name_len > max_char_len)
285                         break;
286
287                 /* include '/' */
288                 char_len += name_len + 1;
289                 root_depth++;
290
291                 dir = dir->parent;
292         }
293
294         depth = MIN(root_depth, count);
295
296         for (dir = child, i = depth - 1; i >= 0; dir = dir->parent, i--)
297                 ancestors[i] = dir;
298
299         *ancestor_count = depth;
300         return dir == NULL;
301 }
302
303 static int resolve_path(struct path_resolve_ctx *ctx, struct exfat_inode *child)
304 {
305         int depth, i;
306         int name_len;
307         __le16 *utf16_path;
308         static const __le16 utf16_slash = cpu_to_le16(0x002F);
309         static const __le16 utf16_null = cpu_to_le16(0x0000);
310         size_t in_size;
311
312         ctx->local_path[0] = '\0';
313
314         get_ancestors(child,
315                         ctx->ancestors,
316                         sizeof(ctx->ancestors) / sizeof(ctx->ancestors[0]),
317                         PATH_MAX,
318                         &depth);
319
320         utf16_path = ctx->utf16_path;
321         for (i = 0; i < depth; i++) {
322                 name_len = exfat_utf16_len(ctx->ancestors[i]->name,
323                                 NAME_BUFFER_SIZE);
324                 memcpy((char *)utf16_path, (char *)ctx->ancestors[i]->name,
325                                 name_len * 2);
326                 utf16_path += name_len;
327                 memcpy((char *)utf16_path, &utf16_slash, sizeof(utf16_slash));
328                 utf16_path++;
329         }
330
331         if (depth > 0)
332                 utf16_path--;
333         memcpy((char *)utf16_path, &utf16_null, sizeof(utf16_null));
334         utf16_path++;
335
336         in_size = (utf16_path - ctx->utf16_path) * sizeof(__le16);
337         return exfat_utf16_dec(ctx->utf16_path, in_size,
338                                 ctx->local_path, sizeof(ctx->local_path));
339 }
340
341 static int resolve_path_parent(struct path_resolve_ctx *ctx,
342                         struct exfat_inode *parent, struct exfat_inode *child)
343 {
344         int ret;
345         struct exfat_inode *old;
346
347         old = child->parent;
348         child->parent = parent;
349
350         ret = resolve_path(ctx, child);
351         child->parent = old;
352         return ret;
353 }
354
355 #define repair_file_ask(iter, inode, code, fmt, ...)    \
356 ({                                                      \
357                 resolve_path_parent(&path_resolve_ctx,  \
358                                 (iter)->parent, inode); \
359                 exfat_repair_ask((iter)->exfat, code,   \
360                         "ERROR: %s: " fmt,              \
361                         path_resolve_ctx.local_path,    \
362                         ##__VA_ARGS__);                 \
363 })
364
365 static inline bool heap_clus(struct exfat *exfat, clus_t clus)
366 {
367         return clus >= EXFAT_FIRST_CLUSTER &&
368                 (clus - EXFAT_FIRST_CLUSTER) < exfat->clus_count;
369 }
370
371 int get_next_clus(struct exfat *exfat, struct exfat_inode *node,
372                                 clus_t clus, clus_t *next)
373 {
374         off_t offset;
375
376         *next = EXFAT_EOF_CLUSTER;
377
378         if (!heap_clus(exfat, clus))
379                 return -EINVAL;
380
381         if (node->is_contiguous) {
382                 *next = clus + 1;
383                 return 0;
384         }
385
386         offset = (off_t)le32_to_cpu(exfat->bs->bsx.fat_offset) <<
387                                 exfat->bs->bsx.sect_size_bits;
388         offset += sizeof(clus_t) * clus;
389
390         if (exfat_read(exfat->blk_dev->dev_fd, next, sizeof(*next), offset)
391                         != sizeof(*next))
392                 return -EIO;
393         *next = le32_to_cpu(*next);
394         return 0;
395 }
396
397 static int set_fat(struct exfat *exfat, clus_t clus, clus_t next_clus)
398 {
399         off_t offset;
400
401         offset = le32_to_cpu(exfat->bs->bsx.fat_offset) <<
402                 exfat->bs->bsx.sect_size_bits;
403         offset += sizeof(clus_t) * clus;
404
405         if (exfat_write(exfat->blk_dev->dev_fd, &next_clus, sizeof(next_clus),
406                         offset) != sizeof(next_clus))
407                 return -EIO;
408         return 0;
409 }
410
411 static int check_clus_chain(struct exfat *exfat, struct exfat_inode *node)
412 {
413         struct exfat_dentry *stream_de;
414         clus_t clus, prev, next;
415         uint64_t count, max_count;
416
417         clus = node->first_clus;
418         prev = EXFAT_EOF_CLUSTER;
419         count = 0;
420         max_count = DIV_ROUND_UP(node->size, exfat->clus_size);
421
422         if (node->size == 0 && node->first_clus == EXFAT_FREE_CLUSTER)
423                 return 0;
424
425         /* the first cluster is wrong */
426         if ((node->size == 0 && node->first_clus != EXFAT_FREE_CLUSTER) ||
427                 (node->size > 0 && !heap_clus(exfat, node->first_clus))) {
428                 if (repair_file_ask(&exfat->de_iter, node,
429                         ER_FILE_FIRST_CLUS, "first cluster is wrong"))
430                         goto truncate_file;
431                 else
432                         return -EINVAL;
433         }
434
435         while (clus != EXFAT_EOF_CLUSTER) {
436                 if (count >= max_count) {
437                         if (node->is_contiguous)
438                                 break;
439                         if (repair_file_ask(&exfat->de_iter, node,
440                                         ER_FILE_SMALLER_SIZE,
441                                         "more clusters are allocated. "
442                                         "truncate to %" PRIu64 " bytes",
443                                         count * exfat->clus_size))
444                                 goto truncate_file;
445                         else
446                                 return -EINVAL;
447                 }
448
449                 /*
450                  * This cluster is already allocated. it may be shared with
451                  * the other file, or there is a loop in cluster chain.
452                  */
453                 if (EXFAT_BITMAP_GET(exfat->alloc_bitmap,
454                                 clus - EXFAT_FIRST_CLUSTER)) {
455                         if (repair_file_ask(&exfat->de_iter, node,
456                                         ER_FILE_DUPLICATED_CLUS,
457                                         "cluster is already allocated for "
458                                         "the other file. truncated to %"
459                                         PRIu64 " bytes",
460                                         count * exfat->clus_size))
461                                 goto truncate_file;
462                         else
463                                 return -EINVAL;
464                 }
465
466                 if (!EXFAT_BITMAP_GET(exfat->disk_bitmap,
467                                 clus - EXFAT_FIRST_CLUSTER)) {
468                         if (repair_file_ask(&exfat->de_iter, node,
469                                         ER_FILE_INVALID_CLUS,
470                                         "cluster is marked as free. truncate to %" PRIu64 " bytes",
471                                         count * exfat->clus_size))
472                                 goto truncate_file;
473
474                         else
475                                 return -EINVAL;
476                 }
477
478                 /* This cluster is allocated or not */
479                 if (get_next_clus(exfat, node, clus, &next))
480                         goto truncate_file;
481                 if (!node->is_contiguous) {
482                         if (!heap_clus(exfat, next) &&
483                                         next != EXFAT_EOF_CLUSTER) {
484                                 if (repair_file_ask(&exfat->de_iter, node,
485                                                 ER_FILE_INVALID_CLUS,
486                                                 "broken cluster chain. "
487                                                 "truncate to %"
488                                                 PRIu64 " bytes",
489                                                 count * exfat->clus_size))
490                                         goto truncate_file;
491
492                                 else
493                                         return -EINVAL;
494                         }
495                 }
496
497                 count++;
498                 EXFAT_BITMAP_SET(exfat->alloc_bitmap,
499                                 clus - EXFAT_FIRST_CLUSTER);
500                 prev = clus;
501                 clus = next;
502         }
503
504         if (count < max_count) {
505                 if (repair_file_ask(&exfat->de_iter, node,
506                         ER_FILE_LARGER_SIZE, "less clusters are allocated. "
507                         "truncates to %" PRIu64 " bytes",
508                         count * exfat->clus_size))
509                         goto truncate_file;
510                 else
511                         return -EINVAL;
512         }
513
514         return 0;
515 truncate_file:
516         node->size = count * exfat->clus_size;
517         if (!heap_clus(exfat, prev))
518                 node->first_clus = EXFAT_FREE_CLUSTER;
519
520         exfat_de_iter_get_dirty(&exfat->de_iter, 1, &stream_de);
521         if (count * exfat->clus_size <
522                         le64_to_cpu(stream_de->stream_valid_size))
523                 stream_de->stream_valid_size = cpu_to_le64(
524                                 count * exfat->clus_size);
525         if (!heap_clus(exfat, prev))
526                 stream_de->stream_start_clu = EXFAT_FREE_CLUSTER;
527         stream_de->stream_size = cpu_to_le64(
528                         count * exfat->clus_size);
529
530         /* remaining clusters will be freed while FAT is compared with
531          * alloc_bitmap.
532          */
533         if (!node->is_contiguous && heap_clus(exfat, prev))
534                 return set_fat(exfat, prev, EXFAT_EOF_CLUSTER);
535         return 1;
536 }
537
538 static bool root_get_clus_count(struct exfat *exfat, struct exfat_inode *node,
539                                                         clus_t *clus_count)
540 {
541         clus_t clus;
542
543         clus = node->first_clus;
544         *clus_count = 0;
545
546         do {
547                 if (!heap_clus(exfat, clus)) {
548                         exfat_err("/: bad cluster. 0x%x\n", clus);
549                         return false;
550                 }
551
552                 if (EXFAT_BITMAP_GET(exfat->alloc_bitmap,
553                                 clus - EXFAT_FIRST_CLUSTER)) {
554                         exfat_err("/: cluster is already allocated, or "
555                                 "there is a loop in cluster chain\n");
556                         return false;
557                 }
558
559                 EXFAT_BITMAP_SET(exfat->alloc_bitmap,
560                                 clus - EXFAT_FIRST_CLUSTER);
561
562                 if (get_next_clus(exfat, node, clus, &clus) != 0) {
563                         exfat_err("/: broken cluster chain\n");
564                         return false;
565                 }
566
567                 (*clus_count)++;
568         } while (clus != EXFAT_EOF_CLUSTER);
569         return true;
570 }
571
572 static off_t exfat_s2o(struct exfat *exfat, off_t sect)
573 {
574         return sect << exfat->bs->bsx.sect_size_bits;
575 }
576
577 off_t exfat_c2o(struct exfat *exfat, unsigned int clus)
578 {
579         if (clus < EXFAT_FIRST_CLUSTER)
580                 return ~0L;
581
582         return exfat_s2o(exfat, le32_to_cpu(exfat->bs->bsx.clu_offset) +
583                                 ((off_t)(clus - EXFAT_FIRST_CLUSTER) <<
584                                  exfat->bs->bsx.sect_per_clus_bits));
585 }
586
587 static int boot_region_checksum(int dev_fd,
588                                 int bs_offset, unsigned int sect_size)
589 {
590         void *sect;
591         unsigned int i;
592         uint32_t checksum;
593         int ret = 0;
594
595         sect = malloc(sect_size);
596         if (!sect)
597                 return -ENOMEM;
598
599         checksum = 0;
600         for (i = 0; i < 11; i++) {
601                 if (exfat_read(dev_fd, sect, sect_size,
602                                 bs_offset * sect_size + i * sect_size) !=
603                                 (ssize_t)sect_size) {
604                         exfat_err("failed to read boot region\n");
605                         ret = -EIO;
606                         goto out;
607                 }
608                 boot_calc_checksum(sect, sect_size, i == 0, &checksum);
609         }
610
611         if (exfat_read(dev_fd, sect, sect_size,
612                         bs_offset * sect_size + 11 * sect_size) !=
613                         (ssize_t)sect_size) {
614                 exfat_err("failed to read a boot checksum sector\n");
615                 ret = -EIO;
616                 goto out;
617         }
618
619         for (i = 0; i < sect_size/sizeof(checksum); i++) {
620                 if (le32_to_cpu(((__le32 *)sect)[i]) != checksum) {
621                         exfat_err("checksum of boot region is not correct. %#x, but expected %#x\n",
622                                 le32_to_cpu(((__le32 *)sect)[i]), checksum);
623                         ret = -EINVAL;
624                         goto out;
625                 }
626         }
627 out:
628         free(sect);
629         return ret;
630 }
631
632 static int exfat_mark_volume_dirty(struct exfat *exfat, bool dirty)
633 {
634         uint16_t flags;
635
636         if (!(exfat->options & FSCK_OPTS_REPAIR_WRITE))
637                 return 0;
638
639         flags = le16_to_cpu(exfat->bs->bsx.vol_flags);
640         if (dirty)
641                 flags |= 0x02;
642         else
643                 flags &= ~0x02;
644
645         exfat->bs->bsx.vol_flags = cpu_to_le16(flags);
646         if (exfat_write(exfat->blk_dev->dev_fd, exfat->bs,
647                         sizeof(struct pbr), 0) != (ssize_t)sizeof(struct pbr)) {
648                 exfat_err("failed to set VolumeDirty\n");
649                 return -EIO;
650         }
651
652         if (fsync(exfat->blk_dev->dev_fd) != 0) {
653                 exfat_err("failed to set VolumeDirty\n");
654                 return -EIO;
655         }
656         return 0;
657 }
658
659 static int read_boot_region(struct exfat_blk_dev *bd, struct pbr **pbr,
660                             int bs_offset, unsigned int sect_size,
661                             bool verbose)
662 {
663         struct pbr *bs;
664         int ret = -EINVAL;
665
666         *pbr = NULL;
667         bs = (struct pbr *)malloc(sizeof(struct pbr));
668         if (!bs) {
669                 exfat_err("failed to allocate memory\n");
670                 return -ENOMEM;
671         }
672
673         if (exfat_read(bd->dev_fd, bs, sizeof(*bs),
674                         bs_offset * sect_size) != (ssize_t)sizeof(*bs)) {
675                 exfat_err("failed to read a boot sector\n");
676                 ret = -EIO;
677                 goto err;
678         }
679
680         if (memcmp(bs->bpb.oem_name, "EXFAT   ", 8) != 0) {
681                 if (verbose)
682                         exfat_err("failed to find exfat file system\n");
683                 goto err;
684         }
685
686         ret = boot_region_checksum(bd->dev_fd, bs_offset, sect_size);
687         if (ret < 0)
688                 goto err;
689
690         ret = -EINVAL;
691         if (EXFAT_SECTOR_SIZE(bs) < 512 || EXFAT_SECTOR_SIZE(bs) > 4 * KB) {
692                 if (verbose)
693                         exfat_err("too small or big sector size: %d\n",
694                                   EXFAT_SECTOR_SIZE(bs));
695                 goto err;
696         }
697
698         if (EXFAT_CLUSTER_SIZE(bs) > 32 * MB) {
699                 if (verbose)
700                         exfat_err("too big cluster size: %d\n",
701                                   EXFAT_CLUSTER_SIZE(bs));
702                 goto err;
703         }
704
705         if (bs->bsx.fs_version[1] != 1 || bs->bsx.fs_version[0] != 0) {
706                 if (verbose)
707                         exfat_err("unsupported exfat version: %d.%d\n",
708                                   bs->bsx.fs_version[1], bs->bsx.fs_version[0]);
709                 goto err;
710         }
711
712         if (bs->bsx.num_fats != 1) {
713                 if (verbose)
714                         exfat_err("unsupported FAT count: %d\n",
715                                   bs->bsx.num_fats);
716                 goto err;
717         }
718
719         if (le64_to_cpu(bs->bsx.vol_length) * EXFAT_SECTOR_SIZE(bs) >
720                         bd->size) {
721                 if (verbose)
722                         exfat_err("too large sector count: %" PRIu64 ", expected: %llu\n",
723                                   le64_to_cpu(bs->bsx.vol_length),
724                                   bd->num_sectors);
725                 goto err;
726         }
727
728         if (le32_to_cpu(bs->bsx.clu_count) * EXFAT_CLUSTER_SIZE(bs) >
729                         bd->size) {
730                 if (verbose)
731                         exfat_err("too large cluster count: %u, expected: %u\n",
732                                   le32_to_cpu(bs->bsx.clu_count),
733                                   bd->num_clusters);
734                 goto err;
735         }
736
737         *pbr = bs;
738         return 0;
739 err:
740         free(bs);
741         return ret;
742 }
743
744 static int restore_boot_region(struct exfat_blk_dev *bd, unsigned int sect_size)
745 {
746         int i;
747         char *sector;
748         int ret;
749
750         sector = malloc(sect_size);
751         if (!sector)
752                 return -ENOMEM;
753
754         for (i = 0; i < 12; i++) {
755                 if (exfat_read(bd->dev_fd, sector, sect_size,
756                                 BACKUP_BOOT_SEC_IDX * sect_size +
757                                 i * sect_size) !=
758                                 (ssize_t)sect_size) {
759                         ret = -EIO;
760                         goto free_sector;
761                 }
762                 if (i == 0)
763                         ((struct pbr *)sector)->bsx.perc_in_use = 0xff;
764
765                 if (exfat_write(bd->dev_fd, sector, sect_size,
766                                 BOOT_SEC_IDX * sect_size +
767                                 i * sect_size) !=
768                                 (ssize_t)sect_size) {
769                         ret = -EIO;
770                         goto free_sector;
771                 }
772         }
773
774         if (fsync(bd->dev_fd)) {
775                 ret = -EIO;
776                 goto free_sector;
777         }
778         ret = 0;
779
780 free_sector:
781         free(sector);
782         return ret;
783 }
784
785 static int exfat_boot_region_check(struct exfat *exfat, struct pbr **bs)
786 {
787         struct pbr *boot_sect;
788         unsigned int sect_size;
789         int ret;
790
791         /* First, find out the exfat sector size */
792         boot_sect = malloc(sizeof(*boot_sect));
793         if (boot_sect == NULL)
794                 return -ENOMEM;
795
796         if (exfat_read(exfat->blk_dev->dev_fd, boot_sect,
797                        sizeof(*boot_sect), 0) != (ssize_t)sizeof(*boot_sect)) {
798                 exfat_err("failed to read Main boot sector\n");
799                 return -EIO;
800         }
801
802         sect_size = 1 << boot_sect->bsx.sect_size_bits;
803         free(boot_sect);
804
805         /* check boot regions */
806         ret = read_boot_region(exfat->blk_dev, bs,
807                                BOOT_SEC_IDX, sect_size, true);
808         if (ret == -EINVAL && exfat_repair_ask(exfat, ER_BS_BOOT_REGION,
809                                 "boot region is corrupted. try to restore the region from backup"
810                                 )) {
811                 const unsigned int sector_sizes[] = {512, 4096, 1024, 2048};
812                 unsigned int i;
813
814                 if (sect_size >= 512 && sect_size <= EXFAT_MAX_SECTOR_SIZE) {
815                         ret = read_boot_region(exfat->blk_dev, bs,
816                                                BACKUP_BOOT_SEC_IDX, sect_size,
817                                                false);
818                         if (!ret)
819                                 goto restore;
820                 }
821
822                 for (i = 0; i < sizeof(sector_sizes)/sizeof(sector_sizes[0]); i++) {
823                         if (sector_sizes[i] == sect_size)
824                                 continue;
825
826                         ret = read_boot_region(exfat->blk_dev, bs,
827                                                BACKUP_BOOT_SEC_IDX,
828                                                sector_sizes[i], false);
829                         if (!ret) {
830                                 sect_size = sector_sizes[i];
831                                 goto restore;
832                         }
833                 }
834                 exfat_err("backup boot region is also corrupted\n");
835         }
836
837         return ret;
838 restore:
839         ret = restore_boot_region(exfat->blk_dev, sect_size);
840         if (ret) {
841                 exfat_err("failed to restore boot region from backup\n");
842                 free(*bs);
843                 *bs = NULL;
844         }
845         return ret;
846 }
847
848 static void dentry_calc_checksum(struct exfat_dentry *dentry,
849                                 __le16 *checksum, bool primary)
850 {
851         unsigned int i;
852         uint8_t *bytes;
853
854         bytes = (uint8_t *)dentry;
855
856         *checksum = ((*checksum << 15) | (*checksum >> 1)) + bytes[0];
857         *checksum = ((*checksum << 15) | (*checksum >> 1)) + bytes[1];
858
859         i = primary ? 4 : 2;
860         for (; i < sizeof(*dentry); i++) {
861                 *checksum = ((*checksum << 15) | (*checksum >> 1)) + bytes[i];
862         }
863 }
864
865 static __le16 file_calc_checksum(struct exfat_de_iter *iter)
866 {
867         __le16 checksum;
868         struct exfat_dentry *file_de, *de;
869         int i;
870
871         checksum = 0;
872         exfat_de_iter_get(iter, 0, &file_de);
873
874         dentry_calc_checksum(file_de, &checksum, true);
875         for (i = 1; i <= file_de->file_num_ext; i++) {
876                 exfat_de_iter_get(iter, i, &de);
877                 dentry_calc_checksum(de, &checksum, false);
878         }
879
880         return checksum;
881 }
882
883 /*
884  * return 0 if there are no errors, or 1 if errors are fixed, or
885  * an error code
886  */
887 static int check_inode(struct exfat_de_iter *iter, struct exfat_inode *node)
888 {
889         struct exfat *exfat = iter->exfat;
890         struct exfat_dentry *dentry;
891         int ret = 0;
892         uint16_t checksum;
893         bool valid = true;
894
895         ret = check_clus_chain(exfat, node);
896         if (ret < 0)
897                 return ret;
898
899         if (node->size > le32_to_cpu(exfat->bs->bsx.clu_count) *
900                                 (uint64_t)exfat->clus_size) {
901                 fsck_err(iter->parent, node,
902                         "size %" PRIu64 " is greater than cluster heap\n",
903                         node->size);
904                 valid = false;
905         }
906
907         if (node->size == 0 && node->is_contiguous) {
908                 if (repair_file_ask(iter, node, ER_FILE_ZERO_NOFAT,
909                                 "empty, but has no Fat chain\n")) {
910                         exfat_de_iter_get_dirty(iter, 1, &dentry);
911                         dentry->stream_flags &= ~EXFAT_SF_CONTIGUOUS;
912                         ret = 1;
913                 } else
914                         valid = false;
915         }
916
917         if ((node->attr & ATTR_SUBDIR) &&
918                         node->size % exfat->clus_size != 0) {
919                 fsck_err(iter->parent, node,
920                         "directory size %" PRIu64 " is not divisible by %d\n",
921                         node->size, exfat->clus_size);
922                 valid = false;
923         }
924
925         checksum = file_calc_checksum(iter);
926         exfat_de_iter_get(iter, 0, &dentry);
927         if (checksum != le16_to_cpu(dentry->file_checksum)) {
928                 if (repair_file_ask(iter, node, ER_DE_CHECKSUM,
929                                 "the checksum of a file is wrong")) {
930                         exfat_de_iter_get_dirty(iter, 0, &dentry);
931                         dentry->file_checksum = cpu_to_le16(checksum);
932                         ret = 1;
933                 } else
934                         valid = false;
935         }
936
937         return valid ? ret : -EINVAL;
938 }
939
940 static int read_file_dentries(struct exfat_de_iter *iter,
941                         struct exfat_inode **new_node, int *skip_dentries)
942 {
943         struct exfat_dentry *file_de, *stream_de, *name_de;
944         struct exfat_inode *node;
945         int i, ret;
946
947         /* TODO: mtime, atime, ... */
948
949         ret = exfat_de_iter_get(iter, 0, &file_de);
950         if (ret || file_de->type != EXFAT_FILE) {
951                 exfat_err("failed to get file dentry. %d\n", ret);
952                 return -EINVAL;
953         }
954         ret = exfat_de_iter_get(iter, 1, &stream_de);
955         if (ret || stream_de->type != EXFAT_STREAM) {
956                 exfat_err("failed to get stream dentry. %d\n", ret);
957                 return -EINVAL;
958         }
959
960         *new_node = NULL;
961         node = alloc_exfat_inode(le16_to_cpu(file_de->file_attr));
962         if (!node)
963                 return -ENOMEM;
964
965         if (file_de->file_num_ext < 2) {
966                 exfat_err("too few secondary count. %d\n",
967                                 file_de->file_num_ext);
968                 free_exfat_inode(node);
969                 return -EINVAL;
970         }
971
972         for (i = 2; i <= file_de->file_num_ext; i++) {
973                 ret = exfat_de_iter_get(iter, i, &name_de);
974                 if (ret || name_de->type != EXFAT_NAME) {
975                         exfat_err("failed to get name dentry. %d\n", ret);
976                         ret = -EINVAL;
977                         goto err;
978                 }
979
980                 memcpy(node->name +
981                         (i-2) * ENTRY_NAME_MAX, name_de->name_unicode,
982                         sizeof(name_de->name_unicode));
983         }
984
985         node->first_clus = le32_to_cpu(stream_de->stream_start_clu);
986         node->is_contiguous =
987                 ((stream_de->stream_flags & EXFAT_SF_CONTIGUOUS) != 0);
988         node->size = le64_to_cpu(stream_de->stream_size);
989
990         if (node->size < le64_to_cpu(stream_de->stream_valid_size)) {
991                 if (repair_file_ask(iter, node, ER_FILE_VALID_SIZE,
992                         "valid size %" PRIu64 " greater than size %" PRIu64,
993                         le64_to_cpu(stream_de->stream_valid_size),
994                         node->size)) {
995                         exfat_de_iter_get_dirty(iter, 1, &stream_de);
996                         stream_de->stream_valid_size =
997                                         stream_de->stream_size;
998                 } else {
999                         ret = -EINVAL;
1000                         goto err;
1001                 }
1002         }
1003
1004         *skip_dentries = (file_de->file_num_ext + 1);
1005         *new_node = node;
1006         return 0;
1007 err:
1008         *skip_dentries = 0;
1009         *new_node = NULL;
1010         free_exfat_inode(node);
1011         return ret;
1012 }
1013
1014 static int read_file(struct exfat_de_iter *de_iter,
1015                 struct exfat_inode **new_node, int *dentry_count)
1016 {
1017         struct exfat_inode *node;
1018         int ret;
1019
1020         *new_node = NULL;
1021
1022         ret = read_file_dentries(de_iter, &node, dentry_count);
1023         if (ret)
1024                 return ret;
1025
1026         ret = check_inode(de_iter, node);
1027         if (ret < 0) {
1028                 free_exfat_inode(node);
1029                 return -EINVAL;
1030         }
1031
1032         *new_node = node;
1033         return ret;
1034 }
1035
1036 static bool read_volume_label(struct exfat_de_iter *iter)
1037 {
1038         struct exfat *exfat;
1039         struct exfat_dentry *dentry;
1040         __le16 disk_label[VOLUME_LABEL_MAX_LEN];
1041
1042         exfat = iter->exfat;
1043         if (exfat_de_iter_get(iter, 0, &dentry))
1044                 return false;
1045
1046         if (dentry->vol_char_cnt == 0)
1047                 return true;
1048
1049         if (dentry->vol_char_cnt > VOLUME_LABEL_MAX_LEN) {
1050                 exfat_err("too long label. %d\n", dentry->vol_char_cnt);
1051                 return false;
1052         }
1053
1054         memcpy(disk_label, dentry->vol_label, sizeof(disk_label));
1055         if (exfat_utf16_dec(disk_label, dentry->vol_char_cnt*2,
1056                 exfat->volume_label, sizeof(exfat->volume_label)) < 0) {
1057                 exfat_err("failed to decode volume label\n");
1058                 return false;
1059         }
1060
1061         exfat_info("volume label [%s]\n", exfat->volume_label);
1062         return true;
1063 }
1064
1065 static void exfat_bitmap_set_range(struct exfat *exfat,
1066                         clus_t start_clus, clus_t count)
1067 {
1068         clus_t clus;
1069
1070         if (!heap_clus(exfat, start_clus) ||
1071                 !heap_clus(exfat, start_clus + count))
1072                 return;
1073
1074         clus = start_clus;
1075         while (clus < start_clus + count) {
1076                 EXFAT_BITMAP_SET(exfat->alloc_bitmap,
1077                                 clus - EXFAT_FIRST_CLUSTER);
1078                 clus++;
1079         }
1080 }
1081
1082 static bool read_bitmap(struct exfat_de_iter *iter)
1083 {
1084         struct exfat_dentry *dentry;
1085         struct exfat *exfat;
1086
1087         exfat = iter->exfat;
1088         if (exfat_de_iter_get(iter, 0, &dentry))
1089                 return false;
1090
1091         exfat_debug("start cluster %#x, size %#" PRIx64 "\n",
1092                         le32_to_cpu(dentry->bitmap_start_clu),
1093                         le64_to_cpu(dentry->bitmap_size));
1094
1095         if (le64_to_cpu(dentry->bitmap_size) <
1096                         DIV_ROUND_UP(exfat->clus_count, 8)) {
1097                 exfat_err("invalid size of allocation bitmap. 0x%" PRIx64 "\n",
1098                                 le64_to_cpu(dentry->bitmap_size));
1099                 return false;
1100         }
1101         if (!heap_clus(exfat, le32_to_cpu(dentry->bitmap_start_clu))) {
1102                 exfat_err("invalid start cluster of allocate bitmap. 0x%x\n",
1103                                 le32_to_cpu(dentry->bitmap_start_clu));
1104                 return false;
1105         }
1106
1107         exfat->disk_bitmap_clus = le32_to_cpu(dentry->bitmap_start_clu);
1108         exfat->disk_bitmap_size = DIV_ROUND_UP(exfat->clus_count, 8);
1109
1110         exfat_bitmap_set_range(exfat, le64_to_cpu(dentry->bitmap_start_clu),
1111                         DIV_ROUND_UP(exfat->disk_bitmap_size,
1112                         exfat->clus_size));
1113
1114         if (exfat_read(exfat->blk_dev->dev_fd, exfat->disk_bitmap,
1115                         exfat->disk_bitmap_size,
1116                         exfat_c2o(exfat, exfat->disk_bitmap_clus)) !=
1117                         (ssize_t)exfat->disk_bitmap_size)
1118                 return false;
1119
1120         return true;
1121 }
1122
1123 static bool read_upcase_table(struct exfat_de_iter *iter)
1124 {
1125         struct exfat_dentry *dentry;
1126         struct exfat *exfat;
1127         ssize_t size;
1128         __le16 *upcase;
1129         __le32 checksum;
1130
1131         exfat = iter->exfat;
1132
1133         if (exfat_de_iter_get(iter, 0, &dentry))
1134                 return false;
1135
1136         if (!heap_clus(exfat, le32_to_cpu(dentry->upcase_start_clu))) {
1137                 exfat_err("invalid start cluster of upcase table. 0x%x\n",
1138                         le32_to_cpu(dentry->upcase_start_clu));
1139                 return false;
1140         }
1141
1142         size = (ssize_t)le64_to_cpu(dentry->upcase_size);
1143         if (size > (ssize_t)(EXFAT_MAX_UPCASE_CHARS * sizeof(__le16)) ||
1144                         size == 0 || size % sizeof(__le16)) {
1145                 exfat_err("invalid size of upcase table. 0x%" PRIx64 "\n",
1146                         le64_to_cpu(dentry->upcase_size));
1147                 return false;
1148         }
1149
1150         upcase = (__le16 *)malloc(size);
1151         if (!upcase) {
1152                 exfat_err("failed to allocate upcase table\n");
1153                 return false;
1154         }
1155
1156         if (exfat_read(exfat->blk_dev->dev_fd, upcase, size,
1157                         exfat_c2o(exfat,
1158                         le32_to_cpu(dentry->upcase_start_clu))) != size) {
1159                 exfat_err("failed to read upcase table\n");
1160                 free(upcase);
1161                 return false;
1162         }
1163
1164         checksum = 0;
1165         boot_calc_checksum((unsigned char *)upcase, size, false, &checksum);
1166         if (le32_to_cpu(dentry->upcase_checksum) != checksum) {
1167                 exfat_err("corrupted upcase table %#x (expected: %#x)\n",
1168                         checksum, le32_to_cpu(dentry->upcase_checksum));
1169                 free(upcase);
1170                 return false;
1171         }
1172
1173         exfat_bitmap_set_range(exfat, le32_to_cpu(dentry->upcase_start_clu),
1174                         DIV_ROUND_UP(le64_to_cpu(dentry->upcase_size),
1175                         exfat->clus_size));
1176
1177         free(upcase);
1178         return true;
1179 }
1180
1181 static int read_children(struct exfat *exfat, struct exfat_inode *dir)
1182 {
1183         int ret;
1184         struct exfat_inode *node = NULL;
1185         struct exfat_dentry *dentry;
1186         int dentry_count;
1187         struct exfat_de_iter *de_iter;
1188
1189         de_iter = &exfat->de_iter;
1190         ret = exfat_de_iter_init(de_iter, exfat, dir);
1191         if (ret == EOF)
1192                 return 0;
1193         else if (ret)
1194                 return ret;
1195
1196         while (1) {
1197                 ret = exfat_de_iter_get(de_iter, 0, &dentry);
1198                 if (ret == EOF) {
1199                         break;
1200                 } else if (ret) {
1201                         fsck_err(dir->parent, dir,
1202                                 "failed to get a dentry. %d\n", ret);
1203                         goto err;
1204                 }
1205
1206                 dentry_count = 1;
1207
1208                 switch (dentry->type) {
1209                 case EXFAT_FILE:
1210                         ret = read_file(de_iter, &node, &dentry_count);
1211                         if (ret < 0) {
1212                                 exfat_stat.error_count++;
1213                                 goto err;
1214                         } else if (ret) {
1215                                 exfat_stat.error_count++;
1216                                 exfat_stat.fixed_count++;
1217                         }
1218
1219                         if ((node->attr & ATTR_SUBDIR) && node->size) {
1220                                 node->parent = dir;
1221                                 list_add_tail(&node->sibling, &dir->children);
1222                                 list_add_tail(&node->list, &exfat->dir_list);
1223                         } else
1224                                 free_exfat_inode(node);
1225                         break;
1226                 case EXFAT_VOLUME:
1227                         if (!read_volume_label(de_iter)) {
1228                                 exfat_err("failed to verify volume label\n");
1229                                 ret = -EINVAL;
1230                                 goto err;
1231                         }
1232                         break;
1233                 case EXFAT_BITMAP:
1234                         if (!read_bitmap(de_iter)) {
1235                                 exfat_err(
1236                                         "failed to verify allocation bitmap\n");
1237                                 ret = -EINVAL;
1238                                 goto err;
1239                         }
1240                         break;
1241                 case EXFAT_UPCASE:
1242                         if (!read_upcase_table(de_iter)) {
1243                                 exfat_err(
1244                                         "failed to verify upcase table\n");
1245                                 ret = -EINVAL;
1246                                 goto err;
1247                         }
1248                         break;
1249                 case EXFAT_LAST:
1250                         goto out;
1251                 default:
1252                         if (IS_EXFAT_DELETED(dentry->type))
1253                                 break;
1254                         exfat_err("unknown entry type. 0x%x\n", dentry->type);
1255                         ret = -EINVAL;
1256                         goto err;
1257                 }
1258
1259                 exfat_de_iter_advance(de_iter, dentry_count);
1260         }
1261 out:
1262         exfat_de_iter_flush(de_iter);
1263         return 0;
1264 err:
1265         inode_free_children(dir, false);
1266         INIT_LIST_HEAD(&dir->children);
1267         exfat_de_iter_flush(de_iter);
1268         return ret;
1269 }
1270
1271 static int write_dirty_fat(struct exfat *exfat)
1272 {
1273         struct buffer_desc *bd;
1274         off_t offset;
1275         ssize_t len;
1276         size_t read_size, write_size;
1277         clus_t clus, last_clus, clus_count, i;
1278         unsigned int idx;
1279
1280         clus = 0;
1281         last_clus = le32_to_cpu(exfat->bs->bsx.clu_count) + 2;
1282         bd = exfat->buffer_desc;
1283         idx = 0;
1284         offset = le32_to_cpu(exfat->bs->bsx.fat_offset) *
1285                 exfat->sect_size;
1286         read_size = exfat->clus_size;
1287         write_size = exfat->sect_size;
1288
1289         while (clus < last_clus) {
1290                 clus_count = MIN(read_size / sizeof(clus_t), last_clus - clus);
1291                 len = exfat_read(exfat->blk_dev->dev_fd, bd[idx].buffer,
1292                                 clus_count * sizeof(clus_t), offset);
1293                 if (len != (ssize_t)(sizeof(clus_t) * clus_count)) {
1294                         exfat_err("failed to read fat entries, %zd\n", len);
1295                         return -EIO;
1296                 }
1297
1298                 /* TODO: read ahead */
1299
1300                 for (i = clus ? clus : EXFAT_FIRST_CLUSTER;
1301                                 i < clus + clus_count; i++) {
1302                         if (!EXFAT_BITMAP_GET(exfat->alloc_bitmap,
1303                                         i - EXFAT_FIRST_CLUSTER) &&
1304                                         ((clus_t *)bd[idx].buffer)[i - clus] !=
1305                                         EXFAT_FREE_CLUSTER) {
1306                                 ((clus_t *)bd[idx].buffer)[i - clus] =
1307                                         EXFAT_FREE_CLUSTER;
1308                                 bd[idx].dirty[(i - clus) /
1309                                         (write_size / sizeof(clus_t))] = true;
1310                         }
1311                 }
1312
1313                 for (i = 0; i < read_size; i += write_size) {
1314                         if (bd[idx].dirty[i / write_size]) {
1315                                 if (exfat_write(exfat->blk_dev->dev_fd,
1316                                                 &bd[idx].buffer[i], write_size,
1317                                                 offset + i) !=
1318                                                 (ssize_t)write_size) {
1319                                         exfat_err("failed to write "
1320                                                 "fat entries\n");
1321                                         return -EIO;
1322
1323                                 }
1324                                 bd[idx].dirty[i / write_size] = false;
1325                         }
1326                 }
1327
1328                 idx ^= 0x01;
1329                 clus = clus + clus_count;
1330                 offset += len;
1331         }
1332         return 0;
1333 }
1334
1335 static int write_dirty_bitmap(struct exfat *exfat)
1336 {
1337         struct buffer_desc *bd;
1338         off_t offset, last_offset, bitmap_offset;
1339         ssize_t len;
1340         ssize_t read_size, write_size, i, size;
1341         int idx;
1342
1343         offset = exfat_c2o(exfat, exfat->disk_bitmap_clus);
1344         last_offset = offset + exfat->disk_bitmap_size;
1345         bitmap_offset = 0;
1346         read_size = exfat->clus_size;
1347         write_size = exfat->sect_size;
1348
1349         bd = exfat->buffer_desc;
1350         idx = 0;
1351
1352         while (offset < last_offset) {
1353                 len = MIN(read_size, last_offset - offset);
1354                 if (exfat_read(exfat->blk_dev->dev_fd, bd[idx].buffer,
1355                                 len, offset) != (ssize_t)len)
1356                         return -EIO;
1357
1358                 /* TODO: read-ahead */
1359
1360                 for (i = 0; i < len; i += write_size) {
1361                         size = MIN(write_size, len - i);
1362                         if (memcmp(&bd[idx].buffer[i],
1363                                         exfat->alloc_bitmap + bitmap_offset + i,
1364                                         size)) {
1365                                 if (exfat_write(exfat->blk_dev->dev_fd,
1366                                         exfat->alloc_bitmap + bitmap_offset + i,
1367                                         size, offset + i) != size)
1368                                         return -EIO;
1369                         }
1370                 }
1371
1372                 idx ^= 0x01;
1373                 offset += len;
1374                 bitmap_offset += len;
1375         }
1376         return 0;
1377 }
1378
1379 static int reclaim_free_clusters(struct exfat *exfat)
1380 {
1381         if (write_dirty_fat(exfat)) {
1382                 exfat_err("failed to write fat entries\n");
1383                 return -EIO;
1384         }
1385         if (write_dirty_bitmap(exfat)) {
1386                 exfat_err("failed to write bitmap\n");
1387                 return -EIO;
1388         }
1389         return 0;
1390 }
1391
1392 /*
1393  * for each directory in @dir_list.
1394  * 1. read all dentries and allocate exfat_nodes for files and directories.
1395  *    and append directory exfat_nodes to the head of @dir_list
1396  * 2. free all of file exfat_nodes.
1397  * 3. if the directory does not have children, free its exfat_node.
1398  */
1399 static int exfat_filesystem_check(struct exfat *exfat)
1400 {
1401         struct exfat_inode *dir;
1402         int ret = 0, dir_errors;
1403
1404         if (!exfat->root) {
1405                 exfat_err("root is NULL\n");
1406                 return -ENOENT;
1407         }
1408
1409         list_add(&exfat->root->list, &exfat->dir_list);
1410
1411         while (!list_empty(&exfat->dir_list)) {
1412                 dir = list_entry(exfat->dir_list.next, struct exfat_inode, list);
1413
1414                 if (!(dir->attr & ATTR_SUBDIR)) {
1415                         fsck_err(dir->parent, dir,
1416                                 "failed to travel directories. "
1417                                 "the node is not directory\n");
1418                         ret = -EINVAL;
1419                         goto out;
1420                 }
1421
1422                 dir_errors = read_children(exfat, dir);
1423                 if (dir_errors) {
1424                         resolve_path(&path_resolve_ctx, dir);
1425                         exfat_debug("failed to check dentries: %s\n",
1426                                         path_resolve_ctx.local_path);
1427                         ret = dir_errors;
1428                 }
1429
1430                 list_del(&dir->list);
1431                 inode_free_file_children(dir);
1432                 inode_free_ancestors(dir);
1433         }
1434 out:
1435         exfat_free_dir_list(exfat);
1436         exfat->root = NULL;
1437         if (exfat->dirty_fat && reclaim_free_clusters(exfat))
1438                 return -EIO;
1439         return ret;
1440 }
1441
1442 static int exfat_root_dir_check(struct exfat *exfat)
1443 {
1444         struct exfat_inode *root;
1445         clus_t clus_count;
1446
1447         root = alloc_exfat_inode(ATTR_SUBDIR);
1448         if (!root) {
1449                 exfat_err("failed to allocate memory\n");
1450                 return -ENOMEM;
1451         }
1452
1453         root->first_clus = le32_to_cpu(exfat->bs->bsx.root_cluster);
1454         if (!root_get_clus_count(exfat, root, &clus_count)) {
1455                 exfat_err("failed to follow the cluster chain of root\n");
1456                 free_exfat_inode(root);
1457                 return -EINVAL;
1458         }
1459         root->size = clus_count * exfat->clus_size;
1460
1461         exfat->root = root;
1462         exfat_debug("root directory: start cluster[0x%x] size[0x%" PRIx64 "]\n",
1463                 root->first_clus, root->size);
1464         return 0;
1465 }
1466
1467 static char *bytes_to_human_readable(size_t bytes)
1468 {
1469         static const char * const units[] = {"B", "KB", "MB", "GB", "TB", "PB"};
1470         static char buf[15*4];
1471         unsigned int i, shift, quoti, remain;
1472
1473         shift = 0;
1474         for (i = 0; i < sizeof(units)/sizeof(units[0]); i++) {
1475                 if (bytes / (1ULL << (shift + 10)) == 0)
1476                         break;
1477                 shift += 10;
1478         }
1479
1480         quoti = (unsigned int)(bytes / (1ULL << shift));
1481         remain = 0;
1482         if (shift > 0) {
1483                 remain = (unsigned int)
1484                         ((bytes & ((1ULL << shift) - 1)) >> (shift - 10));
1485                 remain = (remain * 100) / 1024;
1486         }
1487
1488         snprintf(buf, sizeof(buf), "%u.%02u %s", quoti, remain, units[i]);
1489         return buf;
1490 }
1491
1492 static void exfat_show_info(struct exfat *exfat, const char *dev_name,
1493                         int errors)
1494 {
1495         exfat_info("sector size:  %s\n",
1496                 bytes_to_human_readable(1 << exfat->bs->bsx.sect_size_bits));
1497         exfat_info("cluster size: %s\n",
1498                 bytes_to_human_readable(exfat->clus_size));
1499         exfat_info("volume size:  %s\n",
1500                 bytes_to_human_readable(exfat->blk_dev->size));
1501
1502         printf("%s: %s. directories %ld, files %ld\n", dev_name,
1503                         errors ? "checking stopped" : "clean",
1504                         exfat_stat.dir_count, exfat_stat.file_count);
1505         if (errors || exfat->dirty)
1506                 printf("%s: files corrupted %ld, files fixed %ld\n", dev_name,
1507                         exfat_stat.error_count, exfat_stat.fixed_count);
1508 }
1509
1510 int main(int argc, char * const argv[])
1511 {
1512         struct fsck_user_input ui;
1513         struct exfat_blk_dev bd;
1514         struct exfat *exfat = NULL;
1515         struct pbr *bs = NULL;
1516         int c, ret, exit_code;
1517         bool version_only = false;
1518
1519         memset(&ui, 0, sizeof(ui));
1520         memset(&bd, 0, sizeof(bd));
1521
1522         print_level = EXFAT_ERROR;
1523
1524         if (!setlocale(LC_CTYPE, ""))
1525                 exfat_err("failed to init locale/codeset\n");
1526
1527         opterr = 0;
1528         while ((c = getopt_long(argc, argv, "arynpVvh", opts, NULL)) != EOF) {
1529                 switch (c) {
1530                 case 'n':
1531                         if (ui.options & FSCK_OPTS_REPAIR_ALL)
1532                                 usage(argv[0]);
1533                         ui.options |= FSCK_OPTS_REPAIR_NO;
1534                         break;
1535                 case 'r':
1536                         if (ui.options & FSCK_OPTS_REPAIR_ALL)
1537                                 usage(argv[0]);
1538                         ui.options |= FSCK_OPTS_REPAIR_ASK;
1539                         break;
1540                 case 'y':
1541                         if (ui.options & FSCK_OPTS_REPAIR_ALL)
1542                                 usage(argv[0]);
1543                         ui.options |= FSCK_OPTS_REPAIR_YES;
1544                         break;
1545                 case 'a':
1546                 case 'p':
1547                         if (ui.options & FSCK_OPTS_REPAIR_ALL)
1548                                 usage(argv[0]);
1549                         ui.options |= FSCK_OPTS_REPAIR_AUTO;
1550                         break;
1551                 case 'V':
1552                         version_only = true;
1553                         break;
1554                 case 'v':
1555                         if (print_level < EXFAT_DEBUG)
1556                                 print_level++;
1557                         break;
1558                 case '?':
1559                 case 'h':
1560                 default:
1561                         usage(argv[0]);
1562                 }
1563         }
1564
1565         show_version();
1566         if (optind != argc - 1)
1567                 usage(argv[0]);
1568
1569         if (version_only)
1570                 exit(FSCK_EXIT_SYNTAX_ERROR);
1571         if (ui.options & FSCK_OPTS_REPAIR_WRITE)
1572                 ui.ei.writeable = true;
1573         else {
1574                 ui.options |= FSCK_OPTS_REPAIR_NO;
1575                 ui.ei.writeable = false;
1576         }
1577
1578         snprintf(ui.ei.dev_name, sizeof(ui.ei.dev_name), "%s", argv[optind]);
1579         ret = exfat_get_blk_dev_info(&ui.ei, &bd);
1580         if (ret < 0) {
1581                 exfat_err("failed to open %s. %d\n", ui.ei.dev_name, ret);
1582                 return FSCK_EXIT_OPERATION_ERROR;
1583         }
1584
1585         exfat = (struct exfat *)calloc(1, sizeof(*exfat));
1586         if (!exfat) {
1587                 exfat_err("failed to allocate exfat\n");
1588                 ret = -ENOMEM;
1589                 goto err;
1590         }
1591         exfat->blk_dev = &bd;
1592         exfat->options = ui.options;
1593
1594         ret = exfat_boot_region_check(exfat, &bs);
1595         if (ret)
1596                 goto err;
1597
1598         ret = init_exfat(exfat, bs);
1599         if (ret)
1600                 goto err;
1601
1602         if (exfat_mark_volume_dirty(exfat, true)) {
1603                 ret = -EIO;
1604                 goto err;
1605         }
1606
1607         exfat_debug("verifying root directory...\n");
1608         ret = exfat_root_dir_check(exfat);
1609         if (ret) {
1610                 exfat_err("failed to verify root directory.\n");
1611                 goto out;
1612         }
1613
1614         exfat_debug("verifying directory entries...\n");
1615         ret = exfat_filesystem_check(exfat);
1616         if (ret)
1617                 goto out;
1618
1619         if (ui.ei.writeable && fsync(bd.dev_fd)) {
1620                 exfat_err("failed to sync\n");
1621                 ret = -EIO;
1622                 goto out;
1623         }
1624         exfat_mark_volume_dirty(exfat, false);
1625
1626 out:
1627         exfat_show_info(exfat, ui.ei.dev_name, ret);
1628 err:
1629         if (ret == -EINVAL)
1630                 exit_code = FSCK_EXIT_ERRORS_LEFT;
1631         else if (ret)
1632                 exit_code = FSCK_EXIT_OPERATION_ERROR;
1633         else if (exfat->dirty)
1634                 exit_code = FSCK_EXIT_CORRECTED;
1635         else
1636                 exit_code = FSCK_EXIT_NO_ERRORS;
1637
1638         free_exfat(exfat);
1639         close(bd.dev_fd);
1640         return exit_code;
1641 }