[dm-devel] Re: [PATCH][RFC] Emulate BLKRRPART on device-mapper

Hannes Reinecke hare at suse.de
Wed Jul 22 07:06:08 UTC 2009


Milan Broz wrote:
> Alasdair G Kergon wrote:
>> On Wed, Jul 08, 2009 at 02:14:50PM +0530, Nikanth Karthikesan wrote:
>>   
>>> From: Hannes Reinecke <hare at suse.de>
>>> Subject: Emulate BLKRRPART on device-mapper
>>>
>>> Partitions on device-mapper devices are managed by kpartx (if at
>>> all). So if we were just to send out a 'change' event if someone
>>> called BLKRRPART on these devices, kpartx will be triggered via udev
>>> and can manage the partitions accordingly.
>>>
>>>     
>> Please could I have a 'Tested-by' for this one?
>>   
> I am afraid that this patch cannot work, BLRRPART never reach this code.
> I tried another idea - or is there better way how to achieve that?
> 
Hey, that is cool. And what's more, that's exactly what I need for another
pet-project of mine, switching off the in-kernel partitioning code altogether.

But there are some comments, see below.

> Milan
> ---
> 
> From: Milan Broz <mbroz at redhat.com>
> 
> Add genhd flag requesting notification of partition changes only.
> 
> This patch provides notification mechanism which allows handle partition
> code in userspace.
> 
> If the BLKRRPART ioctl arrives and GENHD_FL_PARTITION_CHANGE_NOTIFY
> is set, just send uevent and ignore in-kernel partitioning code.
> 
> This is useful e.g. for device-mapper devices, which can use kpartx
> or similar tool in udev rules.
> 
> Signed-off-by: Milan Broz <mbroz at redhat.com>
> ---
>  block/ioctl.c         |    3 ++-
>  drivers/md/dm.c       |    1 +
>  fs/partitions/check.c |    6 ++++++
>  include/linux/genhd.h |    8 ++++++++
>  4 files changed, 17 insertions(+), 1 deletions(-)
> 
> diff --git a/block/ioctl.c b/block/ioctl.c
> index 500e4c7..bce793f 100644
> --- a/block/ioctl.c
> +++ b/block/ioctl.c
> @@ -101,7 +101,8 @@ static int blkdev_reread_part(struct block_device *bdev)
>  	struct gendisk *disk = bdev->bd_disk;
>  	int res;
>  
> -	if (!disk_partitionable(disk) || bdev != bdev->bd_contains)
> +	if (!disk_userspace_partitions(disk) &&
> +	    (!disk_partitionable(disk) || bdev != bdev->bd_contains))
>  		return -EINVAL;
>  	if (!capable(CAP_SYS_ADMIN))
>  		return -EACCES;
> diff --git a/drivers/md/dm.c b/drivers/md/dm.c
> index 9acd54a..1186ce1 100644
> --- a/drivers/md/dm.c
> +++ b/drivers/md/dm.c
> @@ -1791,6 +1791,7 @@ static struct mapped_device *alloc_dev(int minor)
>  	md->disk->queue = md->queue;
>  	md->disk->private_data = md;
>  	sprintf(md->disk->disk_name, "dm-%d", minor);
> +	md->disk->flags |= GENHD_FL_PARTITION_CHANGE_NOTIFY;
>  	add_disk(md->disk);
>  	format_dev_t(md->name, MKDEV(_major, minor));
>  
> diff --git a/fs/partitions/check.c b/fs/partitions/check.c
> index ea4e6cb..bb42c44 100644
> --- a/fs/partitions/check.c
> +++ b/fs/partitions/check.c
> @@ -521,6 +521,12 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
>  	struct parsed_partitions *state;
>  	int p, highest, res;
>  
> +	/* partitions handled in userspace, just send change event */
> +	if (disk_userspace_partitions(disk)) {
> +		kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE);
> +		return 0;
> +	}
> +
Wrong. If you do it here, you'll never be able to catch any size changes
of the disk. You'll have to move it to after the 'bdev->bd_invalidated = 0'
line.

>  	if (bdev->bd_part_count)
>  		return -EBUSY;
>  	res = invalidate_partition(disk, 0);
> diff --git a/include/linux/genhd.h b/include/linux/genhd.h
> index 45fc320..a241bd6 100644
> --- a/include/linux/genhd.h
> +++ b/include/linux/genhd.h
> @@ -116,6 +116,9 @@ struct hd_struct {
>  #define GENHD_FL_EXT_DEVT			64 /* allow extended devt */
>  #define GENHD_FL_NATIVE_CAPACITY		128
>  
> +/* notify udev instead of use in-kernel partitioning */
> +#define GENHD_FL_PARTITION_CHANGE_NOTIFY	256
> +
I would suggest renaming it to GENHD_FL_USERSPACE_PARTITIONS, as this is
more in line with the function of the flag.
Plus I have a patch making use of it :-)

I'll send an adapted patchset.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		      zSeries & Storage
hare at suse.de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Markus Rex, HRB 16746 (AG Nürnberg)




More information about the dm-devel mailing list