diff options
author | Chris Mason <chris.mason@oracle.com> | 2007-03-26 16:00:06 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@hera.kernel.org> | 2007-03-26 16:00:06 -0400 |
commit | dee26a9f7aab7ffe1193cd1415b23a69426acc9f (patch) | |
tree | 7271c85340349817b92647d8882247478192d1bb /fs/btrfs/file-item.c | |
parent | 4730a4bc5bf3861d2cb40999374b3ac0ee2a1e0d (diff) |
btrfs_get_block, file read/write
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/file-item.c')
-rw-r--r-- | fs/btrfs/file-item.c | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index 8e1e5b4ccfaf..4a0367d702b7 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c | |||
@@ -1,9 +1,57 @@ | |||
1 | #include <linux/module.h> | 1 | #include <linux/module.h> |
2 | #include "ctree.h" | 2 | #include "ctree.h" |
3 | #include "disk-io.h" | ||
3 | #include "transaction.h" | 4 | #include "transaction.h" |
4 | 5 | ||
5 | int btrfs_create_file(struct btrfs_trans_handle *trans, | 6 | int btrfs_alloc_file_extent(struct btrfs_trans_handle *trans, |
6 | struct btrfs_root *root, u64 dirid, u64 *objectid) | 7 | struct btrfs_root *root, |
8 | u64 objectid, u64 offset, | ||
9 | u64 num_blocks, u64 hint_block, | ||
10 | u64 *result) | ||
7 | { | 11 | { |
12 | struct btrfs_key ins; | ||
13 | int ret = 0; | ||
14 | struct btrfs_file_extent_item *item; | ||
15 | struct btrfs_key file_key; | ||
16 | struct btrfs_path path; | ||
17 | |||
18 | btrfs_init_path(&path); | ||
19 | ret = btrfs_alloc_extent(trans, root, num_blocks, hint_block, | ||
20 | (u64)-1, objectid, &ins); | ||
21 | BUG_ON(ret); | ||
22 | file_key.objectid = objectid; | ||
23 | file_key.offset = offset; | ||
24 | file_key.flags = 0; | ||
25 | btrfs_set_key_type(&file_key, BTRFS_EXTENT_DATA_KEY); | ||
26 | |||
27 | ret = btrfs_insert_empty_item(trans, root, &path, &file_key, | ||
28 | sizeof(*item)); | ||
29 | item = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]), path.slots[0], | ||
30 | struct btrfs_file_extent_item); | ||
31 | btrfs_set_file_extent_disk_blocknr(item, ins.objectid); | ||
32 | btrfs_set_file_extent_disk_num_blocks(item, ins.offset); | ||
33 | btrfs_set_file_extent_offset(item, 0); | ||
34 | btrfs_set_file_extent_num_blocks(item, ins.offset); | ||
35 | mark_buffer_dirty(path.nodes[0]); | ||
36 | *result = ins.objectid; | ||
37 | btrfs_release_path(root, &path); | ||
8 | return 0; | 38 | return 0; |
9 | } | 39 | } |
40 | |||
41 | int btrfs_lookup_file_extent(struct btrfs_trans_handle *trans, | ||
42 | struct btrfs_root *root, | ||
43 | struct btrfs_path *path, u64 objectid, | ||
44 | u64 blocknr, u64 num_blocks, int mod) | ||
45 | { | ||
46 | int ret; | ||
47 | struct btrfs_key file_key; | ||
48 | int ins_len = mod < 0 ? -1 : 0; | ||
49 | int cow = mod != 0; | ||
50 | |||
51 | file_key.objectid = objectid; | ||
52 | file_key.offset = blocknr; | ||
53 | file_key.flags = 0; | ||
54 | btrfs_set_key_type(&file_key, BTRFS_EXTENT_DATA_KEY); | ||
55 | ret = btrfs_search_slot(trans, root, &file_key, path, ins_len, cow); | ||
56 | return ret; | ||
57 | } | ||