|
@@ -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);
|
|
|
}
|