OSDN Git Service

Move VBR checksum calculation functions to libexfat.
[android-x86/external-exfat.git] / libexfat / cluster.c
index 6d70c25..fc7dbc5 100644 (file)
 #include <errno.h>
 #include <string.h>
 
-#define BMAP_GET(bitmap, index) ((bitmap)[(index) / 8] & (1u << ((index) % 8)))
-#define BMAP_SET(bitmap, index) (bitmap)[(index) / 8] |= (1u << ((index) % 8))
-#define BMAP_CLR(bitmap, index) (bitmap)[(index) / 8] &= ~(1u << ((index) % 8))
-
 /*
  * Block to absolute offset.
  */
@@ -149,12 +145,14 @@ static void set_next_cluster(const struct exfat* ef, int contiguous,
                cluster_t current, cluster_t next)
 {
        off_t fat_offset;
+       le32_t next_le32;
 
        if (contiguous)
                return;
        fat_offset = b2o(ef, le32_to_cpu(ef->sb->fat_block_start))
                + current * sizeof(cluster_t);
-       exfat_write_raw(&next, sizeof(next), fat_offset, ef->fd);
+       next_le32 = cpu_to_le32(next);
+       exfat_write_raw(&next_le32, sizeof(next_le32), fat_offset, ef->fd);
 }
 
 static cluster_t allocate_cluster(struct exfat* ef, cluster_t hint)
@@ -359,6 +357,9 @@ int exfat_truncate(struct exfat* ef, struct exfat_node* node, uint64_t size)
        uint32_t c2 = bytes2clusters(ef, size);
        int rc = 0;
 
+       if (node->references == 0 && node->parent)
+               exfat_bug("no references, node changes can be lost");
+
        if (node->size == size)
                return 0;
 
@@ -380,7 +381,7 @@ int exfat_truncate(struct exfat* ef, struct exfat_node* node, uint64_t size)
        return 0;
 }
 
-uint32_t exfat_count_free_clusters(struct exfat* ef)
+uint32_t exfat_count_free_clusters(const struct exfat* ef)
 {
        uint32_t free_clusters = 0;
        uint32_t i;