diff options
Diffstat (limited to 'fs/btrfs/inode-item.c')
-rw-r--r-- | fs/btrfs/inode-item.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/fs/btrfs/inode-item.c b/fs/btrfs/inode-item.c index 6bfa980790c2..b276a3b40a66 100644 --- a/fs/btrfs/inode-item.c +++ b/fs/btrfs/inode-item.c | |||
@@ -26,15 +26,27 @@ int btrfs_insert_inode(struct btrfs_trans_handle *trans, struct btrfs_root | |||
26 | } | 26 | } |
27 | 27 | ||
28 | int btrfs_lookup_inode(struct btrfs_trans_handle *trans, struct btrfs_root | 28 | int btrfs_lookup_inode(struct btrfs_trans_handle *trans, struct btrfs_root |
29 | *root, struct btrfs_path *path, u64 objectid, int mod) | 29 | *root, struct btrfs_path *path, |
30 | struct btrfs_key *location, int mod) | ||
30 | { | 31 | { |
31 | struct btrfs_key key; | ||
32 | int ins_len = mod < 0 ? -1 : 0; | 32 | int ins_len = mod < 0 ? -1 : 0; |
33 | int cow = mod != 0; | 33 | int cow = mod != 0; |
34 | int ret; | ||
35 | int slot; | ||
36 | struct btrfs_leaf *leaf; | ||
37 | struct btrfs_key found_key; | ||
34 | 38 | ||
35 | key.objectid = objectid; | 39 | ret = btrfs_search_slot(trans, root, location, path, ins_len, cow); |
36 | key.flags = 0; | 40 | if (ret > 0 && btrfs_key_type(location) == BTRFS_ROOT_ITEM_KEY && |
37 | btrfs_set_key_type(&key, BTRFS_INODE_ITEM_KEY); | 41 | location->offset == (u64)-1 && path->slots[0] != 0) { |
38 | key.offset = 0; | 42 | slot = path->slots[0] - 1; |
39 | return btrfs_search_slot(trans, root, &key, path, ins_len, cow); | 43 | leaf = btrfs_buffer_leaf(path->nodes[0]); |
44 | btrfs_disk_key_to_cpu(&found_key, &leaf->items[slot].key); | ||
45 | if (found_key.objectid == location->objectid && | ||
46 | btrfs_key_type(&found_key) == btrfs_key_type(location)) { | ||
47 | path->slots[0]--; | ||
48 | return 0; | ||
49 | } | ||
50 | } | ||
51 | return ret; | ||
40 | } | 52 | } |