Btrfs: Add readahead to the online shrinker, and a mount -o alloc_start= for testing
authorChris Mason <chris.mason@oracle.com>
Wed, 2 Jan 2008 15:01:11 +0000 (10:01 -0500)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:03:58 +0000 (11:03 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ctree.c
fs/btrfs/ctree.h
fs/btrfs/extent-tree.c
fs/btrfs/inode.c
fs/btrfs/super.c

index 2b3ffa707eae36e4c4e4330d3cec728e562d2e5a..8fa92a2d9819714489d4ee70931d2d58bbecfa15 100644 (file)
@@ -2654,9 +2654,9 @@ int btrfs_del_item(struct btrfs_trans_handle *trans, struct btrfs_root *root,
  */
 int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path)
 {
+       u64 bytenr;
        int slot;
        int level = 1;
-       u64 bytenr;
        struct extent_buffer *c;
        struct extent_buffer *next = NULL;
 
@@ -2687,11 +2687,14 @@ int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path)
                level--;
                c = path->nodes[level];
                free_extent_buffer(c);
+               slot = btrfs_header_nritems(next);
+               if (slot != 0)
+                       slot--;
                path->nodes[level] = next;
-               path->slots[level] = 0;
+               path->slots[level] = slot;
                if (!level)
                        break;
-               next = read_tree_block(root, btrfs_node_blockptr(next, 0),
+               next = read_tree_block(root, btrfs_node_blockptr(next, slot),
                                       btrfs_level_size(root, level - 1));
        }
        return 0;
index b83a1bec346f34cdb2465fdc921a1d0614843d71..d6e5c19969b0fbd7713a15f5b9417fd8e037273d 100644 (file)
@@ -324,6 +324,7 @@ struct btrfs_fs_info {
        u64 last_trans_committed;
        unsigned long mount_opt;
        u64 max_extent;
+       u64 alloc_start;
        struct btrfs_transaction *running_transaction;
        struct btrfs_super_block super_copy;
        struct extent_buffer *sb_buffer;
index a421069e998b02ccc31ed2719cbf337868527801..d6243c2afc73da4c6e2b0002878f8388512299a1 100644 (file)
@@ -1630,11 +1630,11 @@ int btrfs_alloc_extent(struct btrfs_trans_handle *trans,
        struct btrfs_path *path;
 
        btrfs_set_stack_extent_refs(&extent_item, 1);
-#if 0
-       new_hint = max(hint_byte, 16ULL * 1024 * 1024 * 1024);
+
+       new_hint = max(hint_byte, root->fs_info->alloc_start);
        if (new_hint < btrfs_super_total_bytes(&info->super_copy))
                hint_byte = new_hint;
-#endif
+
        WARN_ON(num_bytes < root->sectorsize);
        ret = find_free_extent(trans, root, num_bytes, empty_size,
                               search_start, search_end, hint_byte, ins,
@@ -2239,7 +2239,7 @@ static int relocate_one_reference(struct btrfs_root *extent_root,
                free_extent_buffer(eb);
 
                path->lowest_level = level;
-               path->reada = 0;
+               path->reada = 2;
                ret = btrfs_search_slot(trans, found_root, &found_key, path,
                                        0, 1);
                path->lowest_level = 0;
@@ -2372,6 +2372,7 @@ int btrfs_shrink_extent_tree(struct btrfs_root *root, u64 new_size)
        block_group_cache = &info->block_group_cache;
        path = btrfs_alloc_path();
        root = root->fs_info->extent_root;
+       path->reada = 2;
 
 again:
        total_found = 0;
index 3c7bf3bddcad41763bca7b2812ce38a889c8baeb..d6de4696188719b027cc20394fa264ec1f89ab0a 100644 (file)
@@ -2058,7 +2058,7 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct page *page)
 
        mutex_lock(&root->fs_info->fs_mutex);
        ret = btrfs_check_free_space(root, PAGE_CACHE_SIZE, 0);
-       mutex_lock(&root->fs_info->fs_mutex);
+       mutex_unlock(&root->fs_info->fs_mutex);
        if (ret)
                goto out;
 
index 3bbd7f66569423f6045b227b0d818348e8c149bb..f1b56eb77b1d98ec1488bded4becd9c6e62e7065 100644 (file)
@@ -63,7 +63,8 @@ static void btrfs_put_super (struct super_block * sb)
 }
 
 enum {
-       Opt_subvol, Opt_nodatasum, Opt_nodatacow, Opt_max_extent, Opt_err,
+       Opt_subvol, Opt_nodatasum, Opt_nodatacow, Opt_max_extent,
+       Opt_alloc_start, Opt_err,
 };
 
 static match_table_t tokens = {
@@ -71,6 +72,7 @@ static match_table_t tokens = {
        {Opt_nodatasum, "nodatasum"},
        {Opt_nodatacow, "nodatacow"},
        {Opt_max_extent, "max_extent=%s"},
+       {Opt_alloc_start, "alloc_start=%s"},
        {Opt_err, NULL}
 };
 
@@ -162,6 +164,18 @@ static int parse_options (char * options,
                                }
                        }
                        break;
+               case Opt_alloc_start:
+                       if (info) {
+                               char *num = match_strdup(&args[0]);
+                               if (num) {
+                                       info->alloc_start =
+                                               btrfs_parse_size(num);
+                                       kfree(num);
+                                       printk("btrfs: allocations start at "
+                                              "%Lu\n", info->alloc_start);
+                               }
+                       }
+                       break;
                default:
                        break;
                }