136 lines
3.4 KiB
C++
136 lines
3.4 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1991 - 1998
|
|
//
|
|
// File: dellog.hxx
|
|
//
|
|
// Contents: Deletion logs for usns
|
|
//
|
|
// History: 28-Jul-97 SitaramR Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
#include <dynstrm.hxx>
|
|
|
|
#include "usnlist.hxx"
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CDelLogEntry
|
|
//
|
|
// Purpose: Entry in deletion log list
|
|
//
|
|
// History: 28-Jul-97 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
class CDelLogEntry : public CDoubleLink
|
|
{
|
|
|
|
public:
|
|
|
|
CDelLogEntry( FILEID fileId, WORKID wid, USN usn )
|
|
: _fileId(fileId),
|
|
_wid(wid),
|
|
_usn(usn)
|
|
{
|
|
}
|
|
|
|
FILEID FileId() { return _fileId; }
|
|
WORKID WorkId() { return _wid; }
|
|
USN Usn() { return _usn; }
|
|
|
|
private:
|
|
|
|
FILEID _fileId;
|
|
WORKID _wid;
|
|
USN _usn;
|
|
};
|
|
|
|
|
|
typedef class TDoubleList<CDelLogEntry> CDelLogEntryList;
|
|
typedef class TFwdListIter<CDelLogEntry, CDelLogEntryList> CDelLogEntryListIter;
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CFakeVolIdMap
|
|
//
|
|
// Purpose: Maps volume ids to fake volume ids in the range
|
|
// 0..RTL_MAX_DRIVE_LETTERS-1
|
|
//
|
|
// History: 28-Jul-97 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
const VOLUMEID VolumeIdBase = L'a'; // For mapping 'a' to 'z' volume ids
|
|
const COUNT_ALPHABETS = 26; // # letters in alphabet
|
|
const COUNT_SPECIAL_CHARS = RTL_MAX_DRIVE_LETTERS - 26; // Count of non 'a' to 'z' drives
|
|
|
|
class CFakeVolIdMap
|
|
{
|
|
|
|
public:
|
|
|
|
CFakeVolIdMap();
|
|
|
|
ULONG VolIdToFakeVolId( VOLUMEID volumeId );
|
|
VOLUMEID FakeVolIdToVolId( ULONG fakeVolId );
|
|
|
|
private:
|
|
|
|
VOLUMEID _aVolIdSpecial[COUNT_SPECIAL_CHARS]; // Mapping for non 'a' to 'z' drives
|
|
};
|
|
|
|
|
|
class CFileIdMap;
|
|
class CiCat;
|
|
class CiStorage;
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CDeletionLog
|
|
//
|
|
// Purpose: Deletion log for keeping track of usn deletions until they
|
|
// are no longer needed.
|
|
//
|
|
// History: 28-Jul-97 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
class CDeletionLog
|
|
{
|
|
|
|
public:
|
|
|
|
CDeletionLog( CFileIdMap& fileIdMap, CiCat& cicat );
|
|
|
|
void FastInit( CiStorage * pStorage, ULONG version );
|
|
void ReInit( ULONG version );
|
|
void Flush();
|
|
|
|
void MarkForDeletion( VOLUMEID volumeId,
|
|
FILEID fileId,
|
|
WORKID wid,
|
|
USN usn );
|
|
void ProcessChangesFlush( CUsnFlushInfoList & usnFlushInfoList );
|
|
|
|
private:
|
|
|
|
ULONG GetSize();
|
|
void FatalCorruption( ULONG cbRead, ULONG cbToRead );
|
|
|
|
CiCat& _cicat; // Ci catalog
|
|
CFileIdMap & _fileIdMap; // File id map
|
|
CFakeVolIdMap _fakeVolIdMap; // Real vol id to fake vol id map
|
|
CDelLogEntryList _aDelLogEntryList[RTL_MAX_DRIVE_LETTERS]; // List of marked deletions
|
|
XPtr<CDynStream> _xPersStream; // Persistent linearized deletion log
|
|
CMutexSem _mutex; // Lock to serialize scan(flush) and usn threads
|
|
};
|
|
|
|
|
|
|