Hello community,

here is the log from the commit of package parted for openSUSE:12.1 checked in 
at 2011-10-27 13:51:22
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:12.1/parted (Old)
 and      /work/SRC/openSUSE:12.1/.parted.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "parted", Maintainer is "pu...@suse.com"

Changes:
--------
--- /work/SRC/openSUSE:12.1/parted/parted.changes       2011-10-24 
13:14:37.000000000 +0200
+++ /work/SRC/openSUSE:12.1/.parted.new/parted.changes  2011-10-28 
17:11:44.000000000 +0200
@@ -1,0 +2,6 @@
+Wed Oct 26 17:22:16 UTC 2011 - pu...@suse.com
+
+- improve loop support, fix geometry reporting on loopback devices:
+  parted-improve-loop-support.patch (bnc#726603)
+
+-------------------------------------------------------------------

New:
----
  parted-improve-loop-support.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ parted.spec ++++++
--- /var/tmp/diff_new_pack.FxCsmh/_old  2011-10-28 17:11:44.000000000 +0200
+++ /var/tmp/diff_new_pack.FxCsmh/_new  2011-10-28 17:11:44.000000000 +0200
@@ -42,6 +42,7 @@
 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 @@
 %patch13
 %patch14 -p1
 %patch15 -p1
+%patch16 -p1
 
 %build
 export CFLAGS="%{optflags} `ncursesw6-config --cflags`"

++++++ parted-improve-loop-support.patch ++++++
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 ();
-- 
To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org
For additional commands, e-mail: opensuse-commit+h...@opensuse.org

Reply via email to