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 <[email protected]> > --- > 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

