diff options
author | Jeff Garzik <jeff@garzik.org> | 2006-04-24 19:09:04 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-04-24 19:09:04 -0400 |
commit | 1d897ec1409f8e4fff6db1261208f608cd45eddb (patch) | |
tree | 8e61e6caec45ab60cd17e312275d9c6ec4e35e7b | |
parent | 4c30e215d9a5e18aa013fb2ffcac50ebc9eb6a7d (diff) | |
download | dbfs-1d897ec1409f8e4fff6db1261208f608cd45eddb.tar.gz |
dbfs: implement mknod, mkdir ops. stub dbfs_mknod. a bunch of func renames.
-rw-r--r-- | dbfs-backend.c | 48 | ||||
-rw-r--r-- | dbfs.c | 47 | ||||
-rw-r--r-- | dbfs.h | 9 |
3 files changed, 74 insertions, 30 deletions
diff --git a/dbfs-backend.c b/dbfs-backend.c index 3d0f579..c5db978 100644 --- a/dbfs-backend.c +++ b/dbfs-backend.c @@ -274,7 +274,7 @@ int dbfs_inode_read(guint64 ino_n, struct dbfs_inode **ino_out) return 0; } -int dbfs_read_dir(guint64 ino, DBT *val) +int dbfs_symlink_read(guint64 ino, DBT *val) { DBT key; char key_str[32]; @@ -283,7 +283,7 @@ int dbfs_read_dir(guint64 ino, DBT *val) memset(&key, 0, sizeof(key)); memset(val, 0, sizeof(*val)); - sprintf(key_str, "/dir/%Lu", (unsigned long long) ino); + sprintf(key_str, "/symlink/%Lu", (unsigned long long) ino); key.data = key_str; key.size = strlen(key_str); @@ -292,45 +292,45 @@ int dbfs_read_dir(guint64 ino, DBT *val) rc = db_meta->get(db_meta, NULL, &key, val, 0); if (rc == DB_NOTFOUND) - return -ENOTDIR; + return -EINVAL; return rc ? -EIO : 0; } -static int dbfs_write_dir(guint64 ino, DBT *val) +int dbfs_dir_read(guint64 ino, DBT *val) { DBT key; char key_str[32]; + int rc; memset(&key, 0, sizeof(key)); + memset(val, 0, sizeof(*val)); sprintf(key_str, "/dir/%Lu", (unsigned long long) ino); key.data = key_str; key.size = strlen(key_str); - return db_meta->put(db_meta, NULL, &key, val, 0) ? -EIO : 0; + val->flags = DB_DBT_MALLOC; + + rc = db_meta->get(db_meta, NULL, &key, val, 0); + if (rc == DB_NOTFOUND) + return -ENOTDIR; + return rc ? -EIO : 0; } -int dbfs_read_link(guint64 ino, DBT *val) +static int dbfs_dir_write(guint64 ino, DBT *val) { DBT key; char key_str[32]; - int rc; memset(&key, 0, sizeof(key)); - memset(val, 0, sizeof(*val)); - sprintf(key_str, "/symlink/%Lu", (unsigned long long) ino); + sprintf(key_str, "/dir/%Lu", (unsigned long long) ino); key.data = key_str; key.size = strlen(key_str); - val->flags = DB_DBT_MALLOC; - - rc = db_meta->get(db_meta, NULL, &key, val, 0); - if (rc == DB_NOTFOUND) - return -EINVAL; - return rc ? -EIO : 0; + return db_meta->put(db_meta, NULL, &key, val, 0) ? -EIO : 0; } int dbfs_dir_foreach(void *dir, dbfs_dir_actor_t func, void *userdata) @@ -382,7 +382,7 @@ static int dbfs_dir_scan1(struct dbfs_dirent *de, void *userdata) return 0; } -int dbfs_lookup(guint64 parent, const char *name, guint64 *ino) +int dbfs_dir_lookup(guint64 parent, const char *name, guint64 *ino) { struct dbfs_dirscan_info di; struct dbfs_dirent *de; @@ -392,7 +392,7 @@ int dbfs_lookup(guint64 parent, const char *name, guint64 *ino) *ino = 0; /* read directory from database */ - rc = dbfs_read_dir(parent, &val); + rc = dbfs_dir_read(parent, &val); if (rc) return rc; @@ -424,7 +424,7 @@ static int dbfs_dirent_del(guint64 parent, const char *name) DBT dir_val; int rc, del_len, tail_len; - rc = dbfs_read_dir(parent, &dir_val); + rc = dbfs_dir_read(parent, &dir_val); if (rc) return rc; @@ -445,7 +445,7 @@ static int dbfs_dirent_del(guint64 parent, const char *name) memmove(ui.start_ent, ui.end_ent, tail_len); dir_val.size -= del_len; - rc = dbfs_write_dir(parent, &dir_val); + rc = dbfs_dir_write(parent, &dir_val); free(dir_val.data); @@ -459,7 +459,7 @@ int dbfs_unlink(guint64 parent, const char *name, unsigned long flags) int rc, is_dir; guint32 nlink; - rc = dbfs_lookup(parent, name, &ino_n); + rc = dbfs_dir_lookup(parent, name, &ino_n); if (rc) goto out; @@ -500,3 +500,11 @@ out: return rc; } +int dbfs_mknod(guint64 parent, const char *name, guint32 mode, guint64 rdev, + struct dbfs_inode **ino) +{ + /* FIXME */ + *ino = NULL; + return -EIO; +} + @@ -20,7 +20,7 @@ static void dbfs_op_lookup(fuse_req_t req, fuse_ino_t parent, const char *name) int rc; /* lookup inode in parent directory */ - rc = dbfs_lookup(parent, name, &ino); + rc = dbfs_dir_lookup(parent, name, &ino); if (rc) { fuse_reply_err(req, rc); return; @@ -81,7 +81,7 @@ static void dbfs_op_readlink(fuse_req_t req, fuse_ino_t ino) char *s; /* read link from database */ - rc = dbfs_read_link(ino, &val); + rc = dbfs_symlink_read(ino, &val); if (rc) { fuse_reply_err(req, rc); return; @@ -95,6 +95,39 @@ static void dbfs_op_readlink(fuse_req_t req, fuse_ino_t ino) free(val.data); } +static void dbfs_op_mknod(fuse_req_t req, fuse_ino_t parent, const char *name, + mode_t mode, dev_t rdev) +{ + struct fuse_entry_param ent; + struct dbfs_inode *ino; + int rc; + + rc = dbfs_mknod(parent, name, mode, rdev, &ino); + if (rc) { + fuse_reply_err(req, rc); + return; + } + + memset(&ent, 0, sizeof(ent)); + ent.ino = GUINT64_FROM_LE(ino->raw_inode->ino); + ent.generation = GUINT64_FROM_LE(ino->raw_inode->version); + ent.attr_timeout = 2.0; + ent.entry_timeout = 2.0; + + fuse_reply_entry(req, &ent); + + dbfs_inode_free(ino); +} + +static void dbfs_op_mkdir(fuse_req_t req, fuse_ino_t parent, const char *name, + mode_t mode) +{ + mode &= (S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX); + mode |= S_IFDIR; + + return dbfs_op_mknod(req, parent, name, mode, 0); +} + static void dbfs_op_unlink(fuse_req_t req, fuse_ino_t parent, const char *name) { int rc = dbfs_unlink(parent, name, 0); @@ -118,12 +151,12 @@ static void dbfs_op_rmdir(fuse_req_t req, fuse_ino_t parent, const char *name) DBT val; /* get inode number associated with name */ - rc = dbfs_lookup(parent, name, &ino_n); + rc = dbfs_dir_lookup(parent, name, &ino_n); if (rc) goto err_out; /* read dir associated with name */ - rc = dbfs_read_dir(ino_n, &val); + rc = dbfs_dir_read(ino_n, &val); if (rc) goto err_out; @@ -153,7 +186,7 @@ static void dbfs_op_opendir(fuse_req_t req, fuse_ino_t ino, int rc; /* read directory from database */ - rc = dbfs_read_dir(ino, &val); + rc = dbfs_dir_read(ino, &val); if (rc) { fuse_reply_err(req, rc); return; @@ -269,8 +302,8 @@ static struct fuse_lowlevel_ops dbfs_ops = { .getattr = dbfs_op_getattr, .setattr = NULL, .readlink = dbfs_op_readlink, - .mknod = NULL, - .mkdir = NULL, + .mknod = dbfs_op_mknod, + .mkdir = dbfs_op_mkdir, .unlink = dbfs_op_unlink, .rmdir = dbfs_op_rmdir, .symlink = NULL, @@ -65,13 +65,16 @@ struct dbfs_inode { typedef int (*dbfs_dir_actor_t) (struct dbfs_dirent *, void *); extern int dbfs_inode_read(guint64 ino_n, struct dbfs_inode **ino_out); -extern int dbfs_read_dir(guint64 ino, DBT *val); -extern int dbfs_read_link(guint64 ino, DBT *val); +extern int dbfs_dir_read(guint64 ino, DBT *val); +extern int dbfs_symlink_read(guint64 ino, DBT *val); 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_dir_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 void dbfs_init(void *userdata); extern void dbfs_exit(void *userdata); +extern int dbfs_mknod(guint64 parent, const char *name, + guint32 mode, guint64 rdev, + struct dbfs_inode **ino); #endif /* __DBFS_H__ */ |