X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=inode.c;fp=inode.c;h=df3883b180161d4bf1ea450af8a1733e5f095885;hb=823820015089dd6185fd2f2b192576b5b7b2eaab;hp=b1071a63cbd6b5b4222916ad2babf27bb67b2fc4;hpb=3ebe1efb5570c4a678774ebdf33b36be6dc49bbc;p=bluesky.git diff --git a/inode.c b/inode.c index b1071a6..df3883b 100644 --- a/inode.c +++ b/inode.c @@ -300,9 +300,8 @@ void bluesky_file_read(BlueSkyInode *inode, uint64_t offset, memset(buf, 0, bytes); break; case BLUESKY_BLOCK_REF: - /* TODO: Pull in data first */ - memset(buf, 0, bytes); - break; + bluesky_block_fetch(inode->fs, b); + /* Fall through */ case BLUESKY_BLOCK_CACHED: case BLUESKY_BLOCK_DIRTY: memcpy(buf, &b->data[block_offset], bytes); @@ -315,6 +314,22 @@ void bluesky_file_read(BlueSkyInode *inode, uint64_t offset, } } +/* Read the given block from cloud-backed storage if the data is not already + * cached. */ +void bluesky_block_fetch(BlueSkyFS *fs, BlueSkyBlock *block) +{ + if (block->type != BLUESKY_BLOCK_REF) + return; + + g_print("Fetching block from %s\n", block->ref); + BlueSkyRCStr *string = s3store_get(fs->store, block->ref); + + g_free(block->data); + block->data = g_memdup(string->data, BLUESKY_BLOCK_SIZE); + block->type = BLUESKY_BLOCK_CACHED; + bluesky_string_unref(string); +} + /* Write the given block to cloud-backed storage and mark it clean. */ void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block) { @@ -333,7 +348,11 @@ void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block) s3store_put(fs->store, name, data); g_free(block->ref); block->ref = g_strdup(name); - block->type = BLUESKY_BLOCK_CACHED; + + /* block->type = BLUESKY_BLOCK_CACHED; */ + g_free(block->data); + block->data = NULL; + block->type = BLUESKY_BLOCK_REF; g_checksum_free(csum); bluesky_string_unref(data);