diff options
author | Chris Mason <chris.mason@oracle.com> | 2007-04-05 13:35:25 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@hera.kernel.org> | 2007-04-05 13:35:25 -0400 |
commit | 5be6f7f174146d91039a27ebb2f1b4ac599172b3 (patch) | |
tree | 2933d1e9e5cb50c4ca93f6e8c7e133d65a614461 /fs/btrfs/inode-map.c | |
parent | 7fcde0e3298c00ee18e2ae7f01c67f99133ef7be (diff) |
Btrfs: dirindex optimizations
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/inode-map.c')
-rw-r--r-- | fs/btrfs/inode-map.c | 48 |
1 files changed, 33 insertions, 15 deletions
diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c index 329edb42897e..f665221409ac 100644 --- a/fs/btrfs/inode-map.c +++ b/fs/btrfs/inode-map.c | |||
@@ -3,6 +3,37 @@ | |||
3 | #include "disk-io.h" | 3 | #include "disk-io.h" |
4 | #include "transaction.h" | 4 | #include "transaction.h" |
5 | 5 | ||
6 | int btrfs_find_highest_inode(struct btrfs_root *fs_root, u64 *objectid) | ||
7 | { | ||
8 | struct btrfs_path *path; | ||
9 | int ret; | ||
10 | struct btrfs_leaf *l; | ||
11 | struct btrfs_root *root = fs_root->fs_info->inode_root; | ||
12 | struct btrfs_key search_key; | ||
13 | int slot; | ||
14 | |||
15 | path = btrfs_alloc_path(); | ||
16 | BUG_ON(!path); | ||
17 | |||
18 | search_key.objectid = (u64)-1; | ||
19 | search_key.offset = (u64)-1; | ||
20 | ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0); | ||
21 | if (ret < 0) | ||
22 | goto error; | ||
23 | BUG_ON(ret == 0); | ||
24 | if (path->slots[0] > 0) { | ||
25 | slot = path->slots[0] - 1; | ||
26 | l = btrfs_buffer_leaf(path->nodes[0]); | ||
27 | *objectid = btrfs_disk_key_objectid(&l->items[slot].key); | ||
28 | } else { | ||
29 | *objectid = BTRFS_FIRST_FREE_OBJECTID; | ||
30 | } | ||
31 | ret = 0; | ||
32 | error: | ||
33 | btrfs_free_path(path); | ||
34 | return ret; | ||
35 | } | ||
36 | |||
6 | /* | 37 | /* |
7 | * walks the btree of allocated inodes and find a hole. | 38 | * walks the btree of allocated inodes and find a hole. |
8 | */ | 39 | */ |
@@ -28,21 +59,6 @@ int btrfs_find_free_objectid(struct btrfs_trans_handle *trans, | |||
28 | btrfs_set_key_type(&search_key, BTRFS_INODE_MAP_ITEM_KEY); | 59 | btrfs_set_key_type(&search_key, BTRFS_INODE_MAP_ITEM_KEY); |
29 | 60 | ||
30 | search_start = fs_root->fs_info->last_inode_alloc; | 61 | search_start = fs_root->fs_info->last_inode_alloc; |
31 | if (search_start == 0) { | ||
32 | struct btrfs_disk_key *last_key; | ||
33 | btrfs_init_path(path); | ||
34 | search_key.objectid = (u64)-1; | ||
35 | search_key.offset = (u64)-1; | ||
36 | ret = btrfs_search_slot(trans, root, &search_key, path, 0, 0); | ||
37 | if (ret < 0) | ||
38 | goto error; | ||
39 | BUG_ON(ret == 0); | ||
40 | if (path->slots[0] > 0) | ||
41 | path->slots[0]--; | ||
42 | l = btrfs_buffer_leaf(path->nodes[0]); | ||
43 | last_key = &l->items[path->slots[0]].key; | ||
44 | search_start = btrfs_disk_key_objectid(last_key); | ||
45 | } | ||
46 | search_start = max(search_start, BTRFS_FIRST_FREE_OBJECTID); | 62 | search_start = max(search_start, BTRFS_FIRST_FREE_OBJECTID); |
47 | search_key.objectid = search_start; | 63 | search_key.objectid = search_start; |
48 | search_key.offset = 0; | 64 | search_key.offset = 0; |
@@ -129,6 +145,8 @@ int btrfs_insert_inode_map(struct btrfs_trans_handle *trans, | |||
129 | path->slots[0], struct btrfs_inode_map_item); | 145 | path->slots[0], struct btrfs_inode_map_item); |
130 | btrfs_cpu_key_to_disk(&inode_item->key, location); | 146 | btrfs_cpu_key_to_disk(&inode_item->key, location); |
131 | btrfs_mark_buffer_dirty(path->nodes[0]); | 147 | btrfs_mark_buffer_dirty(path->nodes[0]); |
148 | if (objectid > fs_root->fs_info->highest_inode) | ||
149 | fs_root->fs_info->highest_inode = objectid; | ||
132 | out: | 150 | out: |
133 | btrfs_release_path(inode_root, path); | 151 | btrfs_release_path(inode_root, path); |
134 | btrfs_free_path(path); | 152 | btrfs_free_path(path); |