[parted-devel] [PATCH 1/3] Remove loop_get_partition_range

Petr Uzel petr.uzel at suse.cz
Fri Dec 2 09:07:14 UTC 2011


On Thu, Dec 01, 2011 at 04:28:10PM -0500, Phillip Susi wrote:
> Commit 1eb0cc30 added support for loop devices to be partitioned,
> but it only enabled that support if the kernel parameter max_part
> was non zero.  This parameter just reserves minor numbers for
> partitions in the traditional sequence that hard disks used.
> When it is zero, it is still possible to add partitions, they
> just will get minor numbers from another pool.  Removing this
> check allows partitions to be used on loop devices even when the
> loop module was not loaded with the max_part argument.

If you load loop module without max_part argument, the loop devices
will have their ext_range sysfs attributes == 1 (here on kernel-3.1),
so parted won't attempt to inform the kernel about the partitions. Do
I miss something?

> 
> Signed-off-by: Phillip Susi <psusi at cfl.rr.com>
> ---
>  libparted/arch/linux.c |   43 +++++--------------------------------------
>  1 files changed, 5 insertions(+), 38 deletions(-)
> 
> diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
> index 1da3343..aab2dd8 100644
> --- a/libparted/arch/linux.c
> +++ b/libparted/arch/linux.c
> @@ -2450,38 +2450,6 @@ _sysfs_int_entry_from_dev(PedDevice const* dev, const char *entry, int *val)
>          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
> @@ -2490,14 +2458,13 @@ _loop_get_partition_range(PedDevice const* dev)
>  static unsigned int
>  _device_get_partition_range(PedDevice const* dev)
>  {
> -        /* loop handling is special */
> -        if (dev->type == PED_DEVICE_LOOP)
> -                return _loop_get_partition_range(dev);
> -
>          int range;
>          bool ok = _sysfs_int_entry_from_dev(dev, "ext_range", &range);
> -
> -        return ok && range > 0 ? range : MAX_NUM_PARTS;
> +	
> +	if (!ok)
> +		return MAX_NUM_PARTS;
> +	/* both 0 and 1 mean no partitions */
> +        return range > 1 ? range : 0;
>  }
>  
>  /*
> -- 
> 1.7.5.4
> 
> 

Petr

--
Petr Uzel
IRC: ptr_uzl @ freenode



More information about the parted-devel mailing list