incorporate Fedora patch for sector sizes > 512 bytes
[debian/efibootmgr] / debian / patches / efibootmgr-0.5.4-support-4k-sectors.patch
1 Return-Path: pjones@redhat.com\r
2 Received: from zmta02.collab.prod.int.phx2.redhat.com (LHLO\r
3  zmta02.collab.prod.int.phx2.redhat.com) (10.5.5.32) by\r
4  mail04.corp.redhat.com with LMTP; Wed, 14 Jul 2010 14:25:52 -0400 (EDT)\r
5 Received: from localhost (localhost.localdomain [127.0.0.1])\r
6         by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id B69C19F152\r
7         for <pjones@redhat.com>; Wed, 14 Jul 2010 14:25:52 -0400 (EDT)\r
8 Received: from zmta02.collab.prod.int.phx2.redhat.com ([127.0.0.1])\r
9         by localhost (zmta02.collab.prod.int.phx2.redhat.com [127.0.0.1]) (amavisd-new, port 10024)\r
10         with ESMTP id jCHcGZehMQ5J for <pjones@redhat.com>;\r
11         Wed, 14 Jul 2010 14:25:52 -0400 (EDT)\r
12 Received: from int-mx08.intmail.prod.int.phx2.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.21])\r
13         by zmta02.collab.prod.int.phx2.redhat.com (Postfix) with ESMTP id A601C9F14C\r
14         for <pjones@mail.corp.redhat.com>; Wed, 14 Jul 2010 14:25:52 -0400 (EDT)\r
15 Received: from pjones4.install.bos.redhat.com (pjones4.install.bos.redhat.com [10.16.52.154])\r
16         by int-mx08.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o6EIPpGh017771;\r
17         Wed, 14 Jul 2010 14:25:52 -0400\r
18 From: Peter Jones <pjones@redhat.com>\r
19 To: Matt Domsch <Matt_Domsch@dell.com>\r
20 Cc: Peter Jones <pjones@redhat.com>, Stuart Hayes <stuart_hayes@dell.com>\r
21 Subject: [efibootmgr patch] Handle sector_size != 512.\r
22 Date: Wed, 14 Jul 2010 14:26:49 -0400\r
23 Message-Id: <1279132009-26635-1-git-send-email-pjones@redhat.com>\r
24 In-Reply-To: <1279121617-17961-1-git-send-email-pjones@redhat.com>\r
25 References: <1279121617-17961-1-git-send-email-pjones@redhat.com>\r
26 X-Scanned-By: MIMEDefang 2.67 on 10.5.11.21\r
27 \r
28 Disks can have 4kB sectors now, so don't just bail out when that's the\r
29 case.\r
30 ---\r
31  src/include/disk.h |    3 +++\r
32  src/lib/disk.c     |   43 +++++++++++++++++++++++++++++++++----------\r
33  src/lib/gpt.c      |   30 ++++++++++++++----------------\r
34  3 files changed, 50 insertions(+), 26 deletions(-)\r
35 \r
36 diff --git a/src/include/disk.h b/src/include/disk.h\r
37 index eb93d10..8aa37d7 100644\r
38 --- a/src/include/disk.h\r
39 +++ b/src/include/disk.h\r
40 @@ -65,6 +65,9 @@ enum _interface_type {interface_type_unknown,\r
41                       ata, atapi, scsi, usb,\r
42                       i1394, fibre, i2o, md};\r
43  \r
44 +\r
45 +unsigned int lcm(unsigned int x, unsigned int y);\r
46 +\r
47  int disk_get_pci(int fd,\r
48                  unsigned char *bus,\r
49                  unsigned char *device,\r
50 diff --git a/src/lib/disk.c b/src/lib/disk.c\r
51 index 883864f..9c3a878 100644\r
52 --- a/src/lib/disk.c\r
53 +++ b/src/lib/disk.c\r
54 @@ -420,6 +420,27 @@ get_sector_size(int filedes)\r
55         return sector_size;\r
56  }\r
57  \r
58 +/************************************************************\r
59 + * lcm\r
60 + * Requires:\r
61 + * - numbers of which to find the lowest common multiple\r
62 + * Modifies: nothing\r
63 + * Returns:\r
64 + *  lowest common multiple of x and y\r
65 + ************************************************************/\r
66 +unsigned int\r
67 +lcm(unsigned int x, unsigned int y)\r
68 +{\r
69 +       unsigned int m = x, n = y, o;\r
70 +\r
71 +       while ((o = m % n)) {\r
72 +               m = n;\r
73 +               n = o;\r
74 +       }\r
75 +\r
76 +       return (x / n) * y;\r
77 +}\r
78 +\r
79  /**\r
80   * disk_get_partition_info()\r
81   *  @fd - open file descriptor to disk\r
82 @@ -442,26 +463,27 @@ disk_get_partition_info (int fd,\r
83                          uint8_t *mbr_type, uint8_t *signature_type)\r
84  {\r
85         legacy_mbr *mbr;\r
86 -       void *mbr_unaligned;\r
87 +       void *mbr_sector;\r
88 +       size_t mbr_size;\r
89         off_t offset;\r
90         int this_bytes_read = 0;\r
91         int gpt_invalid=0, mbr_invalid=0;\r
92         int rc=0;\r
93         int sector_size = get_sector_size(fd);\r
94  \r
95 -       if (sizeof(*mbr) != sector_size)\r
96 -               return 1;\r
97 -       mbr_unaligned = malloc(sizeof(*mbr)+sector_size-1);\r
98 -       mbr = (legacy_mbr *)\r
99 -               (((unsigned long)mbr_unaligned + sector_size - 1) &\r
100 -                ~(unsigned long)(sector_size-1));\r
101 -       memset(mbr, 0, sizeof(*mbr));\r
102 +\r
103 +       mbr_size = lcm(sizeof(*mbr), sector_size);\r
104 +       if ((rc = posix_memalign(&mbr_sector, sector_size, mbr_size)) != 0)\r
105 +               goto error;\r
106 +       memset(mbr_sector, '\0', mbr_size);\r
107 +\r
108         offset = lseek(fd, 0, SEEK_SET);\r
109 -       this_bytes_read = read(fd, mbr, sizeof(*mbr));\r
110 +       this_bytes_read = read(fd, mbr_sector, mbr_size);\r
111         if (this_bytes_read < sizeof(*mbr)) {\r
112                 rc=1;\r
113                 goto error_free_mbr;\r
114         }\r
115 +       mbr = (legacy_mbr *)mbr_sector;\r
116         gpt_invalid = gpt_disk_get_partition_info(fd, num,\r
117                                                   start, size,\r
118                                                   signature,\r
119 @@ -479,7 +501,8 @@ disk_get_partition_info (int fd,\r
120                 }\r
121         }\r
122   error_free_mbr:\r
123 -       free(mbr_unaligned);\r
124 +       free(mbr_sector);\r
125 + error:\r
126         return rc;\r
127  }\r
128  \r
129 diff --git a/src/lib/gpt.c b/src/lib/gpt.c\r
130 index d90ddaf..83e7a94 100644\r
131 --- a/src/lib/gpt.c\r
132 +++ b/src/lib/gpt.c\r
133 @@ -215,26 +215,24 @@ read_lastoddsector(int fd, uint64_t lba, void *buffer, size_t count)\r
134  static ssize_t\r
135  read_lba(int fd, uint64_t lba, void *buffer, size_t bytes)\r
136  {\r
137 -       int sector_size = get_sector_size(fd);\r
138 -       off_t offset = lba * sector_size;\r
139 +        int sector_size = get_sector_size(fd);\r
140 +        off_t offset = lba * sector_size;\r
141          ssize_t bytesread;\r
142 -        void *aligned;\r
143 -        void *unaligned;\r
144 -\r
145 -        if (bytes % sector_size)\r
146 -                return EINVAL;\r
147 +        void *iobuf;\r
148 +        size_t iobuf_size;\r
149 +        int rc;\r
150  \r
151 -       unaligned = malloc(bytes+sector_size-1);\r
152 -       aligned = (void *)\r
153 -               (((unsigned long)unaligned + sector_size - 1) &\r
154 -                ~(unsigned long)(sector_size-1));\r
155 -       memset(aligned, 0, bytes);\r
156 +        iobuf_size = lcm(bytes, sector_size);\r
157 +        rc = posix_memalign(&iobuf, sector_size, iobuf_size);\r
158 +        if (rc)\r
159 +                return rc;\r
160 +        memset(iobuf, 0, bytes);\r
161  \r
162  \r
163 -       lseek(fd, offset, SEEK_SET);\r
164 -       bytesread = read(fd, aligned, bytes);\r
165 -        memcpy(buffer, aligned, bytesread);\r
166 -        free(unaligned);\r
167 +        lseek(fd, offset, SEEK_SET);\r
168 +        bytesread = read(fd, iobuf, iobuf_size);\r
169 +        memcpy(buffer, iobuf, bytes);\r
170 +        free(iobuf);\r
171  \r
172          /* Kludge.  This is necessary to read/write the last\r
173             block of an odd-sized disk, until Linux 2.5.x kernel fixes.\r
174 -- \r
175 1.7.1.1\r
176 \r