file-item.c (b18c6685810af8e6763760711aece31ccc7a8ea8) | file-item.c (70b2befd0c8a4064715d8b340270650cc9d15af8) |
---|---|
1#include <linux/module.h> 2#include "ctree.h" 3#include "disk-io.h" 4#include "transaction.h" 5 6#define MAX_CSUM_ITEMS(r) ((((BTRFS_LEAF_DATA_SIZE(r) - \ 7 sizeof(struct btrfs_item)) / \ 8 sizeof(struct btrfs_csum_item)) - 1)) --- 48 unchanged lines hidden (view full) --- 57 struct btrfs_csum_item *item; 58 struct btrfs_leaf *leaf; 59 u64 csum_offset = 0; 60 61 file_key.objectid = objectid; 62 file_key.offset = offset; 63 file_key.flags = 0; 64 btrfs_set_key_type(&file_key, BTRFS_CSUM_ITEM_KEY); | 1#include <linux/module.h> 2#include "ctree.h" 3#include "disk-io.h" 4#include "transaction.h" 5 6#define MAX_CSUM_ITEMS(r) ((((BTRFS_LEAF_DATA_SIZE(r) - \ 7 sizeof(struct btrfs_item)) / \ 8 sizeof(struct btrfs_csum_item)) - 1)) --- 48 unchanged lines hidden (view full) --- 57 struct btrfs_csum_item *item; 58 struct btrfs_leaf *leaf; 59 u64 csum_offset = 0; 60 61 file_key.objectid = objectid; 62 file_key.offset = offset; 63 file_key.flags = 0; 64 btrfs_set_key_type(&file_key, BTRFS_CSUM_ITEM_KEY); |
65printk("__lookup for %Lu\n", offset); | |
66 ret = btrfs_search_slot(trans, root, &file_key, path, 0, cow); 67 if (ret < 0) 68 goto fail; 69 leaf = btrfs_buffer_leaf(path->nodes[0]); 70 if (ret > 0) { 71 ret = 1; | 65 ret = btrfs_search_slot(trans, root, &file_key, path, 0, cow); 66 if (ret < 0) 67 goto fail; 68 leaf = btrfs_buffer_leaf(path->nodes[0]); 69 if (ret > 0) { 70 ret = 1; |
72 if (path->slots[0] == 0) { 73printk("fail1\n"); | 71 if (path->slots[0] == 0) |
74 goto fail; | 72 goto fail; |
75 } | |
76 path->slots[0]--; 77 btrfs_disk_key_to_cpu(&found_key, 78 &leaf->items[path->slots[0]].key); 79 if (btrfs_key_type(&found_key) != BTRFS_CSUM_ITEM_KEY || 80 found_key.objectid != objectid) { | 73 path->slots[0]--; 74 btrfs_disk_key_to_cpu(&found_key, 75 &leaf->items[path->slots[0]].key); 76 if (btrfs_key_type(&found_key) != BTRFS_CSUM_ITEM_KEY || 77 found_key.objectid != objectid) { |
81printk("fail2 type %u %Lu %Lu\n", btrfs_key_type(&found_key), found_key.objectid, objectid); | |
82 goto fail; 83 } 84 csum_offset = (offset - found_key.offset) >> 85 root->fs_info->sb->s_blocksize_bits; 86 if (csum_offset >= 87 btrfs_item_size(leaf->items + path->slots[0]) / 88 sizeof(struct btrfs_csum_item)) { | 78 goto fail; 79 } 80 csum_offset = (offset - found_key.offset) >> 81 root->fs_info->sb->s_blocksize_bits; 82 if (csum_offset >= 83 btrfs_item_size(leaf->items + path->slots[0]) / 84 sizeof(struct btrfs_csum_item)) { |
89printk("fail3, csum offset %lu size %u\n", csum_offset, btrfs_item_size(leaf->items + path->slots[0]) / sizeof(struct btrfs_csum_item)); | |
90 goto fail; 91 } 92 } 93 item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_csum_item); 94 item += csum_offset; 95 return item; 96fail: 97 if (ret > 0) --- 6 unchanged lines hidden (view full) --- 104 struct btrfs_root *root, 105 struct btrfs_path *path, u64 objectid, 106 u64 offset, int mod) 107{ 108 int ret; 109 struct btrfs_key file_key; 110 int ins_len = mod < 0 ? -1 : 0; 111 int cow = mod != 0; | 85 goto fail; 86 } 87 } 88 item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_csum_item); 89 item += csum_offset; 90 return item; 91fail: 92 if (ret > 0) --- 6 unchanged lines hidden (view full) --- 99 struct btrfs_root *root, 100 struct btrfs_path *path, u64 objectid, 101 u64 offset, int mod) 102{ 103 int ret; 104 struct btrfs_key file_key; 105 int ins_len = mod < 0 ? -1 : 0; 106 int cow = mod != 0; |
112 struct btrfs_csum_item *csum_item; | |
113 | 107 |
114 csum_item = btrfs_lookup_csum(trans, root, path, objectid, offset, 0); 115 if (IS_ERR(csum_item)) 116 return PTR_ERR(csum_item); | |
117 file_key.objectid = objectid; | 108 file_key.objectid = objectid; |
118 file_key.offset = btrfs_csum_extent_offset(csum_item); | 109 file_key.offset = offset; |
119 file_key.flags = 0; 120 btrfs_set_key_type(&file_key, BTRFS_EXTENT_DATA_KEY); | 110 file_key.flags = 0; 111 btrfs_set_key_type(&file_key, BTRFS_EXTENT_DATA_KEY); |
121 btrfs_release_path(root, path); 122printk("lookup file extent searches for %Lu\n", file_key.offset); | |
123 ret = btrfs_search_slot(trans, root, &file_key, path, ins_len, cow); | 112 ret = btrfs_search_slot(trans, root, &file_key, path, ins_len, cow); |
124printk("ret is %d\n", ret); | |
125 return ret; 126} 127 128int btrfs_csum_file_block(struct btrfs_trans_handle *trans, 129 struct btrfs_root *root, 130 u64 objectid, u64 offset, | 113 return ret; 114} 115 116int btrfs_csum_file_block(struct btrfs_trans_handle *trans, 117 struct btrfs_root *root, 118 u64 objectid, u64 offset, |
131 u64 extent_offset, | |
132 char *data, size_t len) 133{ 134 int ret; 135 struct btrfs_key file_key; 136 struct btrfs_key found_key; 137 struct btrfs_path *path; 138 struct btrfs_csum_item *item; 139 struct btrfs_leaf *leaf; --- 6 unchanged lines hidden (view full) --- 146 item = btrfs_lookup_csum(trans, root, path, objectid, offset, 0); 147 if (!IS_ERR(item)) 148 goto found; 149 btrfs_release_path(root, path); 150 file_key.objectid = objectid; 151 file_key.offset = offset; 152 file_key.flags = 0; 153 btrfs_set_key_type(&file_key, BTRFS_CSUM_ITEM_KEY); | 119 char *data, size_t len) 120{ 121 int ret; 122 struct btrfs_key file_key; 123 struct btrfs_key found_key; 124 struct btrfs_path *path; 125 struct btrfs_csum_item *item; 126 struct btrfs_leaf *leaf; --- 6 unchanged lines hidden (view full) --- 133 item = btrfs_lookup_csum(trans, root, path, objectid, offset, 0); 134 if (!IS_ERR(item)) 135 goto found; 136 btrfs_release_path(root, path); 137 file_key.objectid = objectid; 138 file_key.offset = offset; 139 file_key.flags = 0; 140 btrfs_set_key_type(&file_key, BTRFS_CSUM_ITEM_KEY); |
154printk("searching for csum %Lu %Lu\n", objectid, offset); | |
155 ret = btrfs_search_slot(trans, root, &file_key, path, 156 sizeof(struct btrfs_csum_item), 1); | 141 ret = btrfs_search_slot(trans, root, &file_key, path, 142 sizeof(struct btrfs_csum_item), 1); |
157printk("ret %d\n", ret); | |
158 if (ret < 0) 159 goto fail; 160 if (ret == 0) { 161 BUG(); 162 } 163 if (path->slots[0] == 0) { 164 btrfs_release_path(root, path); 165 goto insert; 166 } 167 path->slots[0]--; 168 leaf = btrfs_buffer_leaf(path->nodes[0]); 169 btrfs_disk_key_to_cpu(&found_key, &leaf->items[path->slots[0]].key); | 143 if (ret < 0) 144 goto fail; 145 if (ret == 0) { 146 BUG(); 147 } 148 if (path->slots[0] == 0) { 149 btrfs_release_path(root, path); 150 goto insert; 151 } 152 path->slots[0]--; 153 leaf = btrfs_buffer_leaf(path->nodes[0]); 154 btrfs_disk_key_to_cpu(&found_key, &leaf->items[path->slots[0]].key); |
170printk("found key %Lu %Lu %u\n", found_key.objectid, found_key.offset, found_key.flags); | |
171 csum_offset = (offset - found_key.offset) >> 172 root->fs_info->sb->s_blocksize_bits; | 155 csum_offset = (offset - found_key.offset) >> 156 root->fs_info->sb->s_blocksize_bits; |
173printk("csum_offset %Lu\n", csum_offset); | |
174 if (btrfs_key_type(&found_key) != BTRFS_CSUM_ITEM_KEY || 175 found_key.objectid != objectid || 176 csum_offset >= MAX_CSUM_ITEMS(root)) { 177 btrfs_release_path(root, path); | 157 if (btrfs_key_type(&found_key) != BTRFS_CSUM_ITEM_KEY || 158 found_key.objectid != objectid || 159 csum_offset >= MAX_CSUM_ITEMS(root)) { 160 btrfs_release_path(root, path); |
178printk("insert1\n"); | |
179 goto insert; 180 } 181 if (csum_offset >= btrfs_item_size(leaf->items + path->slots[0]) / 182 sizeof(struct btrfs_csum_item)) { 183 ret = btrfs_extend_item(trans, root, path, 184 sizeof(struct btrfs_csum_item)); 185 BUG_ON(ret); | 161 goto insert; 162 } 163 if (csum_offset >= btrfs_item_size(leaf->items + path->slots[0]) / 164 sizeof(struct btrfs_csum_item)) { 165 ret = btrfs_extend_item(trans, root, path, 166 sizeof(struct btrfs_csum_item)); 167 BUG_ON(ret); |
186printk("item extended\n"); | |
187 goto csum; 188 } 189 190insert: 191 csum_offset = 0; | 168 goto csum; 169 } 170 171insert: 172 csum_offset = 0; |
192printk("inserting item %Lu %Lu %u\n", file_key.objectid, file_key.offset, file_key.flags); | |
193 ret = btrfs_insert_empty_item(trans, root, path, &file_key, 194 sizeof(struct btrfs_csum_item)); 195 if (ret != 0 && ret != -EEXIST) 196 goto fail; 197csum: 198 item = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), path->slots[0], 199 struct btrfs_csum_item); 200 ret = 0; 201 item += csum_offset; 202found: 203 ret = btrfs_csum_data(root, data, len, item->csum); | 173 ret = btrfs_insert_empty_item(trans, root, path, &file_key, 174 sizeof(struct btrfs_csum_item)); 175 if (ret != 0 && ret != -EEXIST) 176 goto fail; 177csum: 178 item = btrfs_item_ptr(btrfs_buffer_leaf(path->nodes[0]), path->slots[0], 179 struct btrfs_csum_item); 180 ret = 0; 181 item += csum_offset; 182found: 183 ret = btrfs_csum_data(root, data, len, item->csum); |
204 btrfs_set_csum_extent_offset(item, extent_offset); | |
205 btrfs_mark_buffer_dirty(path->nodes[0]); 206fail: 207 btrfs_release_path(root, path); 208 btrfs_free_path(path); | 184 btrfs_mark_buffer_dirty(path->nodes[0]); 185fail: 186 btrfs_release_path(root, path); 187 btrfs_free_path(path); |
209printk("return ret %d\n", ret); | |
210 return ret; 211} 212 213int btrfs_csum_verify_file_block(struct btrfs_root *root, 214 u64 objectid, u64 offset, 215 char *data, size_t len) 216{ 217 int ret; --- 31 unchanged lines hidden --- | 188 return ret; 189} 190 191int btrfs_csum_verify_file_block(struct btrfs_root *root, 192 u64 objectid, u64 offset, 193 char *data, size_t len) 194{ 195 int ret; --- 31 unchanged lines hidden --- |