OSDN Git Service

Move nodes flush from exfat_flush() into a separate function.
authorrelan <relan@users.noreply.github.com>
Sat, 7 Nov 2015 08:06:34 +0000 (11:06 +0300)
committerrelan <relan@users.noreply.github.com>
Sat, 7 Nov 2015 08:24:05 +0000 (11:24 +0300)
Make exfat_flush() execution time more predictable.

fuse/main.c
libexfat/cluster.c
libexfat/exfat.h
libexfat/mount.c

index 030362e..aad082b 100644 (file)
@@ -206,6 +206,9 @@ static int fuse_exfat_fsync(const char* path, int datasync,
        int rc;
 
        exfat_debug("[%s] %s", __func__, path);
+       rc = exfat_flush_nodes(&ef);
+       if (rc != 0)
+               return rc;
        rc = exfat_flush(&ef);
        if (rc != 0)
                return rc;
index 523e9fb..fc3657b 100644 (file)
@@ -149,10 +149,13 @@ static int flush_nodes(struct exfat* ef, struct exfat_node* node)
        return exfat_flush_node(ef, node);
 }
 
-int exfat_flush(struct exfat* ef)
+int exfat_flush_nodes(struct exfat* ef)
 {
-       int rc = flush_nodes(ef, ef->root);
+       return flush_nodes(ef, ef->root);
+}
 
+int exfat_flush(struct exfat* ef)
+{
        if (ef->cmap.dirty)
        {
                if (exfat_pwrite(ef->dev, ef->cmap.chunk,
@@ -165,7 +168,7 @@ int exfat_flush(struct exfat* ef)
                ef->cmap.dirty = false;
        }
 
-       return rc;
+       return 0;
 }
 
 static bool set_next_cluster(const struct exfat* ef, bool contiguous,
index 122ac5b..97d3692 100644 (file)
@@ -169,6 +169,7 @@ cluster_t exfat_next_cluster(const struct exfat* ef,
                const struct exfat_node* node, cluster_t cluster);
 cluster_t exfat_advance_cluster(const struct exfat* ef,
                struct exfat_node* node, uint32_t count);
+int exfat_flush_nodes(struct exfat* ef);
 int exfat_flush(struct exfat* ef);
 int exfat_truncate(struct exfat* ef, struct exfat_node* node, uint64_t size,
                bool erase);
index f1fb01a..0d6ce9e 100644 (file)
@@ -359,7 +359,8 @@ static void finalize_super_block(struct exfat* ef)
 
 void exfat_unmount(struct exfat* ef)
 {
-       exfat_flush(ef);        /* ignore return code */
+       exfat_flush_nodes(ef);  /* ignore return code */
+       exfat_flush(ef);                /* ignore return code */
        exfat_put_node(ef, ef->root);
        exfat_reset_cache(ef);
        free(ef->root);