[dm-devel] ioctl failed when parted operated on device active bydmraid?

Lin, Weichuan weichuan.lin at intel.com
Wed Aug 31 02:11:34 UTC 2005



>-----Original Message-----
>From: dm-devel-bounces at redhat.com [mailto:dm-devel-bounces at redhat.com]
On
>Behalf Of Lin, Weichuan
>Sent: Tuesday, August 30, 2005 10:25 AM
>To: dm-devel at redhat.com
>Subject: [dm-devel] ioctl failed when parted operated on device active
>bydmraid?
>
>Hi All
>
>I have a machine with chips of silicon image 3114 and ICH7R on the
>motherboard [I can choose one of them to connect the hard disk], and
two
>SATA hard disks, I am going to enable one of this chips at Fedora
>installation stage. What I have done is copy the dmraid static link
>version to stage2.img of anaconda, and patched the patch below to
>anaconda. This patch is gotten from the mail list of anaconda; I just
>changed the regular expression match [parameter of re.match()] to meet
>the actual output of the dmraid on my machine. After done this, I can
>choose the device of /dev/mapper/sil* to slice partition for
>installation. But the operation of parted always fails, I have trace
>into the program, and find that ped_disk_commit_to_os() failed due to
>failure of ioctl with BLKPG request. The error is reported as Invalid
>argument, then an exception is thrown in function of
>_blkpg_add_partition(). The installation procedure has to hang due to
>this failure.

After some investigations, I found that the BLKPG ioctl failure is
caused by the wrong minor number of the disk (disk->minors). Its value
is 1, which means that this disk can't be partitioned. By contrast, the
value of a physical disk is 16, when this value is set? Why 1, not 16?

