OSDN Git Service

Flush node on close instead of flushing on each node modification.
authorresver <resver@60bc1c72-a15a-11de-b98f-4500b42dc123>
Sat, 14 Nov 2009 19:22:12 +0000 (19:22 +0000)
committerresver <resver@60bc1c72-a15a-11de-b98f-4500b42dc123>
Sat, 14 Nov 2009 19:22:12 +0000 (19:22 +0000)
git-svn-id: http://exfat.googlecode.com/svn/trunk@49 60bc1c72-a15a-11de-b98f-4500b42dc123

libexfat/cluster.c
libexfat/exfat.h
libexfat/io.c
libexfat/node.c

index 1de33bd..fc4cddb 100644 (file)
@@ -325,8 +325,7 @@ int exfat_truncate(struct exfat* ef, struct exfat_node* node, uint64_t size)
        if (node->size != size)
        {
                node->size = size;
-               /* FIXME no need to flush immediately */
-               exfat_flush_node(ef, node);
+               node->flags |= EXFAT_ATTRIB_DIRTY;
        }
        return 0;
 }
index 36925fb..7283848 100644 (file)
@@ -24,6 +24,7 @@
 #define EXFAT_NAME_MAX 256
 #define EXFAT_ATTRIB_CONTIGUOUS 0x10000
 #define EXFAT_ATTRIB_CACHED     0x20000
+#define EXFAT_ATTRIB_DIRTY      0x40000
 #define IS_CONTIGUOUS(node) (((node).flags & EXFAT_ATTRIB_CONTIGUOUS) != 0)
 #define BLOCK_SIZE(sb) (1 << (sb).block_bits)
 #define CLUSTER_SIZE(sb) (BLOCK_SIZE(sb) << (sb).bpc_bits)
index ed7a255..5584998 100644 (file)
@@ -103,7 +103,6 @@ ssize_t exfat_write(struct exfat* ef, struct exfat_node* node,
                cluster = exfat_next_cluster(ef, node, cluster);
        }
        /* FIXME update modification time */
-       /* FIXME no need to flush immediately */
-       exfat_flush_node(ef, node);
+       node->flags |= EXFAT_ATTRIB_DIRTY;
        return size - remainder;
 }
index bfaa49d..d7df468 100644 (file)
@@ -37,6 +37,9 @@ void exfat_put_node(struct exfat* ef, struct exfat_node* node)
                exfat_get_name(node, buffer, EXFAT_NAME_MAX);
                exfat_bug("reference counter of `%s' is below zero", buffer);
        }
+
+       if (node->references == 0 && node->flags & EXFAT_ATTRIB_DIRTY)
+               exfat_flush_node(ef, node);
 }
 
 static void opendir(const struct exfat_node* dir, struct iterator* it)
@@ -358,6 +361,8 @@ static void reset_cache(struct exfat* ef, struct exfat_node* node)
                exfat_warn("non-zero reference counter (%d) for `%s'",
                                node->references, buffer);
        }
+       while (node->references--)
+               exfat_put_node(ef, node);
        node->child = NULL;
        node->flags &= ~EXFAT_ATTRIB_CACHED;
 }
@@ -403,4 +408,6 @@ void exfat_flush_node(struct exfat* ef, struct exfat_node* node)
 
        exfat_write_raw(&meta1, sizeof(meta1), node->meta1_offset, ef->fd);
        exfat_write_raw(&meta2, sizeof(meta2), node->meta2_offset, ef->fd);
+
+       node->flags &= ~EXFAT_ATTRIB_DIRTY;
 }