With the following exception, this marks the end of us using array
super-minor as the basis for its name: For preexisting devices with
no name, we'll treat the super-minor as a name since that's really
all we have to work with.
---
pyanaconda/storage/__init__.py | 20 +++++---------------
pyanaconda/storage/devicelibs/mdraid.py | 13 ++++++++++---
pyanaconda/storage/devices.py | 23 +++++++++++++++--------
pyanaconda/storage/devicetree.py | 23 +++--------------------
pyanaconda/storage/formats/__init__.py | 7 +++++++
pyanaconda/storage/udev.py | 9 ++++++++-
6 files changed, 48 insertions(+), 47 deletions(-)
diff --git a/pyanaconda/storage/__init__.py b/pyanaconda/storage/__init__.py
index ef4aed7..5f94fea 100644
--- a/pyanaconda/storage/__init__.py
+++ b/pyanaconda/storage/__init__.py
@@ -665,15 +665,6 @@ class Storage(object):
return unused
@property
- def unusedMDMinors(self):
- """ Return a list of unused minors for use in RAID.
"""
- raidMinors = range(0,32)
- for array in self.mdarrays + self.mdcontainers:
- if array.minor is not None and array.minor in raidMinors:
- raidMinors.remove(array.minor)
- return raidMinors
-
- @property
def btrfsVolumes(self):
return sorted(self.devicetree.getDevicesByType("btrfs volume"),
key=lambda d: d.name)
@@ -1095,15 +1086,14 @@ class Storage(object):
None),
**kwargs.pop("fmt_args", {}))
- if kwargs.has_key("minor"):
- kwargs["minor"] = int(kwargs["minor"])
- else:
- kwargs["minor"] = self.unusedMDMinors[0]
-
if kwargs.has_key("name"):
name = kwargs.pop("name")
else:
- name = "md%d" % kwargs["minor"]
+ swap = getattr(kwargs.get("format"), "type", None) ==
"swap"
+ mountpoint = getattr(kwargs.get("format"), "mountpoint",
None)
+ name = self.suggestDeviceName(prefix=shortProductName,
+ swap=swap,
+ mountpoint=mountpoint)
return MDRaidArrayDevice(name, *args, **kwargs)
diff --git a/pyanaconda/storage/devicelibs/mdraid.py
b/pyanaconda/storage/devicelibs/mdraid.py
index d0b8594..221ee04 100644
--- a/pyanaconda/storage/devicelibs/mdraid.py
+++ b/pyanaconda/storage/devicelibs/mdraid.py
@@ -209,12 +209,10 @@ def mdactivate(device, members=[], super_minor=None, uuid=None):
if uuid:
identifier = "--uuid=%s" % uuid
- elif super_minor is not None:
- identifier = "--super-minor=%d" % super_minor
else:
identifier = ""
- args = ["--assemble", device, identifier, "--run",
"--auto=md"]
+ args = ["--assemble", device, identifier, "--run"]
args += members
try:
@@ -252,3 +250,12 @@ def mdexamine(device):
return info
+def md_node_from_name(name):
+ named_path = "/dev/md/" + name
+ try:
+ # /dev/mapper/ nodes are usually symlinks to /dev/dm-N
+ node = os.path.basename(os.readlink(named_path))
+ except OSError as e:
+ raise MDRaidError("md_node_from_name failed: %s" % e)
+ else:
+ return node
diff --git a/pyanaconda/storage/devices.py b/pyanaconda/storage/devices.py
index c938b77..a7128ac 100644
--- a/pyanaconda/storage/devices.py
+++ b/pyanaconda/storage/devices.py
@@ -2596,6 +2596,7 @@ class MDRaidArrayDevice(StorageDevice):
""" An mdraid (Linux RAID) device. """
_type = "mdarray"
_packages = ["mdadm"]
+ _devDir = "/dev/md"
def __init__(self, name, level=None, major=None, minor=None, size=None,
memberDevices=None, totalDevices=None,
@@ -2629,11 +2630,6 @@ class MDRaidArrayDevice(StorageDevice):
elif level is not None:
self.level = mdraid.raidLevel(level)
- if self.growable and self.level != 0:
- for dev in self.parents:
- dev.removeChild()
- raise ValueError("Only RAID0 arrays can contain growable members")
-
# For new arrays check if we have enough members
if (not exists and parents and
len(parents) < mdraid.get_raid_min_members(self.level)):
@@ -2647,7 +2643,7 @@ class MDRaidArrayDevice(StorageDevice):
self.uuid = uuid
self._totalDevices = numeric_type(totalDevices)
self._memberDevices = numeric_type(memberDevices)
- self.sysfsPath = "/devices/virtual/block/%s" % name
+
self.chunkSize = 512.0 / 1024.0 # chunk size in MB
self.superBlockSize = 2.0 # superblock size in MB
@@ -2820,7 +2816,8 @@ class MDRaidArrayDevice(StorageDevice):
raise DeviceError("device has not been created", self.name)
if self.status:
- self.sysfsPath = "/devices/virtual/block/%s" % self.name
+ md_node = mdraid.md_node_from_name(self.name)
+ self.sysfsPath = "/devices/virtual/block/%s" % md_node
else:
self.sysfsPath = ''
@@ -2927,6 +2924,10 @@ class MDRaidArrayDevice(StorageDevice):
""" Return a list of this array's member device instances.
"""
return self.parents
+ def _postSetup(self):
+ super(MDRaidArrayDevice, self)._postSetup()
+ self.updateSysfsPath()
+
def _setup(self, orig=False):
""" Open, or set up, a device. """
log_method_call(self, self.name, orig=orig, status=self.status,
@@ -2938,7 +2939,6 @@ class MDRaidArrayDevice(StorageDevice):
mdraid.mdactivate(self.path,
members=disks,
- super_minor=self.minor,
uuid=self.uuid)
def teardown(self, recursive=None):
@@ -2984,7 +2984,14 @@ class MDRaidArrayDevice(StorageDevice):
self.createBitmap = False
def _postCreate(self):
+ # this is critical since our status method requires a valid sysfs path
+ md_node = mdraid.md_node_from_name(self.name)
+ self.sysfsPath = "/devices/virtual/block/%s" % md_node
+ self.exists = True # I think we can remove this.
+
StorageDevice._postCreate(self)
+
+ # update our uuid attribute with the new array's UUID
info = udev_get_block_device(self.sysfsPath)
self.uuid = udev_device_get_md_uuid(info)
for member in self.devices:
diff --git a/pyanaconda/storage/devicetree.py b/pyanaconda/storage/devicetree.py
index 49fb174..0ab844d 100644
--- a/pyanaconda/storage/devicetree.py
+++ b/pyanaconda/storage/devicetree.py
@@ -1375,7 +1375,6 @@ class DeviceTree(object):
md_name = None
md_metadata = None
- minor = None
# check the list of devices udev knows about to see if the array
# this device belongs to is already active
@@ -1394,7 +1393,6 @@ class DeviceTree(object):
if dev_uuid == md_uuid and dev_level == md_level:
md_name = udev_device_get_name(dev)
- minor = udev_device_get_minor(dev)
md_metadata = dev.get("MD_METADATA")
break
@@ -1403,42 +1401,27 @@ class DeviceTree(object):
md_metadata = md_info.get("metadata", "0.90")
if not md_name:
- # try to name the array based on the preferred minor
md_path = md_info.get("device", "")
md_name = devicePathToName(md_info.get("device",
""))
if md_name:
try:
- # md_name can be either md# or md/#
+ # md_name can be md<minor>, md/<minor>, or
md/<name>
if md_name.startswith("md/"):
- minor = int(md_name[3:]) # strip off leading
"md/"
- md_name = "md%d" % minor # use a regular md#
name
+ md_name = md_name[3:]
else:
- minor = int(md_name[2:]) # strip off leading
"md"
+ md_name = md_name[2:]
except (IndexError, ValueError):
- minor = None
md_name = None
else:
array = self.getDeviceByName(md_name)
if array and array.uuid != md_uuid:
md_name = None
- if not md_name:
- # if we don't have a name yet, find the first unused minor
- minor = 0
- while True:
- if self.getDeviceByName("md%d" % minor):
- minor += 1
- else:
- break
-
- md_name = "md%d" % minor
-
log.info("using name %s for md array containing member %s"
% (md_name, device.name))
try:
md_array = MDRaidArrayDevice(md_name,
level=md_level,
- minor=minor,
memberDevices=md_devices,
uuid=md_uuid,
metadataVersion=md_metadata,
diff --git a/pyanaconda/storage/formats/__init__.py
b/pyanaconda/storage/formats/__init__.py
index 12ca5bf..838ad26 100644
--- a/pyanaconda/storage/formats/__init__.py
+++ b/pyanaconda/storage/formats/__init__.py
@@ -29,6 +29,7 @@ from pyanaconda.iutil import execWithRedirect
from pyanaconda.anaconda_log import log_method_call
from ..errors import *
from ..devicelibs.dm import dm_node_from_name
+from ..devicelibs.mdraid import md_node_from_name
from ..udev import udev_device_get_major, udev_device_get_minor
import gettext
@@ -257,6 +258,12 @@ class DeviceFormat(object):
except DMError:
log.warning("failed to get dm node for %s" % self.device)
return
+ elif self.device.startswith("/dev/md/"):
+ try:
+ name = md_node_from_name(os.path.basename(self.device))
+ except MDRaidError:
+ log.warning("failed to get md node for %s" % self.device)
+ return
else:
name = self.device
diff --git a/pyanaconda/storage/udev.py b/pyanaconda/storage/udev.py
index 855ee70..966ad41 100644
--- a/pyanaconda/storage/udev.py
+++ b/pyanaconda/storage/udev.py
@@ -137,7 +137,14 @@ def udev_get_block_device(sysfs_path):
# udev database entries.
def udev_device_get_name(udev_info):
""" Return the best name for a device based on the udev db data.
"""
- return udev_info.get("DM_NAME", udev_info["name"])
+ if "MD_DEVNAME" in udev_info:
+ name = udev_info["MD_DEVNAME"]
+ elif "DM_NAME" in udev_info:
+ name = udev_info["DM_NAME"]
+ else:
+ name = udev_info["name"]
+
+ return name
def udev_device_get_format(udev_info):
""" Return a device's format type as reported by udev.
"""
--
1.7.7.6