Make kpartx correctly handle non-512 byte GPT
authorBenjamin Marzinski <bmarzins@redhat.com>
Thu, 2 May 2013 21:46:23 +0000 (16:46 -0500)
committerChristophe Varoqui <christophe.varoqui@opensvc.com>
Mon, 6 May 2013 19:39:55 +0000 (21:39 +0200)
The gpt code in kpartx correctly handled non-512 byte gpt
partitions right up until it was time to actually write out the
slice data. At that point it forgot to convert the logical block
address into a the proper slice offset. This patch fixes that.

Signed-off-by: Philipp Schmidt <philipp@ppc.in-berlin.de>
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
kpartx/gpt.c

index 3082cae..0a22927 100644 (file)
@@ -637,6 +637,7 @@ read_gpt_pt (int fd, struct slice all, struct slice *sp, int ns)
        uint32_t i;
        int n = 0;
         int last_used_index=-1;
        uint32_t i;
        int n = 0;
         int last_used_index=-1;
+       int sector_size_mul = get_sector_size(fd)/512;
 
        if (!find_valid_gpt (fd, &gpt, &ptes) || !gpt || !ptes) {
                if (gpt)
 
        if (!find_valid_gpt (fd, &gpt, &ptes) || !gpt || !ptes) {
                if (gpt)
@@ -652,9 +653,11 @@ read_gpt_pt (int fd, struct slice all, struct slice *sp, int ns)
                        sp[n].size = 0;
                        n++;
                } else {
                        sp[n].size = 0;
                        n++;
                } else {
-                       sp[n].start = __le64_to_cpu(ptes[i].starting_lba);
-                       sp[n].size  = __le64_to_cpu(ptes[i].ending_lba) -
-                               __le64_to_cpu(ptes[i].starting_lba) + 1;
+                       sp[n].start = sector_size_mul *
+                                     __le64_to_cpu(ptes[i].starting_lba);
+                       sp[n].size  = sector_size_mul *
+                                     (__le64_to_cpu(ptes[i].ending_lba) -
+                                      __le64_to_cpu(ptes[i].starting_lba) + 1);
                         last_used_index=n;
                        n++;
                }
                         last_used_index=n;
                        n++;
                }