aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2006-04-24 06:29:34 -0400
committerJeff Garzik <jeff@garzik.org>2006-04-24 06:29:34 -0400
commit95e90ee71799bf2099be2906ff23a6503de57109 (patch)
treefb882ab486ba11a0e4432bf18dbebf4a8c7ef5a2
parentec189c6a73fd6794c9297b8f4beefb0ae260e8bd (diff)
downloaddbfs-95e90ee71799bf2099be2906ff23a6503de57109.tar.gz
dbfs: Implement DB init, shutdown
-rw-r--r--dbfs-backend.c72
-rw-r--r--dbfs.c27
-rw-r--r--dbfs.h2
3 files changed, 95 insertions, 6 deletions
diff --git a/dbfs-backend.c b/dbfs-backend.c
index aeffa16..506fec7 100644
--- a/dbfs-backend.c
+++ b/dbfs-backend.c
@@ -26,14 +26,74 @@ struct dbfs_unlink_info {
void *end_ent;
};
-static DB_ENV *env;
-static DB *db_data;
+static DB_ENV *db_env;
static DB *db_meta;
-void dbfs_dummy1(void)
+int init_db(void)
{
- (void) env;
- (void) db_data;
+ const char *db_home;
+ int rc;
+
+ /*
+ * open DB environment
+ */
+
+ db_home = getenv("DB_HOME");
+ if (!db_home) {
+ fprintf(stderr, "DB_HOME not set\n");
+ return 1;
+ }
+
+ rc = db_env_create(&db_env, 0);
+ if (rc) {
+ fprintf(stderr, "db_env_create failed: %d\n", rc);
+ return 1;
+ }
+
+ db_env->set_errfile(db_env, stderr);
+ db_env->set_errpfx(db_env, "dbfs");
+
+ rc = db_env->open(db_env, db_home,
+ DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL |
+ DB_INIT_TXN | DB_RECOVER | DB_CREATE, 0666);
+ if (rc) {
+ db_env->err(db_env, rc, "db_env->open");
+ return 1;
+ }
+
+ /*
+ * Open metadata database
+ */
+
+ rc = db_create(&db_meta, db_env, 0);
+ if (rc) {
+ db_env->err(db_env, rc, "db_create");
+ goto err_out;
+ }
+
+ rc = db_meta->open(db_meta, NULL, "metadata", NULL,
+ DB_HASH, DB_AUTO_COMMIT | DB_CREATE, 0666);
+ if (rc) {
+ db_meta->err(db_meta, rc, "db_meta->open");
+ goto err_out_meta;
+ }
+
+ return 0;
+
+err_out_meta:
+ db_meta->close(db_meta, 0);
+err_out:
+ db_env->close(db_env, 0);
+ return 1;
+}
+
+void exit_db(void)
+{
+ db_meta->close(db_meta, 0);
+ db_env->close(db_env, 0);
+
+ db_env = NULL;
+ db_meta = NULL;
}
void dbfs_inode_free(struct dbfs_inode *ino)
@@ -72,7 +132,7 @@ static int dbfs_inode_del(struct dbfs_inode *ino)
case IT_REG:
/* FIXME */
break;
-
+
case IT_DIR:
sprintf(key, "/dir/%Lu", (unsigned long long) ino_n);
rc = dbmeta_del(key);
diff --git a/dbfs.c b/dbfs.c
index 1758737..97dc59d 100644
--- a/dbfs.c
+++ b/dbfs.c
@@ -233,14 +233,37 @@ static void hello_ll_read(fuse_req_t req, fuse_ino_t ino, size_t size,
#endif
static struct fuse_lowlevel_ops dbfs_ops = {
+ .init = NULL,
+ .destroy = NULL,
.lookup = dbfs_op_lookup,
+ .forget = NULL,
.getattr = dbfs_op_getattr,
+ .setattr = NULL,
.readlink = dbfs_op_readlink,
+ .mknod = NULL,
+ .mkdir = NULL,
.unlink = dbfs_op_unlink,
.rmdir = dbfs_op_rmdir,
+ .symlink = NULL,
+ .rename = NULL,
+ .link = NULL,
+ .open = NULL,
+ .read = NULL,
+ .write = NULL,
+ .flush = NULL,
+ .release = NULL,
+ .fsync = NULL,
.opendir = dbfs_op_opendir,
.readdir = dbfs_op_readdir,
.releasedir = dbfs_op_releasedir,
+ .fsyncdir = NULL,
+ .statfs = NULL,
+ .setxattr = NULL,
+ .getxattr = NULL,
+ .listxattr = NULL,
+ .removexattr = NULL,
+ .access = NULL,
+ .create = NULL,
};
int main(int argc, char *argv[])
@@ -250,6 +273,8 @@ int main(int argc, char *argv[])
int err = -1;
int fd;
+ init_db();
+
if (fuse_parse_cmdline(&args, &mountpoint, NULL, NULL) != -1 &&
(fd = fuse_mount(mountpoint, &args)) != -1) {
struct fuse_session *se;
@@ -272,5 +297,7 @@ int main(int argc, char *argv[])
fuse_unmount(mountpoint);
fuse_opt_free_args(&args);
+ exit_db();
+
return err ? 1 : 0;
}
diff --git a/dbfs.h b/dbfs.h
index 030acb5..58edd50 100644
--- a/dbfs.h
+++ b/dbfs.h
@@ -71,5 +71,7 @@ extern int dbfs_dir_foreach(void *dir, dbfs_dir_actor_t func, void *userdata);
extern int dbfs_lookup(guint64 parent, const char *name, guint64 *ino);
extern int dbfs_unlink(guint64 parent, const char *name, unsigned long flags);
extern void dbfs_inode_free(struct dbfs_inode *ino);
+extern int init_db(void);
+extern void exit_db(void);
#endif /* __DBFS_H__ */