[dm-devel] kpartx and udev problem

Hannes Reinecke hare at suse.de
Wed Jun 4 06:45:29 UTC 2008


Hi Ron,

On Tue, Jun 03, 2008 at 05:57:43PM -0400, Ron Peterson wrote:
> Hi,
> 
> I am having trouble getting kpartx to run reliably from udev.  My config
> files look like:
> ________________________________________________________________________
> /etc/udev/rules.d/z60_multipath.rules:
> 
> RUN+="socket:/org/kernel/dm/multipath_event"
> 
> ________________________________________________________________________
> /etc/udev/rules.d/z60_kpartx.rules:
> 
> KERNEL!="dm-*", GOTO="kpartx_end"
> ACTION=="remove", GOTO="kpartx_end"
> ACTION=="modify", GOTO="kpartx_end"
> 
> ACTION=="add", \
>     SUBSYSTEM=="block", \
>     KERNEL=="dm-*", \
>     PROGRAM="/sbin/devmap_name %M %m", \
>     RUN+="/sbin/kpartx -a /dev/mapper/%c"
> 
> LABEL="kpartx_end"
> 
> ##
> 
Ah, yes. That one :-)

> When I run 'multipath', my /dev/mapper directory looks something like:
> 
> brw-rw---- 1 root disk   253, 22 2008-06-03 12:21 db1
> brw-rw---- 1 root disk   253, 26 2008-06-03 12:21 db1p1
> brw-rw---- 1 root disk   253,  1 2008-06-03 12:21 db2
> brw-rw---- 1 root disk   253,  3 2008-06-03 12:21 db3
> brw-rw---- 1 root disk   253,  4 2008-06-03 12:21 db4
> brw-rw---- 1 root disk   253, 13 2008-06-03 12:21 f3a00
> brw-rw---- 1 root disk   253, 14 2008-06-03 12:21 f3a01
> etc...
> 
> All of these devices have one or more partitions; i.e. there should be a
> db2p1, and a db3p1, and so on.
> 
> As you can see, /some/ of my partitions are showing up, but others do not.
> 
> If I run kpartx manually, it works; e.g.
> 
> 1110# kpartx -a /dev/mapper/db2
> 
> 1111# ll /dev/mapper/db2*
> brw-rw---- 1 root disk 253,  1 2008-06-03 12:21 /dev/mapper/db2
> brw-rw---- 1 root disk 253, 33 2008-06-03 12:29 /dev/mapper/db2p1
> 
> I'm running multipath-tools version 0.4.8 on debian etch, running my own
> kernel, which at the moment is 2.6.25.4, but I've experienced the same
> trouble on other kernel versions.
> 
> Interestingly, on kernel 2.6.23.16 as it happens, I was able to make
> this work by wrapping kpartx in a little script called my_kpartx.sh like
> this:
> 
> #!/bin/sh
> (
> /bin/sleep 1
> /sbin/kpartx $1 $2
> ) &
> 
> Then, in my z60_kpartx.rules file, I called /sbin/my_kpartx rather than
> /sbin/kpartx.  This doesn't work in 2.6.25.4 though.
> 
> So that's my sad tale of woe.  Any suggestions that might cheer me up?
> 
Quite so.

Problem being the 'interesting' device-mapper design.
Whenever a 'table create' operation is triggered from user-space, it's
actually being broken down by the device-mapper library into 4 distinct
operations:
1. create device dm-X
2. suspend device
3. load table definition
4. resume device

and you'll be getting an 'add' event for the first operation, and a
'change' event for the second and the forth operation.
But clearly the 'add' event is pretty much pointless, as there is
not table loaded at that time, so you wouldn't know what to do with
it. And the device is locked between the second and the fourth
operation, so kpartx would refuse to touch it.

So, in essence: 'add' is evil for device-mapper devices.
Use the 'change' event and check if the dm-device is not suspended
when you get the event.

Or look at the current 'kpartx_id' script. That handles it properly.
(Of course it does. I wrote it :-)

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