[EXT2] Upgrade to 0.69

CORE-13980
This commit is contained in:
Pierre Schweitzer 2017-11-12 10:47:29 +01:00
parent 18dee7a392
commit a1d7e9936d
No known key found for this signature in database
GPG key ID: 7545556C3D585B0B
24 changed files with 3032 additions and 304 deletions

View file

@ -207,7 +207,7 @@ Ext2UnlinkFcb(IN PEXT2_FCB Fcb)
ExAcquireResourceExclusiveLite(&Vcb->McbLock, TRUE);
Mcb = Fcb->Mcb;
DEBUG(DL_ERR, ("Ext2FreeFcb: Fcb (%p) to be unlinked: %wZ.\n",
DEBUG(DL_INF, ("Ext2FreeFcb: Fcb (%p) to be unlinked: %wZ.\n",
Fcb, Mcb ? &Mcb->FullName : NULL));
if ((Mcb != NULL) &&
@ -2364,6 +2364,7 @@ Ext2InitializeVcb( IN PEXT2_IRP_CONTEXT IrpContext,
ExInitializeResourceLite(&Vcb->MetaInode);
ExInitializeResourceLite(&Vcb->MetaBlock);
ExInitializeResourceLite(&Vcb->McbLock);
ExInitializeResourceLite(&Vcb->FcbLock);
ExInitializeResourceLite(&Vcb->sbi.s_gd_lock);
#ifndef _WIN2K_TARGET_
ExInitializeFastMutex(&Vcb->Mutex);
@ -2373,7 +2374,6 @@ Ext2InitializeVcb( IN PEXT2_IRP_CONTEXT IrpContext,
/* initialize Fcb list head */
InitializeListHead(&Vcb->FcbList);
ExInitializeResourceLite(&Vcb->FcbLock);
/* initialize Mcb list head */
InitializeListHead(&(Vcb->McbList));
@ -2401,7 +2401,7 @@ Ext2InitializeVcb( IN PEXT2_IRP_CONTEXT IrpContext,
/* initialize inode lookaside list */
ExInitializeNPagedLookasideList(&(Vcb->InodeLookasideList),
NULL, NULL, 0, sizeof(EXT2_INODE),
NULL, NULL, 0, Vcb->InodeSize,
'SNIE', 0);
InodeLookasideInitialized = TRUE;
@ -2761,6 +2761,7 @@ Ext2InitializeVcb( IN PEXT2_IRP_CONTEXT IrpContext,
}
if (VcbResourceInitialized) {
ExDeleteResourceLite(&Vcb->FcbLock);
ExDeleteResourceLite(&Vcb->McbLock);
ExDeleteResourceLite(&Vcb->MetaInode);
ExDeleteResourceLite(&Vcb->MetaBlock);
@ -2964,47 +2965,63 @@ Ext2FirstUnusedMcb(PEXT2_VCB Vcb, BOOLEAN Wait, ULONG Number)
PEXT2_MCB Mcb = NULL;
PLIST_ENTRY List = NULL;
ULONG i = 0;
LARGE_INTEGER start, now;
if (!ExAcquireResourceExclusiveLite(&Vcb->McbLock, Wait)) {
return NULL;
}
KeQuerySystemTime(&start);
while (Number--) {
if (!IsListEmpty(&Vcb->McbList)) {
BOOLEAN Skip = TRUE;
while (i++ < Vcb->NumOfMcb) {
if (IsListEmpty(&Vcb->McbList)) {
break;
}
List = RemoveHeadList(&Vcb->McbList);
Mcb = CONTAINING_RECORD(List, EXT2_MCB, Link);
ASSERT(IsFlagOn(Mcb->Flags, MCB_VCB_LINK));
while (i++ < Vcb->NumOfMcb) {
if (Mcb->Fcb == NULL && !IsMcbRoot(Mcb) &&
Mcb->Refercount == 0 &&
(Mcb->Child == NULL || IsMcbSymLink(Mcb))) {
KeQuerySystemTime(&now);
if (now.QuadPart > start.QuadPart + (LONGLONG)10*1000*1000) {
break;
}
Ext2RemoveMcb(Vcb, Mcb);
ClearLongFlag(Mcb->Flags, MCB_VCB_LINK);
Ext2DerefXcb(&Vcb->NumOfMcb);
List = RemoveHeadList(&Vcb->McbList);
Mcb = CONTAINING_RECORD(List, EXT2_MCB, Link);
ASSERT(IsFlagOn(Mcb->Flags, MCB_VCB_LINK));
/* attach all Mcb into a chain*/
if (Head) {
ASSERT(Tail != NULL);
Tail->Next = Mcb;
Tail = Mcb;
} else {
Head = Tail = Mcb;
}
Tail->Next = NULL;
if (Mcb->Fcb == NULL && !IsMcbRoot(Mcb) &&
Mcb->Refercount == 0 &&
(Mcb->Child == NULL || IsMcbSymLink(Mcb))) {
Ext2RemoveMcb(Vcb, Mcb);
ClearLongFlag(Mcb->Flags, MCB_VCB_LINK);
Ext2DerefXcb(&Vcb->NumOfMcb);
/* attach all Mcb into a chain*/
if (Head) {
ASSERT(Tail != NULL);
Tail->Next = Mcb;
Tail = Mcb;
} else {
InsertTailList(&Vcb->McbList, &Mcb->Link);
Mcb = NULL;
Head = Tail = Mcb;
}
Tail->Next = NULL;
Skip = FALSE;
} else {
InsertTailList(&Vcb->McbList, &Mcb->Link);
Mcb = NULL;
}
}
if (Skip)
break;
}
ExReleaseResourceLite(&Vcb->McbLock);
return Head;
@ -3119,7 +3136,9 @@ Ext2McbReaperThread(
LastState = DidNothing = FALSE;
}
}
if (DidNothing) {
KeClearEvent(&Reaper->Wait);
}
if (GlobalAcquired) {
ExReleaseResourceLite(&Ext2Global->Resource);
GlobalAcquired = FALSE;
@ -3145,15 +3164,21 @@ BOOLEAN
Ext2QueryUnusedBH(PEXT2_VCB Vcb, PLIST_ENTRY head)
{
struct buffer_head *bh = NULL;
PLIST_ENTRY next = NULL;
LARGE_INTEGER now;
BOOLEAN wake = FALSE;
PLIST_ENTRY next = NULL;
LARGE_INTEGER start, now;
BOOLEAN wake = FALSE;
KeQuerySystemTime(&now);
KeQuerySystemTime(&start);
ExAcquireResourceExclusiveLite(&Vcb->bd.bd_bh_lock, TRUE);
while (!IsListEmpty(&Vcb->bd.bd_bh_free)) {
KeQuerySystemTime(&now);
if (now.QuadPart > start.QuadPart + (LONGLONG)10*1000*1000) {
break;
}
next = RemoveHeadList(&Vcb->bd.bd_bh_free);
bh = CONTAINING_RECORD(next, struct buffer_head, b_link);
if (atomic_read(&bh->b_count)) {
@ -3166,6 +3191,7 @@ Ext2QueryUnusedBH(PEXT2_VCB Vcb, PLIST_ENTRY head)
(bh->b_ts_drop.QuadPart + (LONGLONG)10*1000*1000*15) > now.QuadPart ||
(bh->b_ts_creat.QuadPart + (LONGLONG)10*1000*1000*180) > now.QuadPart) {
InsertTailList(head, &bh->b_link);
buffer_head_remove(&Vcb->bd, bh);
} else {
InsertHeadList(&Vcb->bd.bd_bh_free, &bh->b_link);
break;
@ -3240,12 +3266,15 @@ Ext2bhReaperThread(
Vcb = CONTAINING_RECORD(Link, EXT2_VCB, Next);
NonWait = Ext2QueryUnusedBH(Vcb, &List);
}
DidNothing = IsListEmpty(&List);
if (DidNothing) {
KeClearEvent(&Reaper->Wait);
}
if (GlobalAcquired) {
ExReleaseResourceLite(&Ext2Global->Resource);
GlobalAcquired = FALSE;
}
DidNothing = IsListEmpty(&List);
while (!IsListEmpty(&List)) {
struct buffer_head *bh;
Link = RemoveHeadList(&List);
@ -3274,19 +3303,20 @@ Ext2QueryUnusedFcb(PEXT2_VCB Vcb, PLIST_ENTRY list)
{
PEXT2_FCB Fcb;
PLIST_ENTRY next = NULL;
LARGE_INTEGER now;
LARGE_INTEGER start, now;
ULONG count = 0;
ULONG tries = 0;
BOOLEAN wake = FALSE;
BOOLEAN retry = TRUE;
KeQuerySystemTime(&now);
KeQuerySystemTime(&start);
ExAcquireResourceExclusiveLite(&Vcb->FcbLock, TRUE);
again:
KeQuerySystemTime(&now);
while (!IsListEmpty(&Vcb->FcbList)) {
next = RemoveHeadList(&Vcb->FcbList);
@ -3312,6 +3342,10 @@ again:
}
}
if (start.QuadPart + 10*1000*1000 > now.QuadPart) {
retry = FALSE;
}
if (retry) {
if (++tries < (Vcb->FcbCount >> 4) )
goto again;
@ -3380,12 +3414,15 @@ Ext2FcbReaperThread(
Vcb = CONTAINING_RECORD(Link, EXT2_VCB, Next);
NonWait = Ext2QueryUnusedFcb(Vcb, &List);
}
DidNothing = IsListEmpty(&List);
if (DidNothing) {
KeClearEvent(&Reaper->Wait);
}
if (GlobalAcquired) {
ExReleaseResourceLite(&Ext2Global->Resource);
GlobalAcquired = FALSE;
}
DidNothing = IsListEmpty(&List);
while (!IsListEmpty(&List)) {
PEXT2_FCB Fcb;
Link = RemoveHeadList(&List);