mirror of
https://github.com/kdave/btrfs-progs
synced 2025-05-19 03:55:40 +00:00
btrfs-progs: fix unaligned access calculating raid56 data
The extent_buffer::data might be unaligned wrt unsigned long, depends on acutal layout of the structure and width of the int types. Use explicit unaligned access helpers. Reported-by: Anatoly Pugachev <matorola@gmail.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
1c47e5b039
commit
24f1713777
11
volumes.c
11
volumes.c
@ -2154,9 +2154,14 @@ int write_raid56_with_parity(struct btrfs_fs_info *info,
|
||||
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(unsigned long)) {
|
||||
*(unsigned long *)(p_eb->data + i) ^=
|
||||
*(unsigned long *)(ebs[j]->data + i);
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user