12e635a27SChris Mason #include <linux/module.h> 21e1d2701SChris Mason #include "ctree.h" 3dee26a9fSChris Mason #include "disk-io.h" 49f5fae2fSChris Mason #include "transaction.h" 51e1d2701SChris Mason 6dee26a9fSChris Mason int btrfs_alloc_file_extent(struct btrfs_trans_handle *trans, 7dee26a9fSChris Mason struct btrfs_root *root, 8dee26a9fSChris Mason u64 objectid, u64 offset, 9dee26a9fSChris Mason u64 num_blocks, u64 hint_block, 10dee26a9fSChris Mason u64 *result) 119f5fae2fSChris Mason { 12dee26a9fSChris Mason struct btrfs_key ins; 13dee26a9fSChris Mason int ret = 0; 14dee26a9fSChris Mason struct btrfs_file_extent_item *item; 15dee26a9fSChris Mason struct btrfs_key file_key; 16dee26a9fSChris Mason struct btrfs_path path; 17dee26a9fSChris Mason 18dee26a9fSChris Mason btrfs_init_path(&path); 19dee26a9fSChris Mason ret = btrfs_alloc_extent(trans, root, num_blocks, hint_block, 20dee26a9fSChris Mason (u64)-1, objectid, &ins); 21dee26a9fSChris Mason BUG_ON(ret); 22dee26a9fSChris Mason file_key.objectid = objectid; 23dee26a9fSChris Mason file_key.offset = offset; 24dee26a9fSChris Mason file_key.flags = 0; 25dee26a9fSChris Mason btrfs_set_key_type(&file_key, BTRFS_EXTENT_DATA_KEY); 26dee26a9fSChris Mason 27dee26a9fSChris Mason ret = btrfs_insert_empty_item(trans, root, &path, &file_key, 28dee26a9fSChris Mason sizeof(*item)); 29dee26a9fSChris Mason item = btrfs_item_ptr(btrfs_buffer_leaf(path.nodes[0]), path.slots[0], 30dee26a9fSChris Mason struct btrfs_file_extent_item); 31dee26a9fSChris Mason btrfs_set_file_extent_disk_blocknr(item, ins.objectid); 32dee26a9fSChris Mason btrfs_set_file_extent_disk_num_blocks(item, ins.offset); 33dee26a9fSChris Mason btrfs_set_file_extent_offset(item, 0); 34dee26a9fSChris Mason btrfs_set_file_extent_num_blocks(item, ins.offset); 3571951f35SChris Mason btrfs_set_file_extent_generation(item, trans->transid); 36dee26a9fSChris Mason mark_buffer_dirty(path.nodes[0]); 37dee26a9fSChris Mason *result = ins.objectid; 38dee26a9fSChris Mason btrfs_release_path(root, &path); 399f5fae2fSChris Mason return 0; 409f5fae2fSChris Mason } 41dee26a9fSChris Mason 42dee26a9fSChris Mason int btrfs_lookup_file_extent(struct btrfs_trans_handle *trans, 43dee26a9fSChris Mason struct btrfs_root *root, 44dee26a9fSChris Mason struct btrfs_path *path, u64 objectid, 45dee26a9fSChris Mason u64 blocknr, u64 num_blocks, int mod) 46dee26a9fSChris Mason { 47dee26a9fSChris Mason int ret; 48dee26a9fSChris Mason struct btrfs_key file_key; 49dee26a9fSChris Mason int ins_len = mod < 0 ? -1 : 0; 50dee26a9fSChris Mason int cow = mod != 0; 51dee26a9fSChris Mason 52dee26a9fSChris Mason file_key.objectid = objectid; 53dee26a9fSChris Mason file_key.offset = blocknr; 54dee26a9fSChris Mason file_key.flags = 0; 55dee26a9fSChris Mason btrfs_set_key_type(&file_key, BTRFS_EXTENT_DATA_KEY); 56dee26a9fSChris Mason ret = btrfs_search_slot(trans, root, &file_key, path, ins_len, cow); 57dee26a9fSChris Mason return ret; 58dee26a9fSChris Mason } 59