diff options
Diffstat (limited to 'fs/btrfs/root-tree.c')
-rw-r--r-- | fs/btrfs/root-tree.c | 51 |
1 files changed, 27 insertions, 24 deletions
diff --git a/fs/btrfs/root-tree.c b/fs/btrfs/root-tree.c index 3b5926dfbeba..88bcdd33f56e 100644 --- a/fs/btrfs/root-tree.c +++ b/fs/btrfs/root-tree.c | |||
@@ -26,12 +26,13 @@ int btrfs_find_last_root(struct btrfs_root *root, u64 objectid, | |||
26 | { | 26 | { |
27 | struct btrfs_path *path; | 27 | struct btrfs_path *path; |
28 | struct btrfs_key search_key; | 28 | struct btrfs_key search_key; |
29 | struct btrfs_leaf *l; | 29 | struct btrfs_key found_key; |
30 | struct extent_buffer *l; | ||
30 | int ret; | 31 | int ret; |
31 | int slot; | 32 | int slot; |
32 | 33 | ||
33 | search_key.objectid = objectid; | 34 | search_key.objectid = objectid; |
34 | search_key.flags = (u32)-1; | 35 | search_key.type = (u8)-1; |
35 | search_key.offset = (u64)-1; | 36 | search_key.offset = (u64)-1; |
36 | 37 | ||
37 | path = btrfs_alloc_path(); | 38 | path = btrfs_alloc_path(); |
@@ -39,17 +40,19 @@ int btrfs_find_last_root(struct btrfs_root *root, u64 objectid, | |||
39 | ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0); | 40 | ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0); |
40 | if (ret < 0) | 41 | if (ret < 0) |
41 | goto out; | 42 | goto out; |
43 | |||
42 | BUG_ON(ret == 0); | 44 | BUG_ON(ret == 0); |
43 | l = btrfs_buffer_leaf(path->nodes[0]); | 45 | l = path->nodes[0]; |
44 | BUG_ON(path->slots[0] == 0); | 46 | BUG_ON(path->slots[0] == 0); |
45 | slot = path->slots[0] - 1; | 47 | slot = path->slots[0] - 1; |
46 | if (btrfs_disk_key_objectid(&l->items[slot].key) != objectid) { | 48 | btrfs_item_key_to_cpu(l, &found_key, slot); |
49 | if (found_key.objectid != objectid) { | ||
47 | ret = 1; | 50 | ret = 1; |
48 | goto out; | 51 | goto out; |
49 | } | 52 | } |
50 | memcpy(item, btrfs_item_ptr(l, slot, struct btrfs_root_item), | 53 | read_extent_buffer(l, item, btrfs_item_ptr_offset(l, slot), |
51 | sizeof(*item)); | 54 | sizeof(*item)); |
52 | btrfs_disk_key_to_cpu(key, &l->items[slot].key); | 55 | memcpy(key, &found_key, sizeof(found_key)); |
53 | ret = 0; | 56 | ret = 0; |
54 | out: | 57 | out: |
55 | btrfs_release_path(root, path); | 58 | btrfs_release_path(root, path); |
@@ -62,10 +65,10 @@ int btrfs_update_root(struct btrfs_trans_handle *trans, struct btrfs_root | |||
62 | *item) | 65 | *item) |
63 | { | 66 | { |
64 | struct btrfs_path *path; | 67 | struct btrfs_path *path; |
65 | struct btrfs_leaf *l; | 68 | struct extent_buffer *l; |
66 | int ret; | 69 | int ret; |
67 | int slot; | 70 | int slot; |
68 | struct btrfs_root_item *update_item; | 71 | unsigned long ptr; |
69 | 72 | ||
70 | path = btrfs_alloc_path(); | 73 | path = btrfs_alloc_path(); |
71 | BUG_ON(!path); | 74 | BUG_ON(!path); |
@@ -73,10 +76,10 @@ int btrfs_update_root(struct btrfs_trans_handle *trans, struct btrfs_root | |||
73 | if (ret < 0) | 76 | if (ret < 0) |
74 | goto out; | 77 | goto out; |
75 | BUG_ON(ret != 0); | 78 | BUG_ON(ret != 0); |
76 | l = btrfs_buffer_leaf(path->nodes[0]); | 79 | l = path->nodes[0]; |
77 | slot = path->slots[0]; | 80 | slot = path->slots[0]; |
78 | update_item = btrfs_item_ptr(l, slot, struct btrfs_root_item); | 81 | ptr = btrfs_item_ptr_offset(l, slot); |
79 | btrfs_memcpy(root, l, update_item, item, sizeof(*item)); | 82 | write_extent_buffer(l, item, ptr, sizeof(*item)); |
80 | btrfs_mark_buffer_dirty(path->nodes[0]); | 83 | btrfs_mark_buffer_dirty(path->nodes[0]); |
81 | out: | 84 | out: |
82 | btrfs_release_path(root, path); | 85 | btrfs_release_path(root, path); |
@@ -103,11 +106,10 @@ int btrfs_find_dead_roots(struct btrfs_root *root, u64 objectid, | |||
103 | struct btrfs_path *path; | 106 | struct btrfs_path *path; |
104 | int ret; | 107 | int ret; |
105 | u32 nritems; | 108 | u32 nritems; |
106 | struct btrfs_leaf *leaf; | 109 | struct extent_buffer *leaf; |
107 | int slot; | 110 | int slot; |
108 | 111 | ||
109 | key.objectid = objectid; | 112 | key.objectid = objectid; |
110 | key.flags = 0; | ||
111 | btrfs_set_key_type(&key, BTRFS_ROOT_ITEM_KEY); | 113 | btrfs_set_key_type(&key, BTRFS_ROOT_ITEM_KEY); |
112 | key.offset = 0; | 114 | key.offset = 0; |
113 | path = btrfs_alloc_path(); | 115 | path = btrfs_alloc_path(); |
@@ -117,19 +119,19 @@ int btrfs_find_dead_roots(struct btrfs_root *root, u64 objectid, | |||
117 | if (ret < 0) | 119 | if (ret < 0) |
118 | goto err; | 120 | goto err; |
119 | while(1) { | 121 | while(1) { |
120 | leaf = btrfs_buffer_leaf(path->nodes[0]); | 122 | leaf = path->nodes[0]; |
121 | nritems = btrfs_header_nritems(&leaf->header); | 123 | nritems = btrfs_header_nritems(leaf); |
122 | slot = path->slots[0]; | 124 | slot = path->slots[0]; |
123 | if (slot >= nritems) { | 125 | if (slot >= nritems) { |
124 | ret = btrfs_next_leaf(root, path); | 126 | ret = btrfs_next_leaf(root, path); |
125 | if (ret) | 127 | if (ret) |
126 | break; | 128 | break; |
127 | leaf = btrfs_buffer_leaf(path->nodes[0]); | 129 | leaf = path->nodes[0]; |
128 | nritems = btrfs_header_nritems(&leaf->header); | 130 | nritems = btrfs_header_nritems(leaf); |
129 | slot = path->slots[0]; | 131 | slot = path->slots[0]; |
130 | } | 132 | } |
131 | item = leaf->items + slot; | 133 | item = btrfs_item_nr(leaf, slot); |
132 | btrfs_disk_key_to_cpu(&key, &item->key); | 134 | btrfs_item_key_to_cpu(leaf, &key, slot); |
133 | if (btrfs_key_type(&key) != BTRFS_ROOT_ITEM_KEY) | 135 | if (btrfs_key_type(&key) != BTRFS_ROOT_ITEM_KEY) |
134 | goto next; | 136 | goto next; |
135 | 137 | ||
@@ -140,7 +142,7 @@ int btrfs_find_dead_roots(struct btrfs_root *root, u64 objectid, | |||
140 | break; | 142 | break; |
141 | 143 | ||
142 | ri = btrfs_item_ptr(leaf, slot, struct btrfs_root_item); | 144 | ri = btrfs_item_ptr(leaf, slot, struct btrfs_root_item); |
143 | if (btrfs_root_refs(ri) != 0) | 145 | if (btrfs_disk_root_refs(leaf, ri) != 0) |
144 | goto next; | 146 | goto next; |
145 | 147 | ||
146 | dead_root = btrfs_read_fs_root_no_radix(root->fs_info, &key); | 148 | dead_root = btrfs_read_fs_root_no_radix(root->fs_info, &key); |
@@ -170,6 +172,7 @@ int btrfs_del_root(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
170 | int ret; | 172 | int ret; |
171 | u32 refs; | 173 | u32 refs; |
172 | struct btrfs_root_item *ri; | 174 | struct btrfs_root_item *ri; |
175 | struct extent_buffer *leaf; | ||
173 | 176 | ||
174 | path = btrfs_alloc_path(); | 177 | path = btrfs_alloc_path(); |
175 | BUG_ON(!path); | 178 | BUG_ON(!path); |
@@ -177,10 +180,10 @@ int btrfs_del_root(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
177 | if (ret < 0) | 180 | if (ret < 0) |
178 | goto out; | 181 | goto out; |
179 | BUG_ON(ret != 0); | 182 | BUG_ON(ret != 0); |
180 | ri = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), | 183 | leaf = path->nodes[0]; |
181 | path->slots[0], struct btrfs_root_item); | 184 | ri = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_item); |
182 | 185 | ||
183 | refs = btrfs_root_refs(ri); | 186 | refs = btrfs_disk_root_refs(leaf, ri); |
184 | BUG_ON(refs != 0); | 187 | BUG_ON(refs != 0); |
185 | ret = btrfs_del_item(trans, root, path); | 188 | ret = btrfs_del_item(trans, root, path); |
186 | out: | 189 | out: |