@@ -514,6 +514,7 @@ static int csum_dirty_buffer(struct btrfs_fs_info *fs_info, struct page *page)
u8 result[BTRFS_CSUM_SIZE];
u16 csum_size = btrfs_super_csum_size(fs_info->super_copy);
struct extent_buffer *eb;
+ int err;
eb = (struct extent_buffer *)page->private;
if (page != eb->pages[0])
@@ -535,7 +536,19 @@ static int csum_dirty_buffer(struct btrfs_fs_info *fs_info, struct page *page)
if (csum_tree_block(eb, result))
return -EINVAL;
+ if (btrfs_header_level(eb))
+ err = btrfs_check_node(fs_info, eb);
+ else
+ err = btrfs_check_leaf_full(fs_info, eb);
+
+ if (err < 0) {
+ btrfs_err(fs_info,
+ "block=%llu write time tree block corruption detected",
+ eb->start);
+ return err;
+ }
write_extent_buffer(eb, result, 0, csum_size);
+
return 0;
}