aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2006-04-24 19:09:04 -0400
committerJeff Garzik <jeff@garzik.org>2006-04-24 19:09:04 -0400
commit1d897ec1409f8e4fff6db1261208f608cd45eddb (patch)
tree8e61e6caec45ab60cd17e312275d9c6ec4e35e7b
parent4c30e215d9a5e18aa013fb2ffcac50ebc9eb6a7d (diff)
downloaddbfs-1d897ec1409f8e4fff6db1261208f608cd45eddb.tar.gz
dbfs: implement mknod, mkdir ops. stub dbfs_mknod. a bunch of func renames.
-rw-r--r--dbfs-backend.c48
-rw-r--r--dbfs.c47
-rw-r--r--dbfs.h9
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;
+}
+
diff --git a/dbfs.c b/dbfs.c
index d77f35d..292dec2 100644
--- a/dbfs.c
+++ b/dbfs.c
@@ -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,
diff --git a/dbfs.h b/dbfs.h
index 6ebae72..9f84cc6 100644
--- a/dbfs.h
+++ b/dbfs.h
@@ -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__ */