>
>On the other hand, if I use parted on an installed system to slice
>partition on /dev/mapper/sil* created by dmraid, parted also complains
>that he can't notify to the system about the change of the disk
>partition. If I connect the hard disks to the ICH7R chips, the dmraid
>even can't create /dev/mapper/isw*. With -tay option, dmraid told me
>that the GROUP ok, but the device can't be seen under /dev/mapper.
>
>Here is the patch provided by Wormgoor, which enable the support of
>dmraid during anaconda installer running, with a little change of
>regular
>expression match and argument.
>
>+# dmraid.py - dmraid probing
>+#
>+# Mark Wormgoor <mark wormgoor com>
>+#
>+# Copyright 2004 Mark Wormgoor
>+#
>+# This software may be freely redistributed under the terms of the GNU
>+# general public license.
>+#
>+# You should have received a copy of the GNU General Public License
>+# along with this program; if not, write to the Free Software
>+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
>+
>+import iutil
>+import os
>+import re
>+
>+from constants import *
>+
>+output = "/tmp/dmraidout"
>+
>+dmraidDevicePresent = 0
>+
>+def has_dmraid():
>+    global dmraidDevicePresent
>+
>+    if not (os.access("/usr/sbin/dmraid", os.X_OK) or
>+            os.access("/sbin/dmraid", os.X_OK)):
>+        return
>+
>+    rc = iutil.execWithRedirect("dmraid",
>+                                ["dmraid", "-ay"],
>+                                stdout = output,
>+                                stderr = output,
>+                                searchPath = 1)
>+    if rc:
>+        dmraidDevicePresent = 0
>+    else:
>+	dmraidDevicePresent = 1
>+
>+    return dmraidDevicePresent
>+# now check to see if dmraid is available
>+has_dmraid()
>+
>+
>+def disklist():
>+    global dmraidDevicePresent
>+    if dmraidDevicePresent == 0:
>+        return []
>+
>+    disks = []
>+    args = ["dmraid", "-vay"]
>+    dmraidscanout = iutil.execWithCapture(args[0], args, searchPath =
>1,
>+                                      stderr = "/dev/tty6")
>+    for line in dmraidscanout.split("\n"):
>+        try:
>+	    found = re.match("/dev/(\S+)", line)
>+	    disks.append (found.group(1))
>+        except:
>+            pass
>+
>+    return disks
>+
>+def setlist():
>+    global dmraidDevicePresent
>+    if dmraidDevicePresent == 0:
>+        return []
>+
>+    sets = []
>+    args = ["dmraid", "-vay"]
>+    dmraidscanout = iutil.execWithCapture(args[0], args, searchPath =
>1,
>+                                      stderr = "/dev/tty6")
>+    for line in dmraidscanout.split("\n"):
>+        try:
>+	    found = re.match("INFO: added /dev/(\S+) to RAID set
>\"(\S+)\"", line)
>+	    sets.append (found.group(2))
>+        except:
>+	    pass
>+
>+    return sets
>diff -ruN mnt/usr/lib/anaconda/isys.py new/usr/lib/anaconda/isys.py
>--- mnt/usr/lib/anaconda/isys.py	1970-01-01 01:00:00.000000000
>+0100
>+++ new/usr/lib/anaconda/isys.py	2004-10-10 21:06:58.000000000
>+0200
>@@ -20,6 +20,7 @@
> import os
> import os.path
> import posix
>+import dmraid
> import sys
> import kudzu
>
>@@ -288,6 +289,20 @@
>
>     dict = driveDict("disk")
>
>+    # first, figure out the dmraid devices
>+    if dmraid.has_dmraid():
>+	disks = dmraid.disklist()
>+	if len(disks) > 0:
>+	    for disk in disks:
>+		try:
>+		    del dict[disk]
>+		except:
>+		    pass
>+	sets = dmraid.setlist()
>+	if len (sets) > 0:
>+	    for set in sets:
>+		dict["mapper/" + set] = "DMRAID"
>+
>     # this is kind of ugly, but it's much easier to do this from
python
>     for (dev, descr) in dict.items():
>         # the only raid devs like this are ide, so only worry about
>them
>@@ -391,14 +406,28 @@
>
> def makeDevInode(name, fn=None):
>     if fn:
>-        _isys.mkdevinode(name, fn)
>-        return fn
>+        if name[:7] == "mapper/":
>+            try:
>+                os.makedirs(os.path.dirname(fn))
>+            except:
>+                pass
>+            os.symlink("/dev/" + name, fn)
>+        else:
>+            _isys.mkdevinode(name, fn)
>+            return fn
>     path = '/dev/%s' % (name,)
>     try:
>         os.stat(path)
>     except OSError:
>         path = '/tmp/%s' % (name,)
>-        _isys.mkdevinode(name, path)
>+        if name[:7] == "mapper/":
>+            try:
>+                os.makedirs(os.path.dirname(path))
>+            except:
>+                pass
>+            os.symlink("/dev/" + name, path)
>+        else:
>+            _isys.mkdevinode(name, path)
>     return path
>
> def makedev(major, minor):
>@@ -674,9 +703,12 @@
>         os.unlink("/tmp/cdrom")
>
> def driveIsRemovable(device):
>+    # DMRaid is always non-removable
>     # assume ide if starts with 'hd', and we don't have to create
>     # device beforehand since it just reads /proc/ide
>-    if device[:2] == "hd":
>+    if device[:7] == "mapper/":
>+        rc = 0
>+    elif device[:2] == "hd":
>         rc = (_isys.isIdeRemovable("/dev/"+device) == 1)
>     else:
>         makeDevInode(device, "/tmp/disk")
>diff -ruN mnt/usr/lib/anaconda/mknod-stub
>new/usr/lib/anaconda/mknod-stub
>--- mnt/usr/lib/anaconda/mknod-stub	1970-01-01 01:00:00.000000000
>+0100
>+++ new/usr/lib/anaconda/mknod-stub	2004-10-10 21:06:58.000000000
>+0200
>@@ -25,8 +25,9 @@
>         # inode
>         while (drive.find('/') != -1):
>             if (drive.startswith("cciss") or drive.startswith("ida")
or
>-                drive.startswith("rd") or drive.startswith("ataraid")
>-                or drive.startswith("iseries") or
>drive.startswith("i2o")):
>+                drive.startswith("rd") or drive.startswith("ataraid")
>or
>+                drive.startswith("mapper") or
>drive.startswith("iseries") or
>+                drive.startswith("i2o")):
>                 break
>             drive = drive[drive.find('/') + 1:]
>         isys.makeDevInode(drive, path)
>diff -ruN mnt/usr/lib/anaconda/partedUtils.py
>new/usr/lib/anaconda/partedUtils.py
>--- mnt/usr/lib/anaconda/partedUtils.py	1970-01-01
01:00:00.000000000
>+0100
>+++ new/usr/lib/anaconda/partedUtils.py	2004-10-10
21:06:58.000000000
>+0200
>@@ -117,6 +117,9 @@
>         or partition.geom.dev.type == parted.DEVICE_CPQARRAY):
>         return "%sp%d" % (partition.geom.dev.path[5:],
>                           partition.num)
>+    elif partition.geom.dev.path[5:12] == "mapper/":
>+        return "%s_p%d" % (partition.geom.dev.path[5:],
>+                          partition.num)
>     return "%s%d" % (partition.geom.dev.path[5:],
>                      partition.num)
>
>diff -ruN mnt/usr/lib/anaconda/raid.py new/usr/lib/anaconda/raid.py
>--- mnt/usr/lib/anaconda/raid.py	1970-01-01 01:00:00.000000000
>+0100
>+++ new/usr/lib/anaconda/raid.py	2004-10-10 21:06:58.000000000
>+0200
>@@ -38,6 +38,9 @@
>     raidDevices = {}
>
>     for d in drives:
>+	# Assume dmraid is not part of a md raidset
>+	if d[:7] == "mapper/":
>+	    continue
>         parts = []
> 	isys.makeDevInode(d, "/tmp/" + d)
>         try:
>
>Best Regards
>Weichuan
>
>--
>dm-devel mailing list
>dm-devel at redhat.com
>https://www.redhat.com/mailman/listinfo/dm-devel




More information about the dm-devel mailing list