* committed to stable storage. */
uint64_t change_count, change_commit;
+ /* Timestamp for controlling when modified data is flushed to stable
+ * storage. When an inode is first modified from a clean state, this is
+ * set to the current time. If the inode is clean, it is set to zero. */
+ int64_t change_time;
+
int64_t atime; /* Microseconds since the Unix epoch */
int64_t ctime;
int64_t mtime;
void bluesky_block_touch(BlueSkyInode *inode, uint64_t i);
void bluesky_block_fetch(BlueSkyFS *fs, BlueSkyBlock *block);
void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block);
+void bluesky_file_flush(BlueSkyInode *inode);
void bluesky_file_truncate(BlueSkyInode *inode, uint64_t size);
void bluesky_file_write(BlueSkyInode *inode, uint64_t offset,
const char *data, gint len);
g_checksum_free(csum);
//bluesky_string_unref(data);
}
+
+/* Flush all blocks in a file to stable storage. */
+void bluesky_file_flush(BlueSkyInode *inode)
+{
+ 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);
+ }
+}
inode->ctime = now;
if (update_mtime)
inode->mtime = now;
+
+ if (inode->change_time == 0)
+ inode->change_time = now;
}
/* Unfortunately a glib hash table is only guaranteed to be able to store