Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 128597
b: refs/heads/master
c: e4204de
h: refs/heads/master
i:
  128595: 5ebd988
v: v3
  • Loading branch information
Chris Mason committed Sep 25, 2008
1 parent 8cee23d commit c791881
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 725c8463ea9bcfc2b56cff09b93a90e5bcca59c4
refs/heads/master: e4204dedbbaa3a614605cb83cc0ac5161af6b4e6
46 changes: 36 additions & 10 deletions trunk/fs/btrfs/disk-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -145,10 +145,25 @@ static int csum_tree_block(struct btrfs_root *root, struct extent_buffer *buf,
btrfs_csum_final(crc, result);

if (verify) {
if (memcmp_extent_buffer(buf, result, 0, BTRFS_CRC32_SIZE)) {
printk("btrfs: %s checksum verify failed on %llu\n",
int from_this_trans = 0;

if (root->fs_info->running_transaction &&
btrfs_header_generation(buf) ==
root->fs_info->running_transaction->transid)
from_this_trans = 1;

/* FIXME, this is not good */
if (from_this_trans == 0 &&
memcmp_extent_buffer(buf, result, 0, BTRFS_CRC32_SIZE)) {
u32 val;
u32 found = 0;
memcpy(&found, result, BTRFS_CRC32_SIZE);

read_extent_buffer(buf, &val, 0, BTRFS_CRC32_SIZE);
printk("btrfs: %s checksum verify failed on %llu "
"wanted %X found %X from_this_trans %d\n",
root->fs_info->sb->s_id,
buf->start);
buf->start, val, found, from_this_trans);
return 1;
}
} else {
Expand Down Expand Up @@ -313,6 +328,7 @@ struct extent_buffer *read_tree_block(struct btrfs_root *root, u64 bytenr,
struct extent_buffer *buf = NULL;
struct inode *btree_inode = root->fs_info->btree_inode;
struct extent_map_tree *extent_tree;
u64 end;
int ret;

extent_tree = &BTRFS_I(btree_inode)->extent_tree;
Expand All @@ -322,19 +338,29 @@ struct extent_buffer *read_tree_block(struct btrfs_root *root, u64 bytenr,
return NULL;
read_extent_buffer_pages(&BTRFS_I(btree_inode)->extent_tree,
buf, 0, 1);
if (buf->flags & EXTENT_CSUM) {

if (buf->flags & EXTENT_CSUM)
return buf;
}
if (test_range_bit(extent_tree, buf->start, buf->start + buf->len - 1,
EXTENT_CSUM, 1)) {

end = buf->start + PAGE_CACHE_SIZE - 1;
if (test_range_bit(extent_tree, buf->start, end, EXTENT_CSUM, 1)) {
buf->flags |= EXTENT_CSUM;
return buf;
}

lock_extent(extent_tree, buf->start, end, GFP_NOFS);

if (test_range_bit(extent_tree, buf->start, end, EXTENT_CSUM, 1)) {
buf->flags |= EXTENT_CSUM;
goto out_unlock;
}

ret = csum_tree_block(root, buf, 1);
set_extent_bits(extent_tree, buf->start,
buf->start + buf->len - 1,
EXTENT_CSUM, GFP_NOFS);
set_extent_bits(extent_tree, buf->start, end, EXTENT_CSUM, GFP_NOFS);
buf->flags |= EXTENT_CSUM;

out_unlock:
unlock_extent(extent_tree, buf->start, end, GFP_NOFS);
return buf;
}

Expand Down

0 comments on commit c791881

Please sign in to comment.