Btrfs: snapshot progress
[linux-2.6-block.git] / fs / btrfs / root-tree.c
index ddc1c13a53521c6fc51db692a6c8b1ac9c8dd656..72be9836932f3948e621857c6fda1538d010b2a2 100644 (file)
@@ -83,6 +83,8 @@ int btrfs_del_root(struct btrfs_trans_handle *trans, struct btrfs_root *root,
 {
        struct btrfs_path *path;
        int ret;
+       u32 refs;
+       struct btrfs_root_item *ri;
 
        path = btrfs_alloc_path();
        BUG_ON(!path);
@@ -91,7 +93,19 @@ int btrfs_del_root(struct btrfs_trans_handle *trans, struct btrfs_root *root,
        if (ret < 0)
                goto out;
        BUG_ON(ret != 0);
-       ret = btrfs_del_item(trans, root, path);
+       ri = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]),
+                           path->slots[0], struct btrfs_root_item);
+
+       refs = btrfs_root_refs(ri);
+       BUG_ON(refs == 0);
+       if (refs == 1) {
+               ret = btrfs_del_item(trans, root, path);
+printk("deleting root %Lu %Lu %u\n", key->objectid, key->offset, key->flags);
+       } else {
+               btrfs_set_root_refs(ri, refs - 1);
+printk("ref now %u root %Lu %Lu %u\n", refs -1, key->objectid, key->offset, key->flags);
+               mark_buffer_dirty(path->nodes[0]);
+       }
 out:
        btrfs_release_path(root, path);
        btrfs_free_path(path);