On Thu, Mar 10, 2016 at 11:10 AM, Alex Lyakas <alex.bolshoy@xxxxxxxxx> wrote:
> csum_dirty_buffer was issuing a warning in case the extent buffer
> did not look alright, but was still returning success.
> Let's return error in this case, and also add an additional sanity
> check on the extent buffer header.
> The caller up the chain may BUG_ON on this, for example flush_epd_write_bio will,
> but it is better than to have a silent metadata corruption on disk.
>
> Signed-off-by: Alex Lyakas <alex@xxxxxxxxxxxxxxxxx>
Reviewed-by: Filipe Manana <fdmanana@xxxxxxxx>
> ---
> fs/btrfs/disk-io.c | 15 +++++++++++++--
> 1 file changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
> index 4420ab2..cf85714 100644
> --- a/fs/btrfs/disk-io.c
> +++ b/fs/btrfs/disk-io.c
> @@ -506,23 +506,34 @@ static int btree_read_extent_buffer_pages(struct btrfs_root *root,
>
> static int csum_dirty_buffer(struct btrfs_fs_info *fs_info, struct page *page)
> {
> u64 start = page_offset(page);
> u64 found_start;
> struct extent_buffer *eb;
>
> eb = (struct extent_buffer *)page->private;
> if (page != eb->pages[0])
> return 0;
> +
> found_start = btrfs_header_bytenr(eb);
> - if (WARN_ON(found_start != start || !PageUptodate(page)))
> - return 0;
> + /*
> + * Please do not consolidate these warnings into a single if.
> + * It is useful to know what went wrong.
> + */
> + if (WARN_ON(found_start != start))
> + return -EUCLEAN;
> + if (WARN_ON(!PageUptodate(page)))
> + return -EUCLEAN;
> +
> + ASSERT(memcmp_extent_buffer(eb, fs_info->fsid,
> + btrfs_header_fsid(), BTRFS_FSID_SIZE) == 0);
> +
> return csum_tree_block(fs_info, eb, 0);
> }
>
> static int check_tree_block_fsid(struct btrfs_fs_info *fs_info,
> struct extent_buffer *eb)
> {
> struct btrfs_fs_devices *fs_devices = fs_info->fs_devices;
> u8 fsid[BTRFS_UUID_SIZE];
> int ret = 1;
>
> --
> 1.9.1
>
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html