// Copies a section of data from master stream to the log stream
        void BackupData(long location, int size)
        {
            logStream.Seek(0, SeekOrigin.End);

            // Write segment header
            SegmentMetadata sh = new SegmentMetadata
            {
                TransactionId = logStreamHeader.TransactionId,
                Position      = location,
                Size          = size
            };
            long metadataPos = logStream.Position;

            sh.Save(logStream);

            // Copy data
            masterStream.Position = location;

            int bytesCopied = CopyData(masterStream, size, logStream);

            // If bytes copied differ from size in header, update the header
            if (bytesCopied != size)
            {
                logStream.Position = metadataPos;

                sh.Size = bytesCopied;
                sh.Save(logStream);
            }

            logStream.Flush();

            // Update log stream header
            logStreamHeader.SegmentCount++;
            logStreamHeader.Save(logStream);
            logStream.Flush();
        }