X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Finode.c;h=a568ae025891304690282eddd5bea4bc4c4810b3;hb=3175b881ccd14a39c4a206147cc99ecc80de3412;hp=a052fb4b04b853532011432c7b1c56efca4da7dc;hpb=d514caf49faff9295d0e497d3b6b8856fe83f8d0;p=bluesky.git diff --git a/bluesky/inode.c b/bluesky/inode.c index a052fb4..a568ae0 100644 --- a/bluesky/inode.c +++ b/bluesky/inode.c @@ -232,13 +232,13 @@ void bluesky_inode_start_sync(BlueSkyInode *inode, BlueSkyStoreAsync *barrier) { BlueSkyFS *fs = inode->fs; + if (inode->type == BLUESKY_REGULAR) + bluesky_file_flush(inode, barrier); + GString *buf = g_string_new(""); bluesky_serialize_inode(buf, inode); BlueSkyRCStr *data = bluesky_string_new_from_gstring(buf); - if (inode->type == BLUESKY_REGULAR) - bluesky_file_flush(inode, barrier); - char key[64]; sprintf(key, "inode-%016"PRIx64, inode->inum); @@ -252,6 +252,23 @@ void bluesky_inode_start_sync(BlueSkyInode *inode, BlueSkyStoreAsync *barrier) bluesky_store_async_unref(async); } +/* Write back an inode and all associated data and wait for completion. Inode + * should already be locked. */ +void bluesky_inode_do_sync(BlueSkyInode *inode) +{ + BlueSkyStoreAsync *barrier = bluesky_store_async_new(inode->fs->store); + barrier->op = STORE_OP_BARRIER; + + g_log("bluesky/inode", G_LOG_LEVEL_DEBUG, + "Synchronous writeback for inode %"PRIu64"...", inode->inum); + bluesky_inode_start_sync(inode, barrier); + bluesky_store_async_submit(barrier); + bluesky_store_async_wait(barrier); + bluesky_store_async_unref(barrier); + g_log("bluesky/inode", G_LOG_LEVEL_DEBUG, + "Writeback for inode %"PRIu64" complete", inode->inum); +} + /* Fetch an inode from stable storage. */ void bluesky_inode_fetch(BlueSkyFS *fs, uint64_t inum) {