FAILED: patch "[PATCH] btrfs: Always try all copies when reading extent buffers" failed to apply to 4.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
f8397d69daef06d358430d3054662fb597e37c00Mon Sep 17 00:00:00 2001
From: Nikolay Borisov <[email protected]>
Date: Tue, 6 Nov 2018 16:40:20 +0200
Subject: [PATCH] btrfs: Always try all copies when reading extent buffers
When a metadata read is served the endio routine btree_readpage_end_io_hook is called which eventually runs the tree-checker. If tree-checker fails to validate the read eb then it sets EXTENT_BUFFER_CORRUPT flag. This leads to btree_read_extent_buffer_pages wrongly assuming that all available copies of this extent buffer are wrong and failing prematurely. Fix this modify btree_read_extent_buffer_pages to read all copies of the data.
This failure was exhibitted in xfstests btrfs/124 which would spuriously fail its balance operations. The reason was that when balance was run following re-introduction of the missing raid1 disk __btrfs_map_block would map the read request to stripe 0, which corresponded to devid 2 (the disk which is being removed in the test):
item 2 key (FIRST_CHUNK_TREE CHUNK_ITEM 3553624064) itemoff 15975 itemsize 112 length 1073741824 owner 2 stripe_len 65536 type DATA|RAID1 io_align 65536 io_width 65536 sector_size 4096 num_stripes 2 sub_stripes 1 stripe 0 devid 2 offset 2156920832 dev_uuid 8466c350-ed0c-4c3b-b17d-6379b445d5c8 stripe 1 devid 1 offset 3553624064 dev_uuid 1265d8db-5596-477e-af03-df08eb38d2ca
This caused read requests for a checksum item that to be routed to the stale disk which triggered the aforementioned logic involving EXTENT_BUFFER_CORRUPT flag. This then triggered cascading failures of the balance operation.
fs/btrfs/disk-io.c +1 -10
@@ -477,9 +477,9 @@ static int btree_read_extent_buffer_pages(struct btrfs_fs_info *fs_info,int mirror_num =0 ;int failed_mirror =0 ; -clear_bit (EXTENT_BUFFER_CORRUPT , &eb->bflags); io_tree = &BTRFS_I (fs_info->btree_inode)->io_tree;while (1 ) { +clear_bit (EXTENT_BUFFER_CORRUPT , &eb->bflags); ret =read_extent_buffer_pages (io_tree, eb,WAIT_COMPLETE , mirror_num);if (!ret) {
@@ -493,15 +493,6 @@ static int btree_read_extent_buffer_pages(struct btrfs_fs_info *fs_info,break ; } -/* -* This buffer's crc is fine, but its contents are corrupted, so -* there is no reason to read the other copies, they won't be -* any less wrong. -*/ -if (test_bit (EXTENT_BUFFER_CORRUPT , &eb->bflags) || - ret == -EUCLEAN ) -break ; - num_copies =btrfs_num_copies (fs_info, eb->start, eb->len);if (num_copies ==1 )
PATCH 1/1 btrfs: Always try all copies when reading extent buffers
When a metadata read is served the endio routine btree_readpage_end_io_hook is called which eventually runs the tree-checker. If tree-checker fails to validate the read eb then it sets EXTENT_BUFFER_CORRUPT flag. This leads to btree_read_extent_buffer_pages wrongly assuming that all available copies of this extent buffer are wrong and failing prematurely. Fix this modify btree_read_extent_buffer_pages to read all copies of the data.
This failure was exhibitted in xfstests btrfs/124 which would spuriously fail its balance operations. The reason was that when balance was run following re-introduction of the missing raid1 disk __btrfs_map_block would map the read request to stripe 0, which corresponded to devid 2 (the disk which is being removed in the test):
item 2 key (FIRST_CHUNK_TREE CHUNK_ITEM 3553624064) itemoff 15975 itemsize 112 length 1073741824 owner 2 stripe_len 65536 type DATA|RAID1 io_align 65536 io_width 65536 sector_size 4096 num_stripes 2 sub_stripes 1 stripe 0 devid 2 offset 2156920832 dev_uuid 8466c350-ed0c-4c3b-b17d-6379b445d5c8 stripe 1 devid 1 offset 3553624064 dev_uuid 1265d8db-5596-477e-af03-df08eb38d2ca
This caused read requests for a checksum item that to be routed to the stale disk which triggered the aforementioned logic involving EXTENT_BUFFER_CORRUPT flag. This then triggered cascading failures of the balance operation.
---
Hi Greg,
Please apply this backport of upstream commit f8397d69daef06d358430d3054662fb597e37c00 to 4.4.y
fs/btrfs/disk-io.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-)
fs/btrfs/disk-io.c +1 -9
@@ -445,9 +445,9 @@ static int btree_read_extent_buffer_pages(struct btrfs_root *root,int mirror_num =0 ;int failed_mirror =0 ; -clear_bit (EXTENT_BUFFER_CORRUPT , &eb->bflags); io_tree = &BTRFS_I (root->fs_info->btree_inode)->io_tree;while (1 ) { +clear_bit (EXTENT_BUFFER_CORRUPT , &eb->bflags); ret =read_extent_buffer_pages (io_tree, eb, start,WAIT_COMPLETE , btree_get_extent, mirror_num);
@@ -459,14 +459,6 @@ static int btree_read_extent_buffer_pages(struct btrfs_root *root, ret = -EIO ; } -/* -* This buffer's crc is fine, but its contents are corrupted, so -* there is no reason to read the other copies, they won't be -* any less wrong. -*/ -if (test_bit (EXTENT_BUFFER_CORRUPT , &eb->bflags)) -break ; - num_copies =btrfs_num_copies (root->fs_info, eb->start, eb->len);if (num_copies ==1 )
Signature · 1 line
2.17.1
Greg KH
maintainerRe: [PATCH] btrfs: Always try all copies when reading extent buffers
Quoted 34 lines · Nikolay Borisov
When a metadata read is served the endio routine
btree_readpage_end_io_hookis called which eventually runs the tree-checker. If tree-checker fails to validate the read eb then it setsEXTENT_BUFFER_CORRUPTflag. This leads tobtree_read_extent_buffer_pageswrongly assuming that all available copies of this extent buffer are wrong and failing prematurely. Fix this modifybtree_read_extent_buffer_pagesto read all copies of the data.This failure was exhibitted in xfstests btrfs/124 which would spuriously fail its balance operations. The reason was that when balance was run following re-introduction of the missing raid1 disk
__btrfs_map_blockwould map the read request to stripe 0, which corresponded to devid 2 (the disk which is being removed in the test):item 2 key (FIRST_CHUNK_TREE CHUNK_ITEM 3553624064) itemoff 15975 itemsize 112 length 1073741824 owner 2 stripe_len 65536 type DATA|RAID1 io_align 65536 io_width 65536 sector_size 4096 num_stripes 2 sub_stripes 1 stripe 0 devid 2 offset 2156920832 dev_uuid 8466c350-ed0c-4c3b-b17d-6379b445d5c8 stripe 1 devid 1 offset 3553624064 dev_uuid 1265d8db-5596-477e-af03-df08eb38d2caThis caused read requests for a checksum item that to be routed to the stale disk which triggered the aforementioned logic involving
EXTENT_BUFFER_CORRUPTflag. This then triggered cascading failures of the balance operation.Fixes a826d6dcb32d ("Btrfs: check items for correctness as we search")CC [email protected] # 4.4+Suggested-by Qu Wenruo <[email protected]>Reviewed-by Qu Wenruo <[email protected]>Signed-off-by Nikolay Borisov <[email protected]>Signed-off-by David Sterba <[email protected]>
Quoted 5 lines
---
Hi Greg,Please apply this backport of upstream commit
f8397d69daef06d358430d3054662fb597e37c00to 4.4.y
Now applied, thanks.
greg k-h