[dm-devel] ioctl failed when parted operated on device activebydmraid?
Lin, Weichuan
weichuan.lin at intel.com
Thu Sep 1 04:46:05 UTC 2005
>-----Original Message-----
>From: dm-devel-bounces at redhat.com [mailto:dm-devel-bounces at redhat.com]
On
>Behalf Of Lin, Weichuan
>Sent: Wednesday, August 31, 2005 10:12 AM
>To: device-mapper development
>Subject: RE: [dm-devel] ioctl failed when parted operated on device
>activebydmraid?
>
>
>
>>-----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?
>
Well, now I understand that the device mapper doesn't support
partitioning. Does anyone know why device mapper is designed so?
>>
>>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
>
>--
>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