diff options
author | Jeff Garzik <jeff@garzik.org> | 2006-08-05 00:54:38 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-08-05 00:54:38 -0400 |
commit | a63080c9b5c4992ebab78b3e5bdca37d61b49e4a (patch) | |
tree | 0dc789ba0b534d56b1dc13b9a2708f76fa5481ea | |
parent | 7d79d20f76b28c4778fab919cf0005b692b41225 (diff) | |
download | dbfs-a63080c9b5c4992ebab78b3e5bdca37d61b49e4a.tar.gz |
Open new 'data' database. Fix bug by avoiding FUSE 'userdata' pointer,
preferring global variables instead.
-rw-r--r-- | dbfs.c | 8 | ||||
-rw-r--r-- | dbfs.h | 12 | ||||
-rw-r--r-- | dbfsck.c | 2 | ||||
-rw-r--r-- | libdbfs.c | 68 | ||||
-rw-r--r-- | mkdbfs.c | 3 |
5 files changed, 61 insertions, 32 deletions
@@ -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) @@ -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; }; @@ -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"); @@ -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: @@ -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"); |