]>
git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - fs/btrfs/dir-item.c
62d0c0916a73c2e5f229a4381e96ef028ae55009
1 #include <linux/module.h>
5 #include "transaction.h"
7 int btrfs_insert_dir_item(struct btrfs_trans_handle
*trans
, struct btrfs_root
8 *root
, const char *name
, int name_len
, u64 dir
, u64
12 struct btrfs_path
*path
;
13 struct btrfs_dir_item
*dir_item
;
20 btrfs_set_key_type(&key
, BTRFS_DIR_ITEM_KEY
);
21 ret
= btrfs_name_hash(name
, name_len
, &key
.offset
);
23 path
= btrfs_alloc_path();
24 btrfs_init_path(path
);
25 data_size
= sizeof(*dir_item
) + name_len
;
26 ret
= btrfs_insert_empty_item(trans
, root
, path
, &key
, data_size
);
30 dir_item
= btrfs_item_ptr(btrfs_buffer_leaf(path
->nodes
[0]),
32 struct btrfs_dir_item
);
33 btrfs_set_dir_objectid(dir_item
, objectid
);
34 btrfs_set_dir_type(dir_item
, type
);
35 btrfs_set_dir_flags(dir_item
, 0);
36 btrfs_set_dir_name_len(dir_item
, name_len
);
37 name_ptr
= (char *)(dir_item
+ 1);
38 btrfs_memcpy(root
, path
->nodes
[0]->b_data
, name_ptr
, name
, name_len
);
39 btrfs_mark_buffer_dirty(path
->nodes
[0]);
40 btrfs_release_path(root
, path
);
42 btrfs_set_key_type(&key
, BTRFS_DIR_INDEX_KEY
);
43 key
.offset
= objectid
;
44 ret
= btrfs_insert_empty_item(trans
, root
, path
, &key
, data_size
);
45 // FIXME clear the dirindex bit
49 dir_item
= btrfs_item_ptr(btrfs_buffer_leaf(path
->nodes
[0]),
51 struct btrfs_dir_item
);
52 btrfs_set_dir_objectid(dir_item
, objectid
);
53 btrfs_set_dir_type(dir_item
, type
);
54 btrfs_set_dir_flags(dir_item
, 0);
55 btrfs_set_dir_name_len(dir_item
, name_len
);
56 name_ptr
= (char *)(dir_item
+ 1);
57 btrfs_memcpy(root
, path
->nodes
[0]->b_data
, name_ptr
, name
, name_len
);
58 btrfs_mark_buffer_dirty(path
->nodes
[0]);
60 btrfs_release_path(root
, path
);
61 btrfs_free_path(path
);
65 int btrfs_lookup_dir_item(struct btrfs_trans_handle
*trans
, struct btrfs_root
66 *root
, struct btrfs_path
*path
, u64 dir
,
67 const char *name
, int name_len
, int mod
)
71 int ins_len
= mod
< 0 ? -1 : 0;
76 btrfs_set_key_type(&key
, BTRFS_DIR_ITEM_KEY
);
77 ret
= btrfs_name_hash(name
, name_len
, &key
.offset
);
79 ret
= btrfs_search_slot(trans
, root
, &key
, path
, ins_len
, cow
);
83 int btrfs_lookup_dir_index_item(struct btrfs_trans_handle
*trans
,
84 struct btrfs_root
*root
,
85 struct btrfs_path
*path
, u64 dir
,
86 u64 objectid
, int mod
)
90 int ins_len
= mod
< 0 ? -1 : 0;
95 btrfs_set_key_type(&key
, BTRFS_DIR_INDEX_KEY
);
96 key
.offset
= objectid
;
97 ret
= btrfs_search_slot(trans
, root
, &key
, path
, ins_len
, cow
);
101 int btrfs_match_dir_item_name(struct btrfs_root
*root
,
102 struct btrfs_path
*path
,
103 const char *name
, int name_len
)
105 struct btrfs_dir_item
*dir_item
;
108 dir_item
= btrfs_item_ptr(btrfs_buffer_leaf(path
->nodes
[0]),
110 struct btrfs_dir_item
);
111 if (btrfs_dir_name_len(dir_item
) != name_len
)
113 name_ptr
= (char *)(dir_item
+ 1);
114 if (memcmp(name_ptr
, name
, name_len
))