diff options
author | bigbiff bigbiff <bigbiff@teamw.in> | 2014-09-05 02:58:41 +0200 |
---|---|---|
committer | Ethan Yonker <dees_troy@teamw.in> | 2014-09-05 15:46:39 +0200 |
commit | 2e33c5ee0b1a1ece068489e8fd99f3e4eb3501b5 (patch) | |
tree | 697067dc07351c8e6a6a7d5e3228143304a6b8ae /exfat/libexfat/cluster.c | |
parent | MTP: Use fork instead of pthread (diff) | |
download | android_bootable_recovery-2e33c5ee0b1a1ece068489e8fd99f3e4eb3501b5.tar android_bootable_recovery-2e33c5ee0b1a1ece068489e8fd99f3e4eb3501b5.tar.gz android_bootable_recovery-2e33c5ee0b1a1ece068489e8fd99f3e4eb3501b5.tar.bz2 android_bootable_recovery-2e33c5ee0b1a1ece068489e8fd99f3e4eb3501b5.tar.lz android_bootable_recovery-2e33c5ee0b1a1ece068489e8fd99f3e4eb3501b5.tar.xz android_bootable_recovery-2e33c5ee0b1a1ece068489e8fd99f3e4eb3501b5.tar.zst android_bootable_recovery-2e33c5ee0b1a1ece068489e8fd99f3e4eb3501b5.zip |
Diffstat (limited to 'exfat/libexfat/cluster.c')
-rw-r--r-- | exfat/libexfat/cluster.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/exfat/libexfat/cluster.c b/exfat/libexfat/cluster.c index 2215636c6..80e3792dd 100644 --- a/exfat/libexfat/cluster.c +++ b/exfat/libexfat/cluster.c @@ -3,7 +3,7 @@ exFAT file system implementation library. Free exFAT implementation. - Copyright (C) 2010-2013 Andrew Nayenko + Copyright (C) 2010-2014 Andrew Nayenko This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -83,9 +83,9 @@ cluster_t exfat_next_cluster(const struct exfat* ef, return cluster + 1; fat_offset = s2o(ef, le32_to_cpu(ef->sb->fat_sector_start)) + cluster * sizeof(cluster_t); - /* FIXME handle I/O error */ if (exfat_pread(ef->dev, &next, sizeof(next), fat_offset) < 0) - exfat_bug("failed to read the next cluster after %#x", cluster); + return EXFAT_CLUSTER_BAD; /* the caller should handle this and print + appropriate error message */ return le32_to_cpu(next); } @@ -136,8 +136,23 @@ static cluster_t find_bit_and_set(bitmap_t* bitmap, size_t start, size_t end) return EXFAT_CLUSTER_END; } +static int flush_nodes(struct exfat* ef, struct exfat_node* node) +{ + struct exfat_node* p; + + for (p = node->child; p != NULL; p = p->next) + { + int rc = flush_nodes(ef, p); + if (rc != 0) + return rc; + } + return exfat_flush_node(ef, node); +} + int exfat_flush(struct exfat* ef) { + int rc = flush_nodes(ef, ef->root); + if (ef->cmap.dirty) { if (exfat_pwrite(ef->dev, ef->cmap.chunk, @@ -149,7 +164,8 @@ int exfat_flush(struct exfat* ef) } ef->cmap.dirty = false; } - return 0; + + return rc; } static bool set_next_cluster(const struct exfat* ef, bool contiguous, @@ -316,6 +332,7 @@ static int shrink_file(struct exfat* ef, struct exfat_node* node, { previous = node->start_cluster; node->start_cluster = EXFAT_CLUSTER_FREE; + node->flags |= EXFAT_ATTRIB_DIRTY; } node->fptr_index = 0; node->fptr_cluster = node->start_cluster; |