3 #include "kerncompat.h"
4 #include "radix-tree.h"
8 #include "transaction.h"
10 static struct btrfs_dir_item
*insert_with_overflow(struct
11 btrfs_trans_handle
*trans
,
12 struct btrfs_root
*root
,
13 struct btrfs_path
*path
,
14 struct btrfs_key
*cpu_key
,
19 struct btrfs_item
*item
;
20 struct btrfs_leaf
*leaf
;
22 ret
= btrfs_insert_empty_item(trans
, root
, path
, cpu_key
, data_size
);
24 ret
= btrfs_extend_item(trans
, root
, path
, data_size
);
30 leaf
= &path
->nodes
[0]->leaf
;
31 item
= leaf
->items
+ path
->slots
[0];
32 ptr
= btrfs_item_ptr(leaf
, path
->slots
[0], char);
33 BUG_ON(data_size
> btrfs_item_size(item
));
34 ptr
+= btrfs_item_size(item
) - data_size
;
35 return (struct btrfs_dir_item
*)ptr
;
38 int btrfs_insert_dir_item(struct btrfs_trans_handle
*trans
, struct btrfs_root
39 *root
, char *name
, int name_len
, u64 dir
,
40 struct btrfs_key
*location
, u8 type
)
43 struct btrfs_path path
;
44 struct btrfs_dir_item
*dir_item
;
51 btrfs_set_key_type(&key
, BTRFS_DIR_ITEM_KEY
);
52 if (name_len
== 1 && *name
== '.')
54 else if (name_len
== 2 && name
[0] == '.' && name
[1] == '.')
57 ret
= btrfs_name_hash(name
, name_len
, &key
.offset
);
59 btrfs_init_path(&path
);
60 data_size
= sizeof(*dir_item
) + name_len
;
61 dir_item
= insert_with_overflow(trans
, root
, &path
, &key
, data_size
);
66 btrfs_cpu_key_to_disk(&dir_item
->location
, location
);
67 btrfs_set_dir_type(dir_item
, type
);
68 btrfs_set_dir_flags(dir_item
, 0);
69 btrfs_set_dir_name_len(dir_item
, name_len
);
70 name_ptr
= (char *)(dir_item
+ 1);
71 memcpy(name_ptr
, name
, name_len
);
73 /* FIXME, use some real flag for selecting the extra index */
74 if (root
== root
->fs_info
->tree_root
)
77 btrfs_release_path(root
, &path
);
78 btrfs_set_key_type(&key
, BTRFS_DIR_INDEX_KEY
);
79 key
.offset
= location
->objectid
;
80 dir_item
= insert_with_overflow(trans
, root
, &path
, &key
, data_size
);
85 btrfs_cpu_key_to_disk(&dir_item
->location
, location
);
86 btrfs_set_dir_type(dir_item
, type
);
87 btrfs_set_dir_flags(dir_item
, 0);
88 btrfs_set_dir_name_len(dir_item
, name_len
);
89 name_ptr
= (char *)(dir_item
+ 1);
90 memcpy(name_ptr
, name
, name_len
);
92 btrfs_release_path(root
, &path
);
96 int btrfs_lookup_dir_item(struct btrfs_trans_handle
*trans
, struct btrfs_root
97 *root
, struct btrfs_path
*path
, u64 dir
, char *name
,
98 int name_len
, int mod
)
101 struct btrfs_key key
;
102 int ins_len
= mod
< 0 ? -1 : 0;
107 btrfs_set_key_type(&key
, BTRFS_DIR_ITEM_KEY
);
108 ret
= btrfs_name_hash(name
, name_len
, &key
.offset
);
110 ret
= btrfs_search_slot(trans
, root
, &key
, path
, ins_len
, cow
);
114 int btrfs_match_dir_item_name(struct btrfs_root
*root
,
115 struct btrfs_path
*path
, char
118 struct btrfs_dir_item
*dir_item
;
121 dir_item
= btrfs_item_ptr(&path
->nodes
[0]->leaf
, path
->slots
[0],
122 struct btrfs_dir_item
);
123 if (btrfs_dir_name_len(dir_item
) != name_len
)
125 name_ptr
= (char *)(dir_item
+ 1);
126 if (memcmp(name_ptr
, name
, name_len
))