summaryrefslogtreecommitdiffstats
path: root/pyanaconda
diff options
context:
space:
mode:
Diffstat (limited to 'pyanaconda')
-rw-r--r--pyanaconda/storage/__init__.py20
-rw-r--r--pyanaconda/storage/devicelibs/mdraid.py13
-rw-r--r--pyanaconda/storage/devices.py23
-rw-r--r--pyanaconda/storage/devicetree.py23
-rw-r--r--pyanaconda/storage/formats/__init__.py7
-rw-r--r--pyanaconda/storage/udev.py9
6 files changed, 48 insertions, 47 deletions
diff --git a/pyanaconda/storage/__init__.py b/pyanaconda/storage/__init__.py
index 5f3f4e1bf..3f501dec3 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 d0b85945d..221ee04d0 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 c938b7719..a7128ac89 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 49fb1740e..0ab844d2f 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 12ca5bf1c..838ad26ce 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 855ee70a3..966ad415c 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. """