diff options
author | Dimitri John Ledkov <xnox@ubuntu.com> | 2016-08-11 12:45:00 +0100 |
---|---|---|
committer | Dimitri John Ledkov <xnox@ubuntu.com> | 2016-08-11 12:45:00 +0100 |
commit | ffd998be34a1a3d208106d051e85058ff9ac9667 (patch) | |
tree | 3f93a4a7362dcbdbadf5086e9404dc58ea22200a /volumes.c | |
parent | 3d69435ee3292b4b1db2d61c4784789d75883821 (diff) |
Imported Upstream version 4.7
Diffstat (limited to 'volumes.c')
-rw-r--r-- | volumes.c | 15 |
1 files changed, 12 insertions, 3 deletions
@@ -227,6 +227,8 @@ int btrfs_open_devices(struct btrfs_fs_devices *fs_devices, int flags) fd = open(device->name, flags); if (fd < 0) { ret = -errno; + error("cannot open device '%s': %s", device->name, + strerror(errno)); goto fail; } @@ -1759,6 +1761,8 @@ static int read_one_chunk(struct btrfs_root *root, struct btrfs_key *key, map->stripes[i].dev = fill_missing_device(devid); printf("warning, device %llu is missing\n", (unsigned long long)devid); + list_add(&map->stripes[i].dev->dev_list, + &root->fs_info->fs_devices->devices); } } @@ -2152,9 +2156,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); } } } |