summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhillip Susi <psusi@ubuntu.com>2014-04-26 19:27:00 -0400
committerPhillip Susi <psusi@ubuntu.com>2014-05-22 19:56:36 -0400
commit7cde99849ed321da2712248bc27c14a954d6b481 (patch)
tree9719e12b956186bd92e3af7a12a473c61214076b
parentec0b631c43ced29a05557d911bbf57110d0b7ae3 (diff)
downloadparted-7cde99849ed321da2712248bc27c14a954d6b481.tar.gz
libparted: give correct partition device name on loop labels
ped_partition_get_path() was returning "/dev/foo1" instead of "/dev/foo" on loop labels. This caused gparted to run tools like mkfs on a device node that did not actually exist.
-rw-r--r--NEWS3
-rw-r--r--libparted/arch/linux.c10
2 files changed, 11 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 40ec2d0..cfda7bf 100644
--- a/NEWS
+++ b/NEWS
@@ -29,6 +29,9 @@ GNU parted NEWS -*- outline -*-
** Bug Fixes
+ libparted: ped_partition_get_path() was returning "/dev/foo1" instead
+ of "/dev/foo" for loop labels.
+
partprobe: when called on a disk that has become a loop label,
remove any partitions left over from a previous label.
diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
index 9ae6d64..f2e2abc 100644
--- a/libparted/arch/linux.c
+++ b/libparted/arch/linux.c
@@ -48,6 +48,7 @@
#include "../architecture.h"
#include "dirname.h"
#include "xstrtol.h"
+#include "xalloc.h"
#if ENABLE_NLS
# include <libintl.h>
@@ -2356,6 +2357,9 @@ _device_get_part_path (PedDevice const *dev, int num)
static char*
linux_partition_get_path (const PedPartition* part)
{
+ /* loop label means use the whole disk */
+ if (strcmp (part->disk->type->name, "loop") == 0)
+ return xstrdup (part->disk->dev->path);
return _device_get_part_path (part->disk->dev, part->num);
}
@@ -2424,6 +2428,8 @@ linux_partition_is_busy (const PedPartition* part)
PED_ASSERT (part != NULL);
+ if (strcmp (part->disk->type->name, "loop") == 0)
+ return linux_is_busy (part->disk->dev);
if (_partition_is_mounted (part))
return 1;
if (part->type == PED_PARTITION_EXTENDED) {
@@ -2546,7 +2552,7 @@ _sysfs_ull_entry_from_part(PedPartition const* part, const char *entry,
unsigned long long *val)
{
char path[128];
- char *part_name = linux_partition_get_path(part);
+ char *part_name = _device_get_part_path (part->disk->dev, part->num);
if (!part_name)
return false;
@@ -2581,7 +2587,7 @@ _kernel_get_partition_start_and_length(PedPartition const *part,
PED_ASSERT(start);
PED_ASSERT(length);
- char *dev_name = linux_partition_get_path (part);
+ char *dev_name = _device_get_part_path (part->disk->dev, part->num);
if (!dev_name)
return false;