mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-23 09:56:00 +00:00
dm space map common: memcpy the disk root to ensure it's arch aligned
The metadata_space_map_root passed to sm_ll_open_metadata() may or may not be arch aligned, use memcpy to ensure it is. This is not a fast path so the extra memcpy doesn't hurt us. Long-term it'd be better to use the kernel's alignment infrastructure to remove the memcpy()s that are littered across persistent-data (btree, array, space-maps, etc). Signed-off-by: Joe Thornber <ejt@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
parent
602548bdd5
commit
3ba3ba1e84
@ -626,13 +626,19 @@ int sm_ll_open_metadata(struct ll_disk *ll, struct dm_transaction_manager *tm,
|
||||
void *root_le, size_t len)
|
||||
{
|
||||
int r;
|
||||
struct disk_sm_root *smr = root_le;
|
||||
struct disk_sm_root smr;
|
||||
|
||||
if (len < sizeof(struct disk_sm_root)) {
|
||||
DMERR("sm_metadata root too small");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/*
|
||||
* We don't know the alignment of the root_le buffer, so need to
|
||||
* copy into a new structure.
|
||||
*/
|
||||
memcpy(&smr, root_le, sizeof(smr));
|
||||
|
||||
r = sm_ll_init(ll, tm);
|
||||
if (r < 0)
|
||||
return r;
|
||||
@ -644,10 +650,10 @@ int sm_ll_open_metadata(struct ll_disk *ll, struct dm_transaction_manager *tm,
|
||||
ll->max_entries = metadata_ll_max_entries;
|
||||
ll->commit = metadata_ll_commit;
|
||||
|
||||
ll->nr_blocks = le64_to_cpu(smr->nr_blocks);
|
||||
ll->nr_allocated = le64_to_cpu(smr->nr_allocated);
|
||||
ll->bitmap_root = le64_to_cpu(smr->bitmap_root);
|
||||
ll->ref_count_root = le64_to_cpu(smr->ref_count_root);
|
||||
ll->nr_blocks = le64_to_cpu(smr.nr_blocks);
|
||||
ll->nr_allocated = le64_to_cpu(smr.nr_allocated);
|
||||
ll->bitmap_root = le64_to_cpu(smr.bitmap_root);
|
||||
ll->ref_count_root = le64_to_cpu(smr.ref_count_root);
|
||||
|
||||
return ll->open_index(ll);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user