1 #include <linux/module.h>
4 #include "transaction.h"
6 int btrfs_alloc_file_extent(struct btrfs_trans_handle
*trans
,
7 struct btrfs_root
*root
,
8 u64 objectid
, u64 offset
,
9 u64 num_blocks
, u64 hint_block
,
14 struct btrfs_file_extent_item
*item
;
15 struct btrfs_key file_key
;
16 struct btrfs_path path
;
18 btrfs_init_path(&path
);
19 ret
= btrfs_alloc_extent(trans
, root
, num_blocks
, hint_block
,
20 (u64
)-1, objectid
, &ins
);
22 file_key
.objectid
= objectid
;
23 file_key
.offset
= offset
;
25 btrfs_set_key_type(&file_key
, BTRFS_EXTENT_DATA_KEY
);
27 ret
= btrfs_insert_empty_item(trans
, root
, &path
, &file_key
,
30 item
= btrfs_item_ptr(btrfs_buffer_leaf(path
.nodes
[0]), path
.slots
[0],
31 struct btrfs_file_extent_item
);
32 btrfs_set_file_extent_disk_blocknr(item
, ins
.objectid
);
33 btrfs_set_file_extent_disk_num_blocks(item
, ins
.offset
);
34 btrfs_set_file_extent_offset(item
, 0);
35 btrfs_set_file_extent_num_blocks(item
, ins
.offset
);
36 btrfs_set_file_extent_generation(item
, trans
->transid
);
37 mark_buffer_dirty(path
.nodes
[0]);
38 *result
= ins
.objectid
;
39 btrfs_release_path(root
, &path
);
43 int btrfs_lookup_file_extent(struct btrfs_trans_handle
*trans
,
44 struct btrfs_root
*root
,
45 struct btrfs_path
*path
, u64 objectid
,
49 struct btrfs_key file_key
;
50 int ins_len
= mod
< 0 ? -1 : 0;
53 file_key
.objectid
= objectid
;
54 file_key
.offset
= offset
;
56 btrfs_set_key_type(&file_key
, BTRFS_EXTENT_DATA_KEY
);
57 ret
= btrfs_search_slot(trans
, root
, &file_key
, path
, ins_len
, cow
);
61 int btrfs_csum_file_block(struct btrfs_trans_handle
*trans
,
62 struct btrfs_root
*root
,
63 u64 objectid
, u64 offset
,
64 char *data
, size_t len
)
67 struct btrfs_key file_key
;
68 struct btrfs_path path
;
69 struct btrfs_csum_item
*item
;
71 btrfs_init_path(&path
);
72 file_key
.objectid
= objectid
;
73 file_key
.offset
= offset
;
75 btrfs_set_key_type(&file_key
, BTRFS_CSUM_ITEM_KEY
);
76 ret
= btrfs_insert_empty_item(trans
, root
, &path
, &file_key
,
78 if (ret
!= 0 && ret
!= -EEXIST
)
80 item
= btrfs_item_ptr(btrfs_buffer_leaf(path
.nodes
[0]), path
.slots
[0],
81 struct btrfs_csum_item
);
83 ret
= btrfs_csum_data(root
, data
, len
, item
->csum
);
84 mark_buffer_dirty(path
.nodes
[0]);
86 btrfs_release_path(root
, &path
);
90 int btrfs_csum_verify_file_block(struct btrfs_root
*root
,
91 u64 objectid
, u64 offset
,
92 char *data
, size_t len
)
95 struct btrfs_key file_key
;
96 struct btrfs_path path
;
97 struct btrfs_csum_item
*item
;
98 char result
[BTRFS_CSUM_SIZE
];
100 btrfs_init_path(&path
);
101 file_key
.objectid
= objectid
;
102 file_key
.offset
= offset
;
104 btrfs_set_key_type(&file_key
, BTRFS_CSUM_ITEM_KEY
);
105 ret
= btrfs_search_slot(NULL
, root
, &file_key
, &path
, 0, 0);
108 item
= btrfs_item_ptr(btrfs_buffer_leaf(path
.nodes
[0]), path
.slots
[0],
109 struct btrfs_csum_item
);
111 ret
= btrfs_csum_data(root
, data
, len
, result
);
113 if (memcmp(result
, item
->csum
, BTRFS_CSUM_SIZE
))
116 btrfs_release_path(root
, &path
);
This page took 0.033085 seconds and 5 git commands to generate.