Qu Wenruo
9a33944bdf
btrfs: scrub: Don't append on-disk pages for raid56 scrub
...
In the following situation, scrub will calculate wrong parity to
overwrite the correct one:
RAID5 full stripe:
Before
| Dev 1 | Dev 2 | Dev 3 |
| Data stripe 1 | Data stripe 2 | Parity Stripe |
--------------------------------------------------- 0
| 0x0000 (Bad) | 0xcdcd | 0x0000 |
--------------------------------------------------- 4K
| 0xcdcd | 0xcdcd | 0x0000 |
...
| 0xcdcd | 0xcdcd | 0x0000 |
--------------------------------------------------- 64K
After scrubbing dev3 only:
| Dev 1 | Dev 2 | Dev 3 |
| Data stripe 1 | Data stripe 2 | Parity Stripe |
--------------------------------------------------- 0
| 0xcdcd (Good) | 0xcdcd | 0xcdcd (Bad) |
--------------------------------------------------- 4K
| 0xcdcd | 0xcdcd | 0x0000 |
...
| 0xcdcd | 0xcdcd | 0x0000 |
--------------------------------------------------- 64K
The reason is that after raid56 read rebuild rbio->stripe_pages are all
correctly recovered (0xcd for data stripes).
However when we check and repair parity in
scrub_parity_check_and_repair(), we will append pages in sparity->spages
list to rbio->bio_pages[], which contains old on-disk data.
And when we submit parity data to disk, we calculate parity using
rbio->bio_pages[] first, if rbio->bio_pages[] not found, then fallback
to rbio->stripe_pages[].
The patch fix it by not appending pages from sparity->spages.
So finish_parity_scrub() will use rbio->stripe_pages[] which is correct.
Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Reviewed-by: Liu Bo <bo.li.liu@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2017-04-18 14:07:26 +02:00
..
tests
btrfs: remove unused qgroup members from btrfs_trans_handle
2017-04-18 14:07:25 +02:00
acl.c
async-thread.c
async-thread.h
backref.c
btrfs: replace hardcoded value with SEQ_LAST macro
2017-04-18 14:07:25 +02:00
backref.h
btrfs_inode.h
btrfs: make btrfs_inode_resume_unlocked_dio take btrfs_inode
2017-02-28 11:30:12 +01:00
check-integrity.c
check-integrity.h
compression.c
btrfs: convert compressed_bio.pending_bios from atomic_t to refcount_t
2017-04-18 14:07:24 +02:00
compression.h
btrfs: derive maximum output size in the compression implementation
2017-02-28 14:26:36 +01:00
ctree.c
btrfs: sink GFP flags parameter to tree_mod_log_insert_root
2017-04-18 14:07:26 +02:00
ctree.h
btrfs: track exclusive filesystem operation in flags
2017-04-18 14:07:25 +02:00
dedupe.h
delayed-inode.c
btrfs: convert btrfs_delayed_item.refs from atomic_t to refcount_t
2017-04-18 14:07:23 +02:00
delayed-inode.h
btrfs: convert btrfs_delayed_item.refs from atomic_t to refcount_t
2017-04-18 14:07:23 +02:00
delayed-ref.c
btrfs: convert btrfs_delayed_ref_node.refs from atomic_t to refcount_t
2017-04-18 14:07:23 +02:00
delayed-ref.h
btrfs: convert btrfs_delayed_ref_node.refs from atomic_t to refcount_t
2017-04-18 14:07:23 +02:00
dev-replace.c
btrfs: track exclusive filesystem operation in flags
2017-04-18 14:07:25 +02:00
dev-replace.h
btrfs: constify device path passed to relevant helpers
2017-02-28 14:26:07 +01:00
dir-item.c
btrfs: do proper error handling in btrfs_insert_xattr_item
2017-02-28 14:27:11 +01:00
disk-io.c
btrfs: remove redundant parameter from btree_readahead_hook
2017-04-18 14:07:25 +02:00
disk-io.h
btrfs: convert btrfs_root.refs from atomic_t to refcount_t
2017-04-18 14:07:23 +02:00
export.c
export.h
extent-tree.c
btrfs: remove unused qgroup members from btrfs_trans_handle
2017-04-18 14:07:25 +02:00
extent_io.c
Btrfs: create a helper for getting chunk map
2017-04-18 14:07:24 +02:00
extent_io.h
btrfs: convert extent_state.refs from atomic_t to refcount_t
2017-04-18 14:07:23 +02:00
extent_map.c
btrfs: convert extent_map.refs from atomic_t to refcount_t
2017-04-18 14:07:23 +02:00
extent_map.h
btrfs: convert extent_map.refs from atomic_t to refcount_t
2017-04-18 14:07:23 +02:00
file-item.c
Merge branch 'for-chris-4.11-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux into for-linus-4.11
2017-02-28 14:35:09 -08:00
file.c
Merge branch 'for-linus-4.11' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs
2017-03-02 16:03:00 -08:00
free-space-cache.c
Merge branch 'WIP.sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2017-03-03 10:16:38 -08:00
free-space-cache.h
free-space-tree.c
free-space-tree.h
hash.c
hash.h
inode-item.c
inode-map.c
btrfs: all btrfs_delalloc_release_metadata take btrfs_inode
2017-02-28 11:30:07 +01:00
inode-map.h
inode.c
Btrfs: add file item tracepoints
2017-04-18 14:07:24 +02:00
ioctl.c
btrfs: track exclusive filesystem operation in flags
2017-04-18 14:07:25 +02:00
Kconfig
locking.c
locking.h
lzo.c
btrfs: derive maximum output size in the compression implementation
2017-02-28 14:26:36 +01:00
Makefile
math.h
ordered-data.c
btrfs: convert btrfs_ordered_extent.refs from atomic_t to refcount_t
2017-04-18 14:07:23 +02:00
ordered-data.h
btrfs: convert btrfs_ordered_extent.refs from atomic_t to refcount_t
2017-04-18 14:07:23 +02:00
orphan.c
print-tree.c
print-tree.h
props.c
props.h
qgroup.c
btrfs: qgroup: Re-arrange tracepoint timing to co-operate with reserved space tracepoint
2017-04-18 14:07:26 +02:00
qgroup.h
btrfs: qgroup: Re-arrange tracepoint timing to co-operate with reserved space tracepoint
2017-04-18 14:07:26 +02:00
raid56.c
Btrfs: fix wrong failed mirror_num of read-repair on raid56
2017-04-18 14:07:26 +02:00
raid56.h
rcu-string.h
reada.c
btrfs: remove local blocksize variable in reada_find_extent
2017-04-18 14:07:25 +02:00
relocation.c
btrfs: Make btrfs_orphan_add take btrfs_inode
2017-02-28 11:30:10 +01:00
root-tree.c
scrub.c
btrfs: scrub: Don't append on-disk pages for raid56 scrub
2017-04-18 14:07:26 +02:00
send.c
Btrfs: fix an integer overflow check
2017-03-29 14:29:08 +02:00
send.h
struct-funcs.c
super.c
btrfs: No need to check !(flags & MS_RDONLY) twice
2017-04-18 14:07:25 +02:00
sysfs.c
sysfs.h
transaction.c
btrfs: remove unused qgroup members from btrfs_trans_handle
2017-04-18 14:07:25 +02:00
transaction.h
btrfs: remove unused qgroup members from btrfs_trans_handle
2017-04-18 14:07:25 +02:00
tree-defrag.c
tree-log.c
btrfs: convert extent_map.refs from atomic_t to refcount_t
2017-04-18 14:07:23 +02:00
tree-log.h
ulist.c
ulist.h
uuid-tree.c
volumes.c
btrfs: drop redundant parameters from btrfs_map_sblock
2017-04-18 14:07:26 +02:00
volumes.h
btrfs: drop redundant parameters from btrfs_map_sblock
2017-04-18 14:07:26 +02:00
xattr.c
xattr.h
zlib.c
btrfs: derive maximum output size in the compression implementation
2017-02-28 14:26:36 +01:00