- improve loop support, fix geometry reporting on loopback devices:
parted-improve-loop-support.patch (bnc#726603) OBS-URL: https://build.opensuse.org/package/show/Base:System/parted?expand=0&rev=55
This commit is contained in:
parent
c61974b09f
commit
e059bebac4
157
parted-improve-loop-support.patch
Normal file
157
parted-improve-loop-support.patch
Normal file
@ -0,0 +1,157 @@
|
||||
Index: parted-2.4/NEWS
|
||||
===================================================================
|
||||
--- parted-2.4.orig/NEWS
|
||||
+++ parted-2.4/NEWS
|
||||
@@ -2,6 +2,10 @@ GNU parted NEWS
|
||||
|
||||
* Noteworthy changes in release 2.4 (2011-05-18) [stable]
|
||||
|
||||
+** New features
|
||||
+
|
||||
+ parted has improved support for partitionable loopback devices
|
||||
+
|
||||
** Bug fixes
|
||||
|
||||
parted no longer allows the modification of certain in-use partitions.
|
||||
Index: parted-2.4/include/parted/device.h
|
||||
===================================================================
|
||||
--- parted-2.4.orig/include/parted/device.h
|
||||
+++ parted-2.4/include/parted/device.h
|
||||
@@ -48,7 +48,8 @@ typedef enum {
|
||||
PED_DEVICE_SDMMC = 14,
|
||||
PED_DEVICE_VIRTBLK = 15,
|
||||
PED_DEVICE_AOE = 16,
|
||||
- PED_DEVICE_MD = 17
|
||||
+ PED_DEVICE_MD = 17,
|
||||
+ PED_DEVICE_LOOP = 18
|
||||
} PedDeviceType;
|
||||
|
||||
typedef struct _PedDevice PedDevice;
|
||||
Index: parted-2.4/libparted/arch/linux.c
|
||||
===================================================================
|
||||
--- parted-2.4.orig/libparted/arch/linux.c
|
||||
+++ parted-2.4/libparted/arch/linux.c
|
||||
@@ -586,7 +586,7 @@ _device_probe_type (PedDevice* dev)
|
||||
} else if (_is_virtblk_major(dev_major)) {
|
||||
dev->type = PED_DEVICE_VIRTBLK;
|
||||
} else if (dev_major == LOOP_MAJOR) {
|
||||
- dev->type = PED_DEVICE_FILE;
|
||||
+ dev->type = PED_DEVICE_LOOP;
|
||||
} else if (dev_major == MD_MAJOR) {
|
||||
dev->type = PED_DEVICE_MD;
|
||||
} else {
|
||||
@@ -1376,6 +1376,11 @@ linux_new (const char* path)
|
||||
goto error_free_arch_specific;
|
||||
break;
|
||||
|
||||
+ case PED_DEVICE_LOOP:
|
||||
+ if (!init_generic (dev, _("Loopback device")))
|
||||
+ goto error_free_arch_specific;
|
||||
+ break;
|
||||
+
|
||||
case PED_DEVICE_DM:
|
||||
{
|
||||
char* type;
|
||||
@@ -2411,6 +2416,61 @@ _blkpg_remove_partition (PedDisk* disk,
|
||||
BLKPG_DEL_PARTITION);
|
||||
}
|
||||
|
||||
+/* Read the integer from /sys/block/DEV_BASE/ENTRY and set *VAL
|
||||
+ to that value, where DEV_BASE is the last component of DEV->path.
|
||||
+ Upon success, return true. Otherwise, return false. */
|
||||
+static bool
|
||||
+_sysfs_int_entry_from_dev(PedDevice const* dev, const char *entry, int *val)
|
||||
+{
|
||||
+ char path[128];
|
||||
+ int r = snprintf(path, sizeof(path), "/sys/block/%s/%s",
|
||||
+ last_component(dev->path), entry);
|
||||
+ if (r < 0 || r >= sizeof(path))
|
||||
+ return false;
|
||||
+
|
||||
+ FILE *fp = fopen(path, "r");
|
||||
+ if (!fp)
|
||||
+ return false;
|
||||
+
|
||||
+ bool ok = fscanf(fp, "%d", val) == 1;
|
||||
+ fclose(fp);
|
||||
+
|
||||
+ return ok;
|
||||
+}
|
||||
+
|
||||
+/* Return the maximum number of partitions that the loopback device can hold.
|
||||
+ First, check the loop-module-exported max_part parameter (since linux-3.0).
|
||||
+ If that is not available, fall back to checking ext_range, which seems to
|
||||
+ have (for some reason) different semantics compared to other devices;
|
||||
+ specifically, ext_range <= 1 means that the loopback device does
|
||||
+ not support partitions. */
|
||||
+static unsigned int
|
||||
+_loop_get_partition_range(PedDevice const* dev)
|
||||
+{
|
||||
+ int max_part;
|
||||
+ bool ok = false;
|
||||
+
|
||||
+ /* max_part module param is exported since kernel 3.0 */
|
||||
+ FILE *fp = fopen("/sys/module/loop/parameters/max_part", "r");
|
||||
+ if (fp) {
|
||||
+ ok = fscanf(fp, "%d", &max_part) == 1;
|
||||
+ fclose(fp);
|
||||
+ }
|
||||
+
|
||||
+ if (ok)
|
||||
+ return max_part > 0 ? max_part : 0;
|
||||
+
|
||||
+ /*
|
||||
+ * max_part is not exported - check ext_range;
|
||||
+ * device supports partitions if ext_range > 1
|
||||
+ */
|
||||
+ int range;
|
||||
+ ok = _sysfs_int_entry_from_dev(dev, "range", &range);
|
||||
+
|
||||
+ return ok && range > 1 ? range : 0;
|
||||
+}
|
||||
+
|
||||
+
|
||||
/*
|
||||
* The number of partitions that a device can have depends on the kernel.
|
||||
* If we don't find this value in /sys/block/DEV/ext_range, we will use our own
|
||||
@@ -2419,22 +2479,12 @@ _blkpg_remove_partition (PedDisk* disk,
|
||||
static unsigned int
|
||||
_device_get_partition_range(PedDevice* dev)
|
||||
{
|
||||
- int range, r;
|
||||
- char path[128];
|
||||
- FILE* fp;
|
||||
- bool ok;
|
||||
-
|
||||
- r = snprintf(path, sizeof(path), "/sys/block/%s/ext_range",
|
||||
- last_component(dev->path));
|
||||
- if (r < 0 || r >= sizeof(path))
|
||||
- return MAX_NUM_PARTS;
|
||||
+ /* loop handling is special */
|
||||
+ if (dev->type == PED_DEVICE_LOOP)
|
||||
+ return _loop_get_partition_range(dev);
|
||||
|
||||
- fp = fopen(path, "r");
|
||||
- if (!fp)
|
||||
- return MAX_NUM_PARTS;
|
||||
-
|
||||
- ok = fscanf(fp, "%d", &range) == 1;
|
||||
- fclose(fp);
|
||||
+ int range;
|
||||
+ bool ok = _sysfs_int_entry_from_dev(dev, "ext_range", &range);
|
||||
|
||||
/* (range <= 0) is none sense.*/
|
||||
return ok && range > 0 ? range : MAX_NUM_PARTS;
|
||||
Index: parted-2.4/parted/parted.c
|
||||
===================================================================
|
||||
--- parted-2.4.orig/parted/parted.c
|
||||
+++ parted-2.4/parted/parted.c
|
||||
@@ -1464,7 +1464,7 @@ _print_disk_info (const PedDevice *dev,
|
||||
"cpqarray", "file", "ataraid", "i2o",
|
||||
"ubd", "dasd", "viodasd", "sx8", "dm",
|
||||
"xvd", "sd/mmc", "virtblk", "aoe",
|
||||
- "md"};
|
||||
+ "md", "loopback"};
|
||||
|
||||
char* start = ped_unit_format (dev, 0);
|
||||
PedUnit default_unit = ped_unit_get_default ();
|
@ -1,3 +1,9 @@
|
||||
-------------------------------------------------------------------
|
||||
Wed Oct 26 17:22:16 UTC 2011 - puzel@suse.com
|
||||
|
||||
- improve loop support, fix geometry reporting on loopback devices:
|
||||
parted-improve-loop-support.patch (bnc#726603)
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Sep 26 08:41:49 UTC 2011 - puzel@suse.com
|
||||
|
||||
|
@ -42,6 +42,7 @@ Patch12: more-reliable-informing-the-kernel.patch
|
||||
Patch13: parted-2.4-ncursesw6.patch
|
||||
Patch14: parted-gpt-sync-mbr-label.patch
|
||||
Patch15: parted-use-ext-range.patch
|
||||
Patch16: parted-improve-loop-support.patch
|
||||
Requires: /sbin/udevadm
|
||||
BuildRequires: check-devel
|
||||
BuildRequires: device-mapper-devel >= 1.02.33
|
||||
@ -107,6 +108,7 @@ to develop applications that require these.
|
||||
%patch13
|
||||
%patch14 -p1
|
||||
%patch15 -p1
|
||||
%patch16 -p1
|
||||
|
||||
%build
|
||||
export CFLAGS="%{optflags} `ncursesw6-config --cflags`"
|
||||
|
Loading…
x
Reference in New Issue
Block a user