diff options
Diffstat (limited to 'pyanaconda')
-rw-r--r-- | pyanaconda/storage/__init__.py | 20 | ||||
-rw-r--r-- | pyanaconda/storage/devicelibs/mdraid.py | 13 | ||||
-rw-r--r-- | pyanaconda/storage/devices.py | 23 | ||||
-rw-r--r-- | pyanaconda/storage/devicetree.py | 23 | ||||
-rw-r--r-- | pyanaconda/storage/formats/__init__.py | 7 | ||||
-rw-r--r-- | 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 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. """ |