00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include "lfsprocs.h"
00022
00023
00024
00025
00026
00027 #define Dbg (DEBUG_TRACE_RESTART_SUP)
00028
00029
#ifdef ALLOC_PRAGMA
00030
#pragma alloc_text(PAGE, LfsFindOldestClientLsn)
00031
#pragma alloc_text(PAGE, LfsWriteLfsRestart)
00032
#endif
00033
00034
00035
VOID
00036 LfsWriteLfsRestart (
00037 IN
PLFCB Lfcb,
00038 IN ULONG ThisRestartSize,
00039 IN BOOLEAN WaitForIo
00040 )
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 {
00068
PLBCB NewLbcb =
NULL;
00069
PLFS_RESTART_AREA NewRestart =
NULL;
00070
00071
PAGED_CODE();
00072
00073
DebugTrace( +1,
Dbg,
"LfsWriteLfsRestart: Entered\n", 0 );
00074
DebugTrace( 0,
Dbg,
"Lfcb -> %08lx\n", Lfcb );
00075
DebugTrace( 0,
Dbg,
"Write Chkdsk -> %04x\n", WriteChkdsk );
00076
DebugTrace( 0,
Dbg,
"Restart Size -> %08lx\n", ThisRestartSize );
00077
DebugTrace( 0,
Dbg,
"WaitForIo -> %08lx\n", WaitForIo );
00078
00079
00080
00081
00082
00083
try {
00084
00085
PLBCB ActiveLbcb;
00086
00087
00088
00089
00090
00091
00092
LfsAllocateRestartArea( &NewRestart, ThisRestartSize );
00093
00094
00095
00096
00097
00098
00099
LfsAllocateLbcb( Lfcb, &NewLbcb );
00100
SetFlag( NewLbcb->
LbcbFlags,
LBCB_RESTART_LBCB );
00101
00102
00103
00104
00105
00106
if (!Lfcb->InitialRestartArea) {
00107
00108 NewLbcb->
FileOffset = Lfcb->SystemPageSize + NewLbcb->
FileOffset;
00109 }
00110
00111 (ULONG)NewLbcb->
Length = ThisRestartSize;
00112
00113 NewLbcb->
PageHeader = (PVOID) Lfcb->RestartArea;
00114
00115
00116
00117
00118
00119 NewLbcb->
LastEndLsn = NewLbcb->
LastLsn = Lfcb->NextRestartLsn;
00120 Lfcb->NextRestartLsn.QuadPart = 1 + Lfcb->NextRestartLsn.QuadPart;
00121
00122
00123
00124
00125
00126 RtlCopyMemory( NewRestart, Lfcb->RestartArea, ThisRestartSize );
00127 Lfcb->RestartArea = NewRestart;
00128
00129 Lfcb->ClientArray =
Add2Ptr( NewRestart, Lfcb->
ClientArrayOffset,
PLFS_CLIENT_RECORD );
00130
00131 NewRestart =
NULL;
00132
00133
00134
00135
00136
00137
00138 Lfcb->InitialRestartArea = !Lfcb->InitialRestartArea;
00139
00140
00141
00142
00143
00144 InsertTailList( &Lfcb->LbcbWorkque, &NewLbcb->
WorkqueLinks );
00145
00146
00147
00148
00149
00150
00151
00152
00153
if (!
FlagOn( Lfcb->Flags,
LFCB_PACK_LOG )
00154 && !IsListEmpty( &Lfcb->LbcbActive )) {
00155
00156 ActiveLbcb = CONTAINING_RECORD( Lfcb->LbcbActive.Flink,
00157
LBCB,
00158 ActiveLinks );
00159
00160
if (
FlagOn( ActiveLbcb->
LbcbFlags,
LBCB_NOT_EMPTY )) {
00161
00162 RemoveEntryList( &ActiveLbcb->
ActiveLinks );
00163
ClearFlag( ActiveLbcb->
LbcbFlags,
LBCB_ON_ACTIVE_QUEUE );
00164 }
00165 }
00166
00167
if (WaitForIo) {
00168
00169
LfsFlushLbcb( Lfcb, NewLbcb );
00170 }
00171
00172 } finally {
00173
00174
DebugUnwind(
LfsWriteLfsRestart );
00175
00176
if (NewRestart !=
NULL) {
00177
00178
ExFreePool( NewRestart );
00179 }
00180
00181
DebugTrace( -1,
Dbg,
"LfsWriteLfsRestart: Exit\n", 0 );
00182 }
00183
00184
return;
00185 }
00186
00187
00188
VOID
00189 LfsFindOldestClientLsn (
00190 IN
PLFS_RESTART_AREA RestartArea,
00191 IN
PLFS_CLIENT_RECORD ClientArray,
00192 OUT PLSN OldestLsn
00193 )
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 {
00219
USHORT NextClient;
00220
00221
PLFS_CLIENT_RECORD ClientBlock;
00222
00223
PAGED_CODE();
00224
00225
DebugTrace( +1,
Dbg,
"LfsFindOldestClientLsn: Entered\n", 0 );
00226
DebugTrace( 0,
Dbg,
"RestartArea -> %08lx\n", RestartArea );
00227
DebugTrace( 0,
Dbg,
"Base Lsn (Low) -> %08lx\n", BaseLsn.LowPart );
00228
DebugTrace( 0,
Dbg,
"Base Lsn (High) -> %08lx\n", BaseLsn.HighPart );
00229
00230
00231
00232
00233
00234 NextClient = RestartArea->ClientInUseList;
00235
00236
00237
00238
00239
00240
00241
while (NextClient !=
LFS_NO_CLIENT) {
00242
00243 ClientBlock = ClientArray + NextClient;
00244
00245
00246
00247
00248
00249
if (( ClientBlock->
OldestLsn.QuadPart != 0 )
00250 && ( ClientBlock->
OldestLsn.QuadPart < OldestLsn->QuadPart )) {
00251
00252 *OldestLsn = ClientBlock->
OldestLsn;
00253 }
00254
00255
00256
00257
00258
00259 NextClient = ClientBlock->
NextClient;
00260 }
00261
00262
DebugTrace( 0,
Dbg,
"OldestLsn (Low) -> %08lx\n", BaseLsn.LowPart );
00263
DebugTrace( 0,
Dbg,
"OldestLsn (High) -> %08lx\n", BaseLsn.HighPart );
00264
DebugTrace( -1,
Dbg,
"LfsFindOldestClientLsn: Exit\n", 0 );
00265
00266
return;
00267 }
00268