diff --git a/blivet/devicelibs/raid.py b/blivet/devicelibs/raid.py index 3d5ea8d..0fcd6d5 100644 --- a/blivet/devicelibs/raid.py +++ b/blivet/devicelibs/raid.py @@ -310,6 +310,31 @@ class RAIDLevels(object): if not level in self._raid_levels: self._raid_levels.append(level) +class Linear(RAIDLevel): + + level = property(lambda s: "linear") + min_members = property(lambda s: 1) + + def _get_max_spares(self, member_count): + return 0 + + def _get_base_member_size(self, size, member_count): + return div_up(size, member_count) + + def _get_raw_array_size(self, member_count, smallest_member_size): + # smallest_member_size dictates the return type + return smallest_member_size * member_count + + def _get_size(self, size, chunk_size): + return size - size % chunk_size + + def _get_recommended_stride(self, member_count): + return None + +Linear = Linear() +RAIDLevels.addRAIDLevelToStandardLevels(Linear) + + class RAID0(RAIDLevel): level = property(lambda s: "0") diff --git a/blivet/devices.py b/blivet/devices.py index f3a13ac..6aab59c 100644 --- a/blivet/devices.py +++ b/blivet/devices.py @@ -2554,6 +2554,12 @@ class LVMLogicalVolumeDevice(DMDevice): self.logSize = logSize self.metaDataSize = 0 self.singlePV = singlePV + + ## LVM RAID + ## + ## Q: is the chunk size equal to the LVM extent size? if not, what? + ## Q: what is the calculation of vg space used based on? + ## self.segType = segType or "linear" self.req_grow = None @@ -2631,6 +2637,18 @@ class LVMLogicalVolumeDevice(DMDevice): @property def vgSpaceUsed(self): """ Space occupied by this LV, not including snapshots. """ + #if self.exists and self.currentSize == self.size: + # unmodified; return whatever lvm has told us about vg space usage + # return self._vgSpaceUsed + + smallest_member = int(self.size / len(self.vg.pvs)) + try: + size = self.level.get_size(len(self.vg.pvs), + smallest_member, + self.peSize) + except (MDRaidError, RaidError): + size = 0 + return (self.vg.align(self.size, roundup=True) * self.copies + self.logSize + self.metaDataSize)