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
28 Disks can have 4kB sectors now, so don't just bail out when that's the
\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
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
45 +unsigned int lcm(unsigned int x, unsigned int y);
\r
47 int disk_get_pci(int fd,
\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
58 +/************************************************************
\r
61 + * - numbers of which to find the lowest common multiple
\r
62 + * Modifies: nothing
\r
64 + * lowest common multiple of x and y
\r
65 + ************************************************************/
\r
67 +lcm(unsigned int x, unsigned int y)
\r
69 + unsigned int m = x, n = y, o;
\r
71 + while ((o = m % n)) {
\r
76 + return (x / n) * y;
\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
86 - void *mbr_unaligned;
\r
90 int this_bytes_read = 0;
\r
91 int gpt_invalid=0, mbr_invalid=0;
\r
93 int sector_size = get_sector_size(fd);
\r
95 - if (sizeof(*mbr) != sector_size)
\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
103 + mbr_size = lcm(sizeof(*mbr), sector_size);
\r
104 + if ((rc = posix_memalign(&mbr_sector, sector_size, mbr_size)) != 0)
\r
106 + memset(mbr_sector, '\0', mbr_size);
\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
113 goto error_free_mbr;
\r
115 + mbr = (legacy_mbr *)mbr_sector;
\r
116 gpt_invalid = gpt_disk_get_partition_info(fd, num,
\r
119 @@ -479,7 +501,8 @@ disk_get_partition_info (int fd,
\r
123 - free(mbr_unaligned);
\r
124 + free(mbr_sector);
\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
135 read_lba(int fd, uint64_t lba, void *buffer, size_t bytes)
\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
145 - if (bytes % sector_size)
\r
148 + size_t iobuf_size;
\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
160 + memset(iobuf, 0, bytes);
\r
163 - lseek(fd, offset, SEEK_SET);
\r
164 - bytesread = read(fd, aligned, bytes);
\r
165 - memcpy(buffer, aligned, bytesread);
\r
167 + lseek(fd, offset, SEEK_SET);
\r
168 + bytesread = read(fd, iobuf, iobuf_size);
\r
169 + memcpy(buffer, iobuf, bytes);
\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