From f98f791e19669b900345dad7d96ea4df974e4596 Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Wed, 4 Feb 2015 16:46:07 -0800 Subject: [PATCH] libparted: device mapper uses 512b sectors device mapper doesn't use the device's sector size when creating a table. It always uses 512b units. This causes partitions to be created 8x smaller than expected on devices with 4906b sectors. --- NEWS | 4 ++++ libparted/arch/linux.c | 21 +++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) Index: parted-3.2/NEWS =================================================================== --- parted-3.2.orig/NEWS +++ parted-3.2/NEWS @@ -162,6 +162,10 @@ GNU parted NEWS ** Bug Fixes + Use 512b sector size when communicating with device-mapper. Fixes + problems with partitions being created too small on dm devices + with sector sizes > 5121b + Don't crash in the disk_set command when a disk label is not found libparted-fs-resize: Prevent crash resizing FAT16 file systems. Index: parted-3.2/libparted/arch/linux.c =================================================================== --- parted-3.2.orig/libparted/arch/linux.c +++ parted-3.2/libparted/arch/linux.c @@ -2768,6 +2768,12 @@ _dm_get_partition_start_and_length(PedPa if (sscanf (params, "%d:%d %Ld", &major, &minor, start) != 3) goto err; rc = 1; + + /* device-mapper uses 512b units, make sure we return length and start in terms of the device's + * sector size. + */ + *start /= (part->disk->dev->sector_size / PED_SECTOR_SIZE_DEFAULT); + *length /= (part->disk->dev->sector_size / PED_SECTOR_SIZE_DEFAULT); err: free (path); dm_task_destroy(task); @@ -2815,8 +2821,10 @@ _dm_add_partition (PedDisk* disk, const /* Caution: dm_task_destroy frees dev_name. */ dm_task_destroy (task); task = NULL; + /* device-mapper uses 512b units, not the device's sector size */ if ( ! (params = zasprintf ("%d:%d %lld", arch_specific->major, - arch_specific->minor, part->geom.start))) + arch_specific->minor, + part->geom.start * (disk->dev->sector_size / PED_SECTOR_SIZE_DEFAULT)))) goto err; task = dm_task_create (DM_DEVICE_CREATE); @@ -2826,7 +2834,8 @@ _dm_add_partition (PedDisk* disk, const dm_task_set_name (task, vol_name); if (vol_uuid) dm_task_set_uuid (task, vol_uuid); - dm_task_add_target (task, 0, part->geom.length, + /* device-mapper uses 512b units, not the device's sector size */ + dm_task_add_target (task, 0, part->geom.length * (disk->dev->sector_size / PED_SECTOR_SIZE_DEFAULT), "linear", params); if (!dm_task_set_cookie (task, &cookie, 0)) goto err; @@ -2883,8 +2892,11 @@ _dm_resize_partition (PedDisk* disk, con /* Caution: dm_task_destroy frees dev_name. */ dm_task_destroy (task); task = NULL; + + /* device-mapper uses 512b units, not the device's sector size */ if ( ! (params = zasprintf ("%d:%d %lld", arch_specific->major, - arch_specific->minor, part->geom.start))) + arch_specific->minor, + part->geom.start * (disk->dev->sector_size / PED_SECTOR_SIZE_DEFAULT)))) goto err; task = dm_task_create (DM_DEVICE_RELOAD); @@ -2892,7 +2904,8 @@ _dm_resize_partition (PedDisk* disk, con goto err; dm_task_set_name (task, vol_name); - dm_task_add_target (task, 0, part->geom.length, + /* device-mapper uses 512b units, not the device's sector size */ + dm_task_add_target (task, 0, part->geom.length * (disk->dev->sector_size / PED_SECTOR_SIZE_DEFAULT), "linear", params); if (!dm_task_set_cookie (task, &cookie, 0)) goto err;