diff options
author | Jeff Garzik <jeff@garzik.org> | 2006-04-24 06:29:34 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-04-24 06:29:34 -0400 |
commit | 95e90ee71799bf2099be2906ff23a6503de57109 (patch) | |
tree | fb882ab486ba11a0e4432bf18dbebf4a8c7ef5a2 | |
parent | ec189c6a73fd6794c9297b8f4beefb0ae260e8bd (diff) | |
download | dbfs-95e90ee71799bf2099be2906ff23a6503de57109.tar.gz |
dbfs: Implement DB init, shutdown
-rw-r--r-- | dbfs-backend.c | 72 | ||||
-rw-r--r-- | dbfs.c | 27 | ||||
-rw-r--r-- | dbfs.h | 2 |
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); @@ -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; } @@ -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__ */ |