Example #1
0
 public override void WriteDatabaseRecordFragment(DatabaseRecordFragment fragment)
 {
     foreach (DynamicDisk disk in m_disks)
     {
         VolumeManagerDatabase.WriteDatabaseRecordFragment(disk, fragment, (int)this.DatabaseHeader.BlockSize);
     }
 }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }