+ g_mutex_unlock(fs->lock);
+}
+
+/* Drop cached data for a given inode, if it is clean. inode must be locked. */
+static void drop_caches(BlueSkyInode *inode)
+{
+ if (inode->type == BLUESKY_REGULAR)
+ bluesky_file_drop_cached(inode);
+}
+
+/* Drop clean data from the cache if needed due to memory pressure. */
+static void flushd_clean(BlueSkyFS *fs)
+{
+ g_mutex_lock(fs->lock);
+
+ size_t inode_count = g_hash_table_size(fs->inodes);
+ if (!inode_count)
+ inode_count = 1;
+
+ while (inode_count-- > 0) {
+#if 0
+ if (g_atomic_int_get(&fs->cache_total) < bluesky_watermark_medium_total)
+ break;
+#endif
+
+ BlueSkyInode *inode;
+ if (fs->accessed_list.prev == NULL)
+ break;
+ inode = fs->accessed_list.prev->data;
+
+ if (bluesky_verbose) {
+ g_log("bluesky/flushd", G_LOG_LEVEL_DEBUG,
+ "Considering dropping cached data for inode %"PRIu64,
+ inode->inum);
+ }
+
+ bluesky_inode_ref(inode);
+
+ g_mutex_unlock(fs->lock);
+
+ g_mutex_lock(inode->lock);
+
+ g_mutex_lock(fs->lock);
+ bluesky_list_unlink(&fs->accessed_list, inode->accessed_list);
+ inode->accessed_list = bluesky_list_prepend(&fs->accessed_list, inode);
+ g_mutex_unlock(fs->lock);
+
+ drop_caches(inode);
+