Move nodes flush from exfat_flush() into a separate function.

Make exfat_flush() execution time more predictable.
This commit is contained in:
relan
2015-11-07 11:06:34 +03:00
parent 77a236ce4c
commit 01be539e4d
4 changed files with 12 additions and 4 deletions

View 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;

View 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_nodes(struct exfat* ef)
{
return flush_nodes(ef, ef->root);
}
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,
@@ -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,

View 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);

View 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);