Change in vdsm[master]: udev: Race fix- load and trigger dev rule(#891300)

vvolansk at redhat.com vvolansk at redhat.com
Tue Jan 8 13:08:40 UTC 2013


Hello Lee Yarwood,

I'd like you to do a code review.  Please visit

    http://gerrit.ovirt.org/10758

to review the following change.

Change subject: udev: Race fix- load and trigger dev rule(#891300)
......................................................................

udev: Race fix- load and trigger dev rule(#891300)

The rule file is generated, yet not synch-loaded in memory, so a VM with
a with a direct lun fails to start.
This patch inroduces two additional udev functions:
1. udevReloadRules() in supervdsmServer.py .
   This should be called before uderTrigger().
2. udevSettle() in supervdsmServer.py .
   This should be called after usedTrigger().
    is written but not sync loaded in memory.
These functions are now called before and after (in correspondance)
udevTrigger() in appropriateDevice() (hsm.py).
Also added a check in appropriateDevice() to make sure the mapping is
indeed there.

Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=891300
Change-Id: If3b2008a3d9df2dcaf54190721c2dd9764338627
Signed-off-by: Lee Yarwood <lyarwood at redhat.com>
Signed-off-by: Vered Volansky <vvolansk at redhat.com>
---
M vdsm/storage/hsm.py
M vdsm/supervdsmServer.py
2 files changed, 24 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/58/10758/1

diff --git a/vdsm/storage/hsm.py b/vdsm/storage/hsm.py
index 5584315..d7d44eb 100644
--- a/vdsm/storage/hsm.py
+++ b/vdsm/storage/hsm.py
@@ -2924,7 +2924,15 @@
         Warning: Internal use only.
         """
         supervdsm.getProxy().appropriateDevice(guid, thiefId)
+        supervdsm.getProxy().udevReloadRules(guid)
         supervdsm.getProxy().udevTrigger(guid)
+        supervdsm.getProxy().udevSettle(guid)
+        try:
+            devPath = '/dev/mapper/%s' % guid
+            fileUtils.validateQemuReadable(devPath)
+        except OSError:
+            self.log.error("Failed to appropriate device permission")
+            raise
 
     @public
     def inappropriateDevices(self, thiefId):
diff --git a/vdsm/supervdsmServer.py b/vdsm/supervdsmServer.py
index 486471c..ad73fa4 100755
--- a/vdsm/supervdsmServer.py
+++ b/vdsm/supervdsmServer.py
@@ -226,6 +226,14 @@
         return configNetwork.setSafeNetworkConfig()
 
     @logDecorator
+    def udevReloadRules(self, guid):
+        cmd = [EXT_UDEVADM, 'control', '--reload-rules']
+        rc, out, err = misc.execCmd(cmd, sudo=False)
+        if rc:
+            raise OSError(errno.EINVAL, "Could not reload-rules for device \
+                          %s, out %s\nerr %s" % (guid, out, err))
+
+    @logDecorator
     def udevTrigger(self, guid):
         cmd = [EXT_UDEVADM, 'trigger', '--verbose', '--action', 'change',
                '--property-match=DM_NAME=%s' % guid]
@@ -235,6 +243,14 @@
                           %s, out %s\nerr %s" % (guid, out, err))
 
     @logDecorator
+    def udevSettle(self, guid):
+        cmd = [EXT_UDEVADM, 'settle']
+        rc, out, err = misc.execCmd(cmd, sudo=False)
+        if rc:
+            raise OSError(errno.EINVAL, "Could not settle for device \
+                          %s, out %s\nerr %s" % (guid, out, err))
+
+    @logDecorator
     def appropriateDevice(self, guid, thiefId):
         ruleFile = _UDEV_RULE_FILE_NAME % (guid, thiefId)
         rule = 'SYMLINK=="mapper/%s", OWNER="%s", GROUP="%s"\n' % (guid,


--
To view, visit http://gerrit.ovirt.org/10758
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: If3b2008a3d9df2dcaf54190721c2dd9764338627
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Vered Volansky <vvolansk at redhat.com>
Gerrit-Reviewer: Lee Yarwood <lyarwood at redhat.com>


More information about the vdsm-patches mailing list