]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/md/persistent-data/dm-space-map-common.c
Merge branches 'for-4.11/upstream-fixes', 'for-4.12/accutouch', 'for-4.12/cp2112...
[mirror_ubuntu-artful-kernel.git] / drivers / md / persistent-data / dm-space-map-common.c
index 4c28608a0c94938d7925fbd63ab51e152c0f2a2c..829b4ce057d8cbaa873a6cfdd2cbc1ed934b5e18 100644 (file)
@@ -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);
 }