[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