Commit 3ba3ba1e authored by Joe Thornber's avatar Joe Thornber Committed by Mike Snitzer

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: default avatarJoe Thornber <ejt@redhat.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent 602548bd
...@@ -626,13 +626,19 @@ int sm_ll_open_metadata(struct ll_disk *ll, struct dm_transaction_manager *tm, ...@@ -626,13 +626,19 @@ int sm_ll_open_metadata(struct ll_disk *ll, struct dm_transaction_manager *tm,
void *root_le, size_t len) void *root_le, size_t len)
{ {
int r; int r;
struct disk_sm_root *smr = root_le; struct disk_sm_root smr;
if (len < sizeof(struct disk_sm_root)) { if (len < sizeof(struct disk_sm_root)) {
DMERR("sm_metadata root too small"); DMERR("sm_metadata root too small");
return -ENOMEM; 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); r = sm_ll_init(ll, tm);
if (r < 0) if (r < 0)
return r; return r;
...@@ -644,10 +650,10 @@ int sm_ll_open_metadata(struct ll_disk *ll, struct dm_transaction_manager *tm, ...@@ -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->max_entries = metadata_ll_max_entries;
ll->commit = metadata_ll_commit; ll->commit = metadata_ll_commit;
ll->nr_blocks = le64_to_cpu(smr->nr_blocks); ll->nr_blocks = le64_to_cpu(smr.nr_blocks);
ll->nr_allocated = le64_to_cpu(smr->nr_allocated); ll->nr_allocated = le64_to_cpu(smr.nr_allocated);
ll->bitmap_root = le64_to_cpu(smr->bitmap_root); ll->bitmap_root = le64_to_cpu(smr.bitmap_root);
ll->ref_count_root = le64_to_cpu(smr->ref_count_root); ll->ref_count_root = le64_to_cpu(smr.ref_count_root);
return ll->open_index(ll); return ll->open_index(ll);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment