Take out the merge-during-search-on-delete code, it is buggy.
authorChris Mason <chris.mason@oracle.com>
Wed, 28 Feb 2007 14:27:02 +0000 (09:27 -0500)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Wed, 28 Feb 2007 14:27:02 +0000 (09:27 -0500)
TODO [new file with mode: 0644]
ctree.c

diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..5c4395c
--- /dev/null
+++ b/TODO
@@ -0,0 +1,25 @@
+* cleanup, add more error checking, get rid of BUG_ONs
+* Make IO functions look more like the page cache
+* Fix ENOSPC handling
+* make blocksize a mkfs parameter instead of #define
+* make a real mkfs and superblock
+* Add shadowing and transactions
+* Do checksumming
+* Define FS objects in terms of different item types
+* Add block mapping tree (simple dm layer)
+* Add simple tree locking (semaphore per tree)
+* Make allocator smarter
+* Port into the kernel
+* Add virtual filesystems, mountable snapshots
+* Get rid of struct ctree_path, limiting tree levels held at one time
+* Release
+* Do real tree locking
+* Add extent mirroring (backup copies of blocks)
+* Add fancy interface to get access to incremental backups
+* Add fancy striped extents to make big reads faster
+* Use relocation to try and fix write errors
+* Make allocator much smarter
+* xattrs (directory streams for regular files)
+* fsck
+* Scrub & defrag
+
diff --git a/ctree.c b/ctree.c
index 25dc7b2..0aea942 100644 (file)
--- a/ctree.c
+++ b/ctree.c
@@ -167,29 +167,6 @@ int search_slot(struct ctree_root *root, struct key *key,
                                b = p->nodes[level];
                                c = &b->node;
                                slot = p->slots[level];
-                       } else if (ins_len < 0 &&
-                                  c->header.nritems <= NODEPTRS_PER_BLOCK/4) {
-                               u64 blocknr = b->blocknr;
-                               slot = p->slots[level +1];
-                               b->count++;
-                               if (push_node_left(root, p, level))
-                                       push_node_right(root, p, level);
-                               if (c->header.nritems == 0 &&
-                                   level < MAX_LEVEL - 1 &&
-                                   p->nodes[level + 1]) {
-                                       int tslot = p->slots[level + 1];
-
-                                       p->slots[level + 1] = slot;
-                                       del_ptr(root, p, level + 1);
-                                       p->slots[level + 1] = tslot;
-                                       tree_block_release(root, b);
-                                       free_extent(root, blocknr, 1);
-                               } else {
-                                       tree_block_release(root, b);
-                               }
-                               b = p->nodes[level];
-                               c = &b->node;
-                               slot = p->slots[level];
                        }
                        b = read_tree_block(root, c->blockptrs[slot]);
                        continue;
@@ -618,7 +595,6 @@ int push_leaf_right(struct ctree_root *root, struct ctree_path *path,
                &right->items[0].key, sizeof(struct key));
        write_tree_block(root, upper);
        /* then fixup the leaf pointer in the path */
-       // FIXME use nritems in here somehow
        if (path->slots[0] >= left->header.nritems) {
                path->slots[0] -= left->header.nritems;
                tree_block_release(root, path->nodes[0]);
@@ -847,8 +823,6 @@ int insert_item(struct ctree_root *root, struct key *key,
 
        slot = path.slots[0];
        BUG_ON(slot < 0);
-       if (slot == 0)
-               fixup_low_keys(root, &path, key, 1);
        if (slot != nritems) {
                int i;
                unsigned int old_data = leaf->items[slot].offset +
@@ -877,6 +851,8 @@ int insert_item(struct ctree_root *root, struct key *key,
        memcpy(leaf->data + data_end - data_size, data, data_size);
        leaf->header.nritems += 1;
        write_tree_block(root, leaf_buf);
+       if (slot == 0)
+               fixup_low_keys(root, &path, key, 1);
        if (leaf_free_space(leaf) < 0)
                BUG();
        release_path(root, &path);
@@ -914,13 +890,23 @@ int del_ptr(struct ctree_root *root, struct ctree_path *path, int level)
                                sizeof(u64) * (nritems - slot - 1));
                }
                node->header.nritems--;
-               write_tree_block(root, t);
                blocknr = t->blocknr;
+               write_tree_block(root, t);
                if (node->header.nritems != 0) {
+                       int tslot;
                        if (slot == 0)
                                fixup_low_keys(root, path, node->keys,
                                               level + 1);
-                       break;
+                       tslot = path->slots[level + 1];
+                       t->count++;
+                       if (push_node_left(root, path, level))
+                               push_node_right(root, path, level);
+                       path->slots[level + 1] = tslot;
+                       if (node->header.nritems != 0) {
+                               tree_block_release(root, t);
+                               break;
+                       }
+                       tree_block_release(root, t);
                }
                if (t == root->node) {
                        /* just turn the root into a leaf and break */