X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Ffile.c;h=3be40f03e08a4b08d27a1acbd4db00892b450401;hb=d5e2f1643a99e57607e86173d832dbfa4f8b51c2;hp=9f4d980b4d52419a301f356a3f93b9314d39bec8;hpb=6443fe537efa35cdad192b2d35ea0398cce56c17;p=bluesky.git diff --git a/bluesky/file.c b/bluesky/file.c index 9f4d980..3be40f0 100644 --- a/bluesky/file.c +++ b/bluesky/file.c @@ -119,7 +119,6 @@ void bluesky_file_write(BlueSkyInode *inode, uint64_t offset, BlueSkyBlock *b = &g_array_index(inode->blocks, BlueSkyBlock, block_num); memcpy(&b->data->data[block_offset], data, bytes); - bluesky_block_flush(inode->fs, b); offset += bytes; data += bytes; @@ -127,7 +126,6 @@ void bluesky_file_write(BlueSkyInode *inode, uint64_t offset, } bluesky_inode_update_ctime(inode, 1); - bluesky_inode_flush(inode->fs, inode); } void bluesky_file_read(BlueSkyInode *inode, uint64_t offset, @@ -183,7 +181,8 @@ void bluesky_block_fetch(BlueSkyFS *fs, BlueSkyBlock *block) } /* Write the given block to cloud-backed storage and mark it clean. */ -void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block) +void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block, + BlueSkyStoreAsync *barrier) { if (block->type != BLUESKY_BLOCK_DIRTY) return; @@ -202,6 +201,8 @@ void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block) bluesky_string_ref(data); async->data = data; bluesky_store_async_submit(async); + if (barrier != NULL) + bluesky_store_add_barrier(barrier, async); bluesky_store_async_unref(async); g_free(block->ref); @@ -217,12 +218,12 @@ void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block) } /* Flush all blocks in a file to stable storage. */ -void bluesky_file_flush(BlueSkyInode *inode) +void bluesky_file_flush(BlueSkyInode *inode, BlueSkyStoreAsync *barrier) { g_return_if_fail(inode->type == BLUESKY_REGULAR); for (int i = 0; i < inode->blocks->len; i++) { BlueSkyBlock *b = &g_array_index(inode->blocks, BlueSkyBlock, i); - bluesky_block_flush(inode->fs, b); + bluesky_block_flush(inode->fs, b, barrier); } }