aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Garzik <jeff@garzik.org>2006-11-07 14:20:32 -0500
committerJeff Garzik <jeff@garzik.org>2006-11-07 14:20:32 -0500
commit45d311134a0231714e6c5afa312c1ec874de1ace (patch)
treea90b4270f483e9629de7d7428a06b16e7936716f
parent6919db714e750f48cbb15d4fe9053de9ff553e44 (diff)
downloaddbfs-45d311134a0231714e6c5afa312c1ec874de1ace.tar.gz
Delete data associated with inode, when we delete the inode.
-rw-r--r--dbfs-backend.c37
1 files changed, 26 insertions, 11 deletions
diff --git a/dbfs-backend.c b/dbfs-backend.c
index fa054a9..311ac46 100644
--- a/dbfs-backend.c
+++ b/dbfs-backend.c
@@ -42,6 +42,8 @@ struct dbfs_dirscan_info {
void *end_ent;
};
+static int dbfs_data_unref(DB_TXN *txn, dbfs_blk_id_t *id);
+
int dbmeta_del(DB_TXN *txn, const char *key_str)
{
DBT key;
@@ -79,33 +81,38 @@ static int dbfs_mode_type(guint32 mode, enum dbfs_inode_type *itype)
return 0;
}
+static int dbfs_inode_del_data(DB_TXN *txn, struct dbfs_inode *ino)
+{
+ int i, rc = 0;
+
+ for (i = 0; i < ino->n_extents; i++) {
+ rc = dbfs_data_unref(txn, &ino->raw_inode->blocks[i].id);
+ if (rc)
+ return rc;
+ }
+
+ return 0;
+}
+
int dbfs_inode_del(DB_TXN *txn, struct dbfs_inode *ino)
{
guint64 ino_n = GUINT64_FROM_LE(ino->raw_inode->ino);
char key[32];
- int rc, rrc;
-
- sprintf(key, "/inode/%Lu", (unsigned long long) ino_n);
-
- rrc = dbmeta_del(txn, key);
+ int rc = 0;
switch (ino->type) {
case IT_REG:
- /* FIXME! */
+ rc = dbfs_inode_del_data(txn, ino);
break;
case IT_DIR:
sprintf(key, "/dir/%Lu", (unsigned long long) ino_n);
rc = dbmeta_del(txn, key);
- if (rc && !rrc)
- rrc = rc;
break;
case IT_SYMLINK:
sprintf(key, "/symlink/%Lu", (unsigned long long) ino_n);
rc = dbmeta_del(txn, key);
- if (rc && !rrc)
- rrc = rc;
break;
case IT_DEV:
@@ -115,7 +122,15 @@ int dbfs_inode_del(DB_TXN *txn, struct dbfs_inode *ino)
break;
}
- return rrc;
+ if (rc)
+ goto out;
+
+ sprintf(key, "/inode/%Lu", (unsigned long long) ino_n);
+
+ rc = dbmeta_del(txn, key);
+
+out:
+ return rc;
}
int dbfs_inode_read(DB_TXN *txn, guint64 ino_n, struct dbfs_inode **ino_out)