Btrfs: Add back file data checksumming
Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
Родитель
cf786e79e3
Коммит
ff79f8190b
|
@ -594,6 +594,7 @@ struct btrfs_root *open_ctree(struct super_block *sb)
|
|||
tree_root->nodesize = nodesize;
|
||||
tree_root->leafsize = leafsize;
|
||||
tree_root->sectorsize = sectorsize;
|
||||
sb_set_blocksize(sb, sectorsize);
|
||||
|
||||
i_size_write(fs_info->btree_inode,
|
||||
btrfs_super_total_bytes(disk_super));
|
||||
|
|
|
@ -58,4 +58,6 @@ int btrfs_buffer_defrag_done(struct extent_buffer *buf);
|
|||
int btrfs_clear_buffer_defrag(struct extent_buffer *buf);
|
||||
int btrfs_clear_buffer_defrag_done(struct extent_buffer *buf);
|
||||
int btrfs_read_buffer(struct extent_buffer *buf);
|
||||
u32 btrfs_csum_data(struct btrfs_root *root, char *data, u32 seed, size_t len);
|
||||
void btrfs_csum_final(u32 crc, char *result);
|
||||
#endif
|
||||
|
|
|
@ -2031,6 +2031,7 @@ struct extent_buffer *alloc_extent_buffer(struct extent_map_tree *tree,
|
|||
i = 1;
|
||||
index++;
|
||||
page_cache_get(page0);
|
||||
mark_page_accessed(page0);
|
||||
set_page_extent_mapped(page0);
|
||||
set_page_private(page0, EXTENT_PAGE_PRIVATE_FIRST_PAGE |
|
||||
len << 2);
|
||||
|
@ -2049,6 +2050,7 @@ struct extent_buffer *alloc_extent_buffer(struct extent_map_tree *tree,
|
|||
goto fail;
|
||||
}
|
||||
set_page_extent_mapped(p);
|
||||
mark_page_accessed(p);
|
||||
if (i == 0) {
|
||||
eb->first_page = p;
|
||||
set_page_private(p, EXTENT_PAGE_PRIVATE_FIRST_PAGE |
|
||||
|
@ -2099,6 +2101,7 @@ struct extent_buffer *find_extent_buffer(struct extent_map_tree *tree,
|
|||
goto fail;
|
||||
}
|
||||
set_page_extent_mapped(p);
|
||||
mark_page_accessed(p);
|
||||
|
||||
if (i == 0) {
|
||||
eb->first_page = p;
|
||||
|
|
|
@ -136,27 +136,27 @@ int btrfs_csum_file_block(struct btrfs_trans_handle *trans,
|
|||
u64 objectid, u64 offset,
|
||||
char *data, size_t len)
|
||||
{
|
||||
return 0;
|
||||
#if 0
|
||||
int ret;
|
||||
struct btrfs_key file_key;
|
||||
struct btrfs_key found_key;
|
||||
struct btrfs_path *path;
|
||||
struct btrfs_csum_item *item;
|
||||
struct extent_buffer *leaf;
|
||||
struct extent_buffer *leaf = NULL;
|
||||
u64 csum_offset;
|
||||
u32 csum_result = ~(u32)0;
|
||||
|
||||
path = btrfs_alloc_path();
|
||||
BUG_ON(!path);
|
||||
|
||||
file_key.objectid = objectid;
|
||||
file_key.offset = offset;
|
||||
file_key.flags = 0;
|
||||
btrfs_set_key_type(&file_key, BTRFS_CSUM_ITEM_KEY);
|
||||
|
||||
item = btrfs_lookup_csum(trans, root, path, objectid, offset, 1);
|
||||
if (!IS_ERR(item))
|
||||
if (!IS_ERR(item)) {
|
||||
leaf = path->nodes[0];
|
||||
goto found;
|
||||
}
|
||||
ret = PTR_ERR(item);
|
||||
if (ret == -EFBIG) {
|
||||
u32 item_size;
|
||||
|
@ -226,14 +226,15 @@ csum:
|
|||
item = (struct btrfs_csum_item *)((unsigned char *)item +
|
||||
csum_offset * BTRFS_CRC32_SIZE);
|
||||
found:
|
||||
/* FIXME!!!!!!!!!!!! */
|
||||
ret = btrfs_csum_data(root, data, len, &item->csum);
|
||||
csum_result = btrfs_csum_data(root, data, csum_result, len);
|
||||
btrfs_csum_final(csum_result, (char *)&csum_result);
|
||||
write_extent_buffer(leaf, &csum_result, (unsigned long)item,
|
||||
BTRFS_CRC32_SIZE);
|
||||
btrfs_mark_buffer_dirty(path->nodes[0]);
|
||||
fail:
|
||||
btrfs_release_path(root, path);
|
||||
btrfs_free_path(path);
|
||||
return ret;
|
||||
#endif
|
||||
}
|
||||
|
||||
int btrfs_csum_truncate(struct btrfs_trans_handle *trans,
|
||||
|
|
|
@ -289,6 +289,7 @@ static int dirty_and_release_pages(struct btrfs_trans_handle *trans,
|
|||
*/
|
||||
inline_size = end_pos;
|
||||
if (isize >= BTRFS_MAX_INLINE_DATA_SIZE(root) ||
|
||||
inline_size > 16384 ||
|
||||
inline_size >= BTRFS_MAX_INLINE_DATA_SIZE(root)) {
|
||||
u64 last_end;
|
||||
|
||||
|
|
|
@ -135,7 +135,7 @@ int btrfs_readpage_io_hook(struct page *page, u64 start, u64 end)
|
|||
struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
|
||||
struct btrfs_csum_item *item;
|
||||
struct btrfs_path *path = NULL;
|
||||
u64 private;
|
||||
u32 csum;
|
||||
|
||||
mutex_lock(&root->fs_info->fs_mutex);
|
||||
path = btrfs_alloc_path();
|
||||
|
@ -145,11 +145,12 @@ int btrfs_readpage_io_hook(struct page *page, u64 start, u64 end)
|
|||
/* a csum that isn't present is a preallocated region. */
|
||||
if (ret == -ENOENT || ret == -EFBIG)
|
||||
ret = 0;
|
||||
private = 0;
|
||||
csum = 0;
|
||||
goto out;
|
||||
}
|
||||
memcpy((char *)&private, &item->csum, BTRFS_CRC32_SIZE);
|
||||
set_state_private(em_tree, start, private);
|
||||
read_extent_buffer(path->nodes[0], &csum, (unsigned long)item,
|
||||
BTRFS_CRC32_SIZE);
|
||||
set_state_private(em_tree, start, csum);
|
||||
out:
|
||||
if (path)
|
||||
btrfs_free_path(path);
|
||||
|
@ -165,21 +166,19 @@ int btrfs_readpage_end_io_hook(struct page *page, u64 start, u64 end)
|
|||
char *kaddr;
|
||||
u64 private;
|
||||
int ret;
|
||||
struct btrfs_root *root = BTRFS_I(inode)->root;
|
||||
u32 csum = ~(u32)0;
|
||||
|
||||
ret = get_state_private(em_tree, start, &private);
|
||||
kaddr = kmap_atomic(page, KM_IRQ0);
|
||||
if (ret) {
|
||||
goto zeroit;
|
||||
}
|
||||
/*
|
||||
struct btrfs_root *root = BTRFS_I(inode)->root;
|
||||
char csum[BTRFS_CRC32_SIZE];
|
||||
ret = btrfs_csum_data(root, kaddr + offset, end - start + 1, csum);
|
||||
BUG_ON(ret);
|
||||
if (memcmp(csum, &private, BTRFS_CRC32_SIZE)) {
|
||||
csum = btrfs_csum_data(root, kaddr + offset, csum, end - start + 1);
|
||||
btrfs_csum_final(csum, (char *)&csum);
|
||||
if (csum != private) {
|
||||
goto zeroit;
|
||||
}
|
||||
*/
|
||||
kunmap_atomic(kaddr, KM_IRQ0);
|
||||
return 0;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче