[Parted-maintainers] a problem about 100% indicating the whole disk

zhuyj zyjzyj2000 at gmail.com
Thu Oct 31 10:10:41 UTC 2013


Hi, maintainers

I came across an interesting thing.
When I allocated a vm of virtual box 50G disk. And I run parted with 
100% indicating the whole disk, it will fail.
I checked the source code. And I found that the following:

static PedGeometry*
geometry_from_centre_radius (const PedDevice* dev,
                              PedSector sector, PedSector radius)
{
         PedSector start = clip (dev, sector - radius);
         PedSector end = clip (dev, sector + radius);
         if (sector - end > radius || start - sector > 
radius)<-----After a series of calculations, sector is equal to 
dev->length, and end is equal to dev->length - 1
                 return NULL; <-----NULL will be returned
         return ped_geometry_new (dev, start, end - start + 1);
}

Thus parted will report the failure.

I checked the source code, and I found that it is difficult to modify. 
Since 100% mean to use the whole disk, so sector is correct to be equal 
to dev->length. And radius is equal to 0 since unit_size is power of 2.
So if we use 100% in the source code, it is difficult to avoid this failure.

Thus I made the following patch. The main object is to replace 100% with 
-1. Finally, this failure can be avoided.

diff -urpN unit_orig.c unit.c
--- unit_orig.c
+++ unit.c
@@ -516,7 +516,12 @@ ped_unit_parse_custom (const char* str,
      if (is_chs (str))
          return parse_chs (str, dev, sector, range);

-    copy = ped_strdup (str);
+    if ((strlen (str) == 4) && (strncmp (str, "100%", 4) == 0)){
+        copy = ped_strdup ("-1");
+    } else {
+        copy = ped_strdup (str);
+    }
+
      if (!copy)
          goto error;
      strip_string (copy);

Please comment about this patch. If you all want to see the process, I 
can provide the video. If you want to reproduce this problem, I can 
provide a iso file.

Thanks a lot.
Zhu Yanjun



More information about the Parted-maintainers mailing list