Hi,
Timo Juhani Lindfors wrote:
> thanks for the report. I can reproduce the problem with the attached
> partition table image.
Thanks. When I try to reproduce this with "cfdisk parttable1.img"
(also with -g or overriding the C/H/S values), I get "FATAL ERROR:
Cannot get disk size". I guess I should be testing using a vm, but
I'm lazy. :)
Anyway, how about this patch for squeeze? Possible changelog entry:
* From upstream: cfdisk: don't use size of device based on cylinders.
Closes: #613589
Patch is against commit 5e5f7dac (changelog: release, 2011-01-25) from
git://git.debian.org/~lamont/util-linux.git. Seems to build fine,
though that doesn't mean much.
-- >8 --
From: Karel Zak <[email protected]>
Date: Mon, 6 Sep 2010 13:30:48 +0200
Subject: cfdisk: don't use size of device based on cylinders
commit 73356e0553bd9ac00f556891a4798064c0ee6849 upstream.
This patch is enough to make cfdisk usable on non-DOS disks where
partitioning is not based on CHS. cfdisk should not print error
messages for such disks.
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=630340
Signed-off-by: Karel Zak <[email protected]>
Signed-off-by: Jonathan Nieder <[email protected]>
---
fdisk/cfdisk.c | 17 +++++------------
1 files changed, 5 insertions(+), 12 deletions(-)
diff --git a/fdisk/cfdisk.c b/fdisk/cfdisk.c
index 4fb41529..5b9aaebe 100644
--- a/fdisk/cfdisk.c
+++ b/fdisk/cfdisk.c
@@ -177,7 +177,6 @@ int heads = 0;
int sectors = 0;
long long cylinders = 0;
int cylinder_size = 0; /* heads * sectors */
-long long total_size = 0; /* actual_size rounded down */
long long actual_size = 0; /* (in 512-byte sectors) - set using ioctl */
/* explicitly given user values */
int user_heads = 0, user_sectors = 0;
@@ -879,7 +878,7 @@ del_part(int i) {
if (i < num_parts - 1)
p_info[i].last_sector = p_info[i+1].first_sector - 1;
else
- p_info[i].last_sector = total_size - 1;
+ p_info[i].last_sector = actual_size - 1;
p_info[i].offset = 0;
p_info[i].flags = 0;
@@ -928,7 +927,7 @@ add_part(int num, int id, int flags, long long first, long
long last,
return -1;
}
- if (first >= total_size) {
+ if (first >= actual_size) {
*errmsg = _("Partition begins after end-of-disk");
return -1;
}
@@ -938,11 +937,6 @@ add_part(int num, int id, int flags, long long first, long
long last,
return -1;
}
- if (last >= total_size) {
- *errmsg = _("Partition ends in the final partial cylinder");
- return -1;
- }
-
for (i = 0; i < num_parts; i++) {
if (p_info[i].id > 0 && IS_PRIMARY(p_info[i].num))
pri++;
@@ -1637,8 +1631,7 @@ decide_on_geometry(void) {
if (user_cylinders > 0)
cylinders = user_cylinders;
- total_size = cylinder_size*cylinders;
- if (total_size > actual_size)
+ if (cylinder_size * cylinders > actual_size)
print_warning(_("You specified more cylinders than fit on disk"));
}
@@ -1646,7 +1639,7 @@ static void
clear_p_info(void) {
num_parts = 1;
p_info[0].first_sector = 0;
- p_info[0].last_sector = total_size - 1;
+ p_info[0].last_sector = actual_size - 1;
p_info[0].offset = 0;
p_info[0].flags = 0;
p_info[0].id = FREE_SPACE;
@@ -2429,7 +2422,7 @@ change_geometry(void) {
if (ret_val) {
long long disk_end;
- disk_end = total_size-1;
+ disk_end = actual_size-1;
if (p_info[num_parts-1].last_sector > disk_end) {
while (p_info[num_parts-1].first_sector > disk_end) {
--
1.7.9.rc2
--
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]