aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2006-08-05 00:54:38 -0400
committerJeff Garzik <jeff@garzik.org>2006-08-05 00:54:38 -0400
commita63080c9b5c4992ebab78b3e5bdca37d61b49e4a (patch)
tree0dc789ba0b534d56b1dc13b9a2708f76fa5481ea
parent7d79d20f76b28c4778fab919cf0005b692b41225 (diff)
downloaddbfs-a63080c9b5c4992ebab78b3e5bdca37d61b49e4a.tar.gz
Open new 'data' database. Fix bug by avoiding FUSE 'userdata' pointer,
preferring global variables instead.
-rw-r--r--dbfs.c8
-rw-r--r--dbfs.h12
-rw-r--r--dbfsck.c2
-rw-r--r--libdbfs.c68
-rw-r--r--mkdbfs.c3
5 files changed, 61 insertions, 32 deletions
diff --git a/dbfs.c b/dbfs.c
index 4009c55..19f4608 100644
--- a/dbfs.c
+++ b/dbfs.c
@@ -36,7 +36,6 @@ static void dbfs_reply_ino(fuse_req_t req, struct dbfs_inode *ino)
static void dbfs_op_init(void *userdata)
{
- struct dbfs **fs_io = userdata;
struct dbfs *fs;
int rc;
@@ -46,18 +45,17 @@ static void dbfs_op_init(void *userdata)
if (rc)
abort(); /* TODO: improve */
- *fs_io = fs;
+ gfs = fs;
}
static void dbfs_op_destroy(void *userdata)
{
- struct dbfs **fs_io = userdata;
- struct dbfs *fs = *fs_io;
+ struct dbfs *fs = gfs;
dbfs_close(fs);
dbfs_free(fs);
- *fs_io = NULL;
+ gfs = NULL;
}
static void dbfs_op_lookup(fuse_req_t req, fuse_ino_t parent, const char *name)
diff --git a/dbfs.h b/dbfs.h
index 72b3f65..7ae42b1 100644
--- a/dbfs.h
+++ b/dbfs.h
@@ -18,6 +18,17 @@ enum {
DBFS_XATTR_MAX_LEN = (1024 * 1024),
DBFS_XLIST_ALIGN = 8,
+
+ /* our data items are small, so use the smallest possible page
+ * size. This is a guess, and should be verified by looking at
+ * overflow pages and other DB statistics.
+ */
+ DBFS_PGSZ_METADATA = 512,
+
+ /* another guess. must take into account small data items
+ * as well as large ones
+ */
+ DBFS_PGSZ_DATA = 2048,
};
enum {
@@ -83,6 +94,7 @@ struct dbfs {
DB_ENV *env;
DB *meta;
+ DB *data;
guint64 next_inode;
};
diff --git a/dbfsck.c b/dbfsck.c
index 40350c8..7015814 100644
--- a/dbfsck.c
+++ b/dbfsck.c
@@ -9,6 +9,8 @@ int main (int argc, char *argv[])
fs = dbfs_new();
+ gfs = fs;
+
rc = dbfs_open(fs, DB_RECOVER_FATAL, DB_CREATE, "dbfsck");
if (rc) {
perror("dbfsck");
diff --git a/libdbfs.c b/libdbfs.c
index bcc74c3..2f4392a 100644
--- a/libdbfs.c
+++ b/libdbfs.c
@@ -9,6 +9,43 @@
struct dbfs *gfs;
+static int open_db(DB_ENV *env, DB **db_out, const char *name,
+ unsigned int page_size, unsigned int flags)
+{
+ int rc;
+ DB *db;
+
+ rc = db_create(db_out, env, 0);
+ if (rc) {
+ env->err(env, rc, "db_create");
+ return -EIO;
+ }
+
+ db = *db_out;
+
+ rc = db->open(db, NULL, name, NULL, DB_HASH,
+ DB_AUTO_COMMIT | flags, 0666);
+ if (rc) {
+ db->err(db, rc, "db->open");
+ return -EIO;
+ }
+
+ rc = db->set_pagesize(db, page_size);
+ if (rc) {
+ db->err(db, rc, "db->set_pagesize");
+ return -EIO;
+ }
+
+ /* fix everything as little endian */
+ rc = db->set_lorder(db, 1234);
+ if (rc) {
+ db->err(db, rc, "db->set_lorder");
+ return -EIO;
+ }
+
+ return 0;
+}
+
int dbfs_open(struct dbfs *fs, unsigned int env_flags, unsigned int flags, const char *errpfx)
{
const char *db_home, *db_password;
@@ -63,37 +100,14 @@ int dbfs_open(struct dbfs *fs, unsigned int env_flags, unsigned int flags, const
* Open metadata database
*/
- rc = db_create(&fs->meta, fs->env, 0);
- if (rc) {
- fs->env->err(fs->env, rc, "db_create");
- goto err_out;
- }
-
- rc = fs->meta->open(fs->meta, NULL, "metadata", NULL,
- DB_HASH, DB_AUTO_COMMIT | flags, 0666);
- if (rc) {
- fs->meta->err(fs->meta, rc, "fs->meta->open");
+ rc = open_db(fs->env, &fs->meta, "metadata", DBFS_PGSZ_METADATA, flags);
+ if (rc)
goto err_out_meta;
- }
- /* our data items are small, so use the smallest possible page
- * size. This is a guess, and should be verified by looking at
- * overflow pages and other DB statistics.
- */
- rc = fs->meta->set_pagesize(fs->meta, 512);
- if (rc) {
- fs->meta->err(fs->meta, rc, "fs->meta->set_pagesize");
- goto err_out_meta;
- }
-
- /* fix everything as little endian */
- rc = fs->meta->set_lorder(fs->meta, 1234);
- if (rc) {
- fs->meta->err(fs->meta, rc, "fs->meta->set_lorder");
+ rc = open_db(fs->env, &fs->data, "data", DBFS_PGSZ_DATA, flags);
+ if (rc)
goto err_out_meta;
- }
- gfs = fs;
return 0;
err_out_meta:
diff --git a/mkdbfs.c b/mkdbfs.c
index 300519f..f87fd19 100644
--- a/mkdbfs.c
+++ b/mkdbfs.c
@@ -50,6 +50,9 @@ err_die:
int main (int argc, char *argv[])
{
struct dbfs *fs = dbfs_new();
+
+ gfs = fs;
+
int rc = dbfs_open(fs, 0, DB_CREATE | DB_TRUNCATE, "mkdbfs");
if (rc) {
perror("mkdbfs");