diff options
author | Qu Wenruo <quwenruo@cn.fujitsu.com> | 2016-09-30 13:04:57 +0800 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2016-12-14 15:06:33 +0100 |
commit | c00278a9e8c72583105a29409809d43ca425dd00 (patch) | |
tree | f045ac13508a2a65b8cc66b4caaa85bff12e1c23 | |
parent | ef67f448c725f8ebc02660067e37911bd6dc8e4c (diff) |
btrfs-progs: volumes: Use new raid5_gen_result to calculate raid5 parity
Use thew raid5_gen_result() function to calculate raid5 parity.
Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r-- | volumes.c | 19 |
1 files changed, 6 insertions, 13 deletions
@@ -2136,7 +2136,6 @@ int write_raid56_with_parity(struct btrfs_fs_info *info, { struct extent_buffer **ebs, *p_eb = NULL, *q_eb = NULL; int i; - int j; int ret; int alloc_size = eb->len; void **pointers; @@ -2194,18 +2193,12 @@ int write_raid56_with_parity(struct btrfs_fs_info *info, raid6_gen_syndrome(multi->num_stripes, stripe_len, pointers); } else { ebs[multi->num_stripes - 1] = p_eb; - memcpy(p_eb->data, ebs[0]->data, stripe_len); - for (j = 1; j < multi->num_stripes - 1; j++) { - for (i = 0; i < stripe_len; i += sizeof(u64)) { - u64 p_eb_data; - u64 ebs_data; - - p_eb_data = get_unaligned_64(p_eb->data + i); - ebs_data = get_unaligned_64(ebs[j]->data + i); - p_eb_data ^= ebs_data; - put_unaligned_64(p_eb_data, p_eb->data + i); - } - } + for (i = 0; i < multi->num_stripes; i++) + pointers[i] = ebs[i]->data; + ret = raid5_gen_result(multi->num_stripes, stripe_len, + multi->num_stripes - 1, pointers); + if (ret < 0) + goto out_free_split; } for (i = 0; i < multi->num_stripes; i++) { |