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;
}
#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)
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;
}
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)
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;
}
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;
}