public override void WriteDatabaseRecordFragment(DatabaseRecordFragment fragment) { foreach (DynamicDisk disk in m_disks) { VolumeManagerDatabase.WriteDatabaseRecordFragment(disk, fragment, (int)this.DatabaseHeader.BlockSize); } }
public static List <DiskGroupDatabase> ReadFromDisks(List <DynamicDisk> disks) { Dictionary <Guid, List <DynamicDisk> > groups = new Dictionary <Guid, List <DynamicDisk> >(); foreach (DynamicDisk disk in disks) { Guid diskGroupGuid = disk.PrivateHeader.DiskGroupGuid; if (groups.ContainsKey(diskGroupGuid)) { groups[diskGroupGuid].Add(disk); } else { List <DynamicDisk> list = new List <DynamicDisk>(); list.Add(disk); groups.Add(diskGroupGuid, list); } } List <DiskGroupDatabase> result = new List <DiskGroupDatabase>(); foreach (List <DynamicDisk> groupDisks in groups.Values) { VolumeManagerDatabase database = VolumeManagerDatabase.ReadFromDisk(groupDisks[0]); if (database != null) // if there is issue with one disk (such as unsupported version) we skip the group entirely { DiskGroupDatabase groupDatabase = new DiskGroupDatabase(groupDisks, database.DatabaseHeader, database.DatabaseRecords, database.KernelUpdateLog); result.Add(groupDatabase); } } return(result); }
private static List <ExtentRecord> GetRetainedExtentsOnDisk(DynamicDisk disk, out long bootPartitionStartLBA) { VolumeManagerDatabase database = VolumeManagerDatabase.ReadFromDisk(disk); DiskRecord diskRecord = database.FindDiskByDiskGuid(disk.DiskGuid); bootPartitionStartLBA = -1; List <ExtentRecord> result = new List <ExtentRecord>(); foreach (VolumeRecord volume in database.VolumeRecords) { if ((volume.VolumeFlags & VolumeFlags.RetainPartition) > 0) { List <ComponentRecord> components = database.FindComponentsByVolumeID(volume.VolumeId); foreach (ComponentRecord componentRecord in components) { if (componentRecord.ExtentLayout == ExtentLayoutName.Concatenated) { if (componentRecord.NumberOfExtents == 1) { List <ExtentRecord> extents = database.FindExtentsByComponentID(componentRecord.ComponentId); if (extents.Count == 1) { ExtentRecord extent = extents[0]; if (extent.DiskId == diskRecord.DiskId) { result.Add(extent); if ((volume.VolumeFlags & VolumeFlags.BootVolume) > 0) { bootPartitionStartLBA = (long)(disk.PrivateHeader.PublicRegionStartLBA + extent.DiskOffsetLBA); } } } } } } } } return(result); }
public override void VerifyDatabaseConsistency() { base.VerifyDatabaseConsistency(); // Make sure database is identical across disks for (int index = 1; index < m_disks.Count; index++) { VolumeManagerDatabase seconary = VolumeManagerDatabase.ReadFromDisk(m_disks[index]); seconary.VerifyDatabaseConsistency(); if (this.DatabaseHeader.DiskGroupGuidString != seconary.DatabaseHeader.DiskGroupGuidString || this.DatabaseHeader.DiskGroupName != seconary.DatabaseHeader.DiskGroupName) { throw new NotImplementedException("More than one disk group detected"); } if (this.DatabaseHeader.CommitTransactionID != seconary.DatabaseHeader.CommitTransactionID) { throw new NotImplementedException("Inconsistent disk group state"); } } }
/// <summary> /// Sorted by first sector /// </summary> /// <returns>null if there was a problem reading extent information from disk</returns> public static List <DynamicDiskExtent> GetDiskExtents(DynamicDisk disk) { List <DynamicDiskExtent> result = new List <DynamicDiskExtent>(); PrivateHeader privateHeader = disk.PrivateHeader; if (privateHeader != null) { VolumeManagerDatabase database = VolumeManagerDatabase.ReadFromDisk(disk); if (database != null) { DiskRecord diskRecord = database.FindDiskByDiskGuid(privateHeader.DiskGuid); List <ExtentRecord> extentRecords = database.FindExtentsByDiskID(diskRecord.DiskId); foreach (ExtentRecord extentRecord in extentRecords) { DynamicDiskExtent extent = DynamicDiskExtentHelper.GetDiskExtent(disk, extentRecord); result.Add(extent); } DynamicDiskExtentsHelper.SortExtentsByFirstSector(result); return(result); } } return(null); }