aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2006-04-24 03:33:50 -0400
committerJeff Garzik <jeff@garzik.org>2006-04-24 03:33:50 -0400
commit1d95e3a8359c0153a0e86d9b975caec220fb4cda (patch)
tree05228b30f4a20b84377751de3ce25a52a00601d4
parentbd50854ee458d9015a825028777d215afe33f073 (diff)
downloaddbfs-1d95e3a8359c0153a0e86d9b975caec220fb4cda.tar.gz
dbfs: Finish implementing unlink, new stubs inode_write and inode_del
-rw-r--r--dbfs-backend.c46
-rw-r--r--dbfs.c8
-rw-r--r--dbfs.h6
3 files changed, 43 insertions, 17 deletions
diff --git a/dbfs-backend.c b/dbfs-backend.c
index eb102f4..ec2e1ee 100644
--- a/dbfs-backend.c
+++ b/dbfs-backend.c
@@ -36,7 +36,19 @@ void dbfs_dummy1(void)
(void) db_data;
}
-int dbfs_read_inode(guint64 ino_n, struct dbfs_inode **ino_out)
+static int dbfs_inode_del(guint64 ino_n)
+{
+ /* FIXME */
+ return -EIO;
+}
+
+static int dbfs_inode_write(struct dbfs_inode *ino)
+{
+ /* FIXME */
+ return -EIO;
+}
+
+int dbfs_inode_read(guint64 ino_n, struct dbfs_inode **ino_out)
{
int rc;
DBT key, val;
@@ -264,29 +276,41 @@ static int dbfs_dirent_del(guint64 parent, const char *name)
return rc;
}
-int dbfs_unlink(guint64 parent, const char *name)
+int dbfs_unlink(guint64 parent, const char *name, unsigned long flags)
{
struct dbfs_inode *ino;
guint64 ino_n;
- int rc;
+ int rc, is_dir;
rc = dbfs_lookup(parent, name, &ino_n);
if (rc)
- goto err_out;
+ goto out;
- rc = dbfs_read_inode(ino_n, &ino);
+ rc = dbfs_inode_read(ino_n, &ino);
if (rc)
- goto err_out;
+ goto out;
+
+ is_dir = S_ISDIR(ino->raw_inode.mode);
+ if (is_dir && (!(flags & DBFS_UNLINK_DIR))) {
+ rc = -EISDIR;
+ goto out_ino;
+ }
rc = dbfs_dirent_del(parent, name);
+ if (rc)
+ goto out_ino;
- /* FIXME stopped working here...
+ ino->raw_inode.nlink--;
- * decrement n_links
- * if n_links==0, delete inode
- */
+ if ((is_dir && (ino->raw_inode.nlink < 2)) ||
+ (!is_dir && (ino->raw_inode.nlink < 1)))
+ rc = dbfs_inode_del(ino_n);
+ else
+ rc = dbfs_inode_write(ino);
-err_out:
+out_ino:
+ g_free(ino);
+out:
return rc;
}
diff --git a/dbfs.c b/dbfs.c
index 70f2e83..46ed3bf 100644
--- a/dbfs.c
+++ b/dbfs.c
@@ -20,7 +20,7 @@ static void dbfs_op_getattr(fuse_req_t req, fuse_ino_t ino_n,
struct stat st;
int rc;
- rc = dbfs_read_inode(ino_n, &ino);
+ rc = dbfs_inode_read(ino_n, &ino);
if (rc) {
fuse_reply_err(req, ENOENT);
return;
@@ -173,7 +173,7 @@ static int dbfs_chk_empty(struct dbfs_dirent *de, void *userdata)
static void dbfs_op_unlink(fuse_req_t req, fuse_ino_t parent, const char *name)
{
- int rc = dbfs_unlink(parent, name);
+ int rc = dbfs_unlink(parent, name, 0);
if (rc)
fuse_reply_err(req, rc);
}
@@ -189,7 +189,7 @@ static void dbfs_op_rmdir(fuse_req_t req, fuse_ino_t parent, const char *name)
if (rc)
goto err_out;
- rc = dbfs_read_inode(ino_n, &ino);
+ rc = dbfs_inode_read(ino_n, &ino);
if (rc)
goto err_out;
if (!S_ISDIR(ino->raw_inode.mode)) {
@@ -207,7 +207,7 @@ static void dbfs_op_rmdir(fuse_req_t req, fuse_ino_t parent, const char *name)
if (rc)
goto err_out_free;
- rc = dbfs_unlink(parent, name);
+ rc = dbfs_unlink(parent, name, DBFS_UNLINK_DIR);
if (rc)
goto err_out_free;
diff --git a/dbfs.h b/dbfs.h
index a34ccd2..60d7926 100644
--- a/dbfs.h
+++ b/dbfs.h
@@ -3,6 +3,8 @@
enum {
DBFS_BLK_ID_LEN = 20,
+
+ DBFS_UNLINK_DIR = (1 << 0),
};
enum {
@@ -49,11 +51,11 @@ struct dbfs_inode {
typedef int (*dbfs_dir_actor_t) (struct dbfs_dirent *, void *);
-extern int dbfs_read_inode(guint64 ino_n, struct dbfs_inode **ino_out);
+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_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);
+extern int dbfs_unlink(guint64 parent, const char *name, unsigned long flags);
#endif /* __DBFS_H__ */