[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [dm-devel] [PATCH] multipathd: Don't mark a virtio_blk path offline if it has no sysfs "state" attribute



On 05/05/2011 08:32 AM, Martin Schwenke wrote:
multipathd currently marks paths as down if they don't have a sysfs
"state" attribute.

Unfortunately, this makes multipathd unusable with Linux virtio_blk
devices, since they don't have this attribute.  I need to use multipath
with virtio for consistency with a real configuration when testing a
clustered NAS system - yeah, I'm that guy again...  :-)

One way of working around this might be to have path_offline() return
PATH_UP for all devices that don't have a sysfs "state" attribute,
instead of PATH_WILD.  However, I'm guessing the current behaviour might
exist for a reason.

The following patch makes path_offline() always return PATH_UP instead
of PATH_WILD for virtio_blk devices.  I've implemented the nested if
statements as below to change the code flow as little as possible
when sysfs_get_state() actually succeeds, which I assume is usually the
case.   If nobody is feeling paranoid then the check for virtio_blk
could obviously be done before the call to sysfs_get_state().

If people think this patch is too specific then at least it can be
used to start a discussion...  ;-)

Argl. They messed it up _again_.
(Speaking as someone who is in the process of cleaning up his patch queue for multipath. Should have done that _far_ earlier :-( )

path_offline() _absolutely_ requires a check if the device is actually a SCSI device. We do have several others to contend with (cciss, dasd), and none of those do have the 'state' attribute.

So we need this patch

diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index 6cd2ec9..4af0cd3 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -645,6 +645,10 @@ path_offline (struct path * pp)
        struct sysfs_device * parent;
        char buff[SCSI_STATE_SIZE];

+       if (pp->bus != SYSFS_BUS_SCSI)
+               /* No information for non-SCSI devices, return UP */
+               return PATH_UP;
+
        pp->sysdev = sysfs_device_from_path(pp);
        if (!pp->sysdev) {
condlog(1, "%s: failed to get sysfs information", pp->dev);

And you need to implement virtio_blk as it's own bus type.
(Say SYSFS_BUS_VIRTIO). And teach discovery.c to detect this one properly.
Look at 'cciss' and 'dasd' on how that's done.

Cheers,

Hannes
--
Dr. Hannes Reinecke		      zSeries & Storage
hare suse de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]