diff options
author | Jeff Garzik <jeff@garzik.org> | 2006-04-24 03:33:50 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-04-24 03:33:50 -0400 |
commit | 1d95e3a8359c0153a0e86d9b975caec220fb4cda (patch) | |
tree | 05228b30f4a20b84377751de3ce25a52a00601d4 | |
parent | bd50854ee458d9015a825028777d215afe33f073 (diff) | |
download | dbfs-1d95e3a8359c0153a0e86d9b975caec220fb4cda.tar.gz |
dbfs: Finish implementing unlink, new stubs inode_write and inode_del
-rw-r--r-- | dbfs-backend.c | 46 | ||||
-rw-r--r-- | dbfs.c | 8 | ||||
-rw-r--r-- | dbfs.h | 6 |
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; } @@ -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; @@ -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__ */ |