file-item.c (5caf2a002901f0fde475371c4bf1c553b51884af) | file-item.c (1e1d27017c5986c1ea81181506042cf9cba3f6ea) |
---|---|
1#include <linux/module.h> | 1#include <stdio.h> 2#include <stdlib.h> 3#include "kerncompat.h" 4#include "radix-tree.h" |
2#include "ctree.h" 3#include "disk-io.h" | 5#include "ctree.h" 6#include "disk-io.h" |
4#include "transaction.h" | |
5 | 7 |
6int 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, 10 u64 *result) 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 path = btrfs_alloc_path(); 19 BUG_ON(!path); 20 btrfs_init_path(path); 21 ret = btrfs_alloc_extent(trans, root, num_blocks, hint_block, 22 (u64)-1, objectid, &ins); 23 BUG_ON(ret); 24 file_key.objectid = objectid; 25 file_key.offset = offset; 26 file_key.flags = 0; 27 btrfs_set_key_type(&file_key, BTRFS_EXTENT_DATA_KEY); 28 29 ret = btrfs_insert_empty_item(trans, root, path, &file_key, 30 sizeof(*item)); 31 BUG_ON(ret); 32 item = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), path->slots[0], 33 struct btrfs_file_extent_item); 34 btrfs_set_file_extent_disk_blocknr(item, ins.objectid); 35 btrfs_set_file_extent_disk_num_blocks(item, ins.offset); 36 btrfs_set_file_extent_offset(item, 0); 37 btrfs_set_file_extent_num_blocks(item, ins.offset); 38 btrfs_set_file_extent_generation(item, trans->transid); 39 btrfs_mark_buffer_dirty(path->nodes[0]); 40 *result = ins.objectid; 41 btrfs_release_path(root, path); 42 btrfs_free_path(path); 43 return 0; 44} 45 46int btrfs_lookup_file_extent(struct btrfs_trans_handle *trans, 47 struct btrfs_root *root, 48 struct btrfs_path *path, u64 objectid, 49 u64 offset, int mod) 50{ 51 int ret; 52 struct btrfs_key file_key; 53 int ins_len = mod < 0 ? -1 : 0; 54 int cow = mod != 0; 55 56 file_key.objectid = objectid; 57 file_key.offset = offset; 58 file_key.flags = 0; 59 btrfs_set_key_type(&file_key, BTRFS_EXTENT_DATA_KEY); 60 ret = btrfs_search_slot(trans, root, &file_key, path, ins_len, cow); 61 return ret; 62} 63 64int btrfs_csum_file_block(struct btrfs_trans_handle *trans, 65 struct btrfs_root *root, 66 u64 objectid, u64 offset, 67 char *data, size_t len) 68{ 69 int ret; 70 struct btrfs_key file_key; 71 struct btrfs_path *path; 72 struct btrfs_csum_item *item; 73 74 path = btrfs_alloc_path(); 75 BUG_ON(!path); 76 btrfs_init_path(path); 77 file_key.objectid = objectid; 78 file_key.offset = offset; 79 file_key.flags = 0; 80 btrfs_set_key_type(&file_key, BTRFS_CSUM_ITEM_KEY); 81 ret = btrfs_insert_empty_item(trans, root, path, &file_key, 82 BTRFS_CSUM_SIZE); 83 if (ret != 0 && ret != -EEXIST) 84 goto fail; 85 item = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), path->slots[0], 86 struct btrfs_csum_item); 87 ret = 0; 88 ret = btrfs_csum_data(root, data, len, item->csum); 89 btrfs_mark_buffer_dirty(path->nodes[0]); 90fail: 91 btrfs_release_path(root, path); 92 btrfs_free_path(path); 93 return ret; 94} 95 96int btrfs_csum_verify_file_block(struct btrfs_root *root, 97 u64 objectid, u64 offset, 98 char *data, size_t len) 99{ 100 int ret; 101 struct btrfs_key file_key; 102 struct btrfs_path *path; 103 struct btrfs_csum_item *item; 104 char result[BTRFS_CSUM_SIZE]; 105 106 path = btrfs_alloc_path(); 107 BUG_ON(!path); 108 btrfs_init_path(path); 109 file_key.objectid = objectid; 110 file_key.offset = offset; 111 file_key.flags = 0; 112 btrfs_set_key_type(&file_key, BTRFS_CSUM_ITEM_KEY); 113 ret = btrfs_search_slot(NULL, root, &file_key, path, 0, 0); 114 if (ret) 115 goto fail; 116 item = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), path->slots[0], 117 struct btrfs_csum_item); 118 ret = 0; 119 ret = btrfs_csum_data(root, data, len, result); 120 WARN_ON(ret); 121 if (memcmp(result, item->csum, BTRFS_CSUM_SIZE)) 122 ret = 1; 123fail: 124 btrfs_release_path(root, path); 125 btrfs_free_path(path); 126 return ret; 127} 128 | |