Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//+---------------------------------------------------------------------------
//
// 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
};
|