RB_INSERT(ext4_buf_lru, &bc->lru_root, buf);
/* This buffer is ready to be flushed. */
if (ext4_bcache_test_flag(buf, BC_DIRTY)) {
- if (bc->bdev->cache_write_back)
+ if (bc->bdev->cache_write_back &&
+ !ext4_bcache_test_flag(buf, BC_FLUSH))
ext4_bcache_insert_dirty_node(bc, buf);
- else
+ else {
ext4_block_flush_buf(bc->bdev, buf);
+ ext4_bcache_clear_flag(buf, BC_FLUSH);
+ }
}
/* The buffer is invalidated...drop it. */
SLIST_HEAD(ext4_buf_dirty, ext4_buf) dirty_list;
};
+/**@brief buffer state bits
+ *
+ * - BC♡UPTODATE: Buffer contains valid data.
+ * - BC_DIRTY: Buffer is dirty.
+ * - BC_FLUSH: Buffer will be immediately flushed,
+ * when no one references it.
+ */
enum bcache_state_bits {
BC_UPTODATE,
- BC_DIRTY
+ BC_DIRTY,
+ BC_FLUSH
};
#define ext4_bcache_set_flag(buf, b) \