Add proper per-file copyright notices/licenses and top-level license.
[bluesky.git] / bluesky / inode.c
index dd20cc9..0a6166b 100644 (file)
@@ -3,7 +3,29 @@
  * Copyright (C) 2009  The Regents of the University of California
  * Written by Michael Vrable <mvrable@cs.ucsd.edu>
  *
- * TODO: Licensing
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
 #include <stdio.h>
@@ -96,6 +118,8 @@ BlueSkyFS *bluesky_new_fs(gchar *name)
     fs->log_state = g_new0(BlueSkyCloudLogState, 1);
     fs->log_state->data = g_string_new("");
     fs->log_state->latest_cleaner_seq_seen = -1;
+    fs->log_state->uploads_pending_lock = g_mutex_new();
+    fs->log_state->uploads_pending_cond = g_cond_new();
 
     bluesky_cloudlog_threads_init(fs);
     fs->inode_fetch_thread_pool = g_thread_pool_new(inode_fetch_task, NULL,
@@ -132,7 +156,7 @@ BlueSkyFS *bluesky_init_fs(gchar *name, BlueSkyStore *store,
         bluesky_inode_do_sync(root);
     }
 
-    bluesky_cleaner_merge(fs);
+    bluesky_cleaner_thread_launch(fs);
 
     return fs;
 }
@@ -268,6 +292,30 @@ BlueSkyInode *bluesky_new_inode(uint64_t inum, BlueSkyFS *fs,
     return i;
 }
 
+/* Issue a prefetch hint for an inode.  This signals that the inode may be
+ * needed soon.  Does not return any useful data. */
+void bluesky_inode_prefetch(BlueSkyFS *fs, uint64_t inum)
+{
+    BlueSkyInode *inode = NULL;
+
+    g_mutex_lock(fs->lock);
+    inode = (BlueSkyInode *)g_hash_table_lookup(fs->inodes, &inum);
+
+    if (inode != NULL) {
+        /* Inode is already available, no need for any prefetching... */
+        g_mutex_unlock(fs->lock);
+        return;
+    }
+
+    InodeMapEntry *entry = bluesky_inode_map_lookup(fs->inode_map, inum, 0);
+    if (entry != NULL) {
+        bluesky_cloudlog_prefetch(entry->item);
+    }
+
+    g_mutex_unlock(fs->lock);
+    return;
+}
+
 /* Retrieve an inode from the filesystem.  Eventually this will be a cache and
  * so we might need to go fetch the inode from elsewhere; for now all
  * filesystem state is stored here.  inode is returned with a reference held