public static void ResumeMoveExtent(List<DynamicDisk> disks, DynamicVolume volume, MoveExtentOperationBootRecord resumeRecord, ref long bytesCopied) { if (resumeRecord.OldStartSector == resumeRecord.NewStartSector) { throw new InvalidDataException("Invalid move record"); } if (resumeRecord.RestoreFromBuffer) { // we need to use the backup buffer to restore the data that may have been overwritten int extentIndex = DynamicDiskExtentHelper.GetIndexOfExtentID(volume.DynamicExtents, resumeRecord.ExtentID); DynamicDiskExtent sourceExtent = volume.DynamicExtents[extentIndex]; byte[] backupBuffer = sourceExtent.Disk.ReadSectors((long)resumeRecord.BackupBufferStartSector, BackupBufferSizeLBA); if (resumeRecord.OldStartSector < resumeRecord.NewStartSector) { // move right long readCount = (long)resumeRecord.NumberOfCommittedSectors; int sectorsToRead = BackupBufferSizeLBA; long sectorIndex = sourceExtent.TotalSectors - readCount - sectorsToRead; sourceExtent.WriteSectors(sectorIndex, backupBuffer); System.Diagnostics.Debug.WriteLine("Restored to " + sectorIndex); } else { // move left long sectorIndex = (long)resumeRecord.NumberOfCommittedSectors; sourceExtent.WriteSectors(sectorIndex, backupBuffer); System.Diagnostics.Debug.WriteLine("Restored to " + sectorIndex); } } if (resumeRecord.OldStartSector < resumeRecord.NewStartSector) { MoveExtentRight(disks, volume, resumeRecord, ref bytesCopied); } else { MoveExtentLeft(disks, volume, resumeRecord, ref bytesCopied); } }
public void WriteSectors(long sectorIndex, byte[] data) { int sectorCount = data.Length / BytesPerSector; List <ArrayPosition> writePositions = TranslateSectors(sectorIndex, sectorCount); int bytesWritten = 0; foreach (ArrayPosition writePosition in writePositions) { DynamicDiskExtent extent = m_extents[writePosition.DiskIndex]; byte[] extentBytes = new byte[writePosition.SectorCount * BytesPerSector]; Array.Copy(data, bytesWritten, extentBytes, 0, extentBytes.Length); extent.WriteSectors(writePosition.SectorIndex, extentBytes); bytesWritten += extentBytes.Length; } }
public override void WriteSectors(long sectorIndex, byte[] data) { m_extent.WriteSectors(sectorIndex, data); }