mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 07:23:13 +00:00
[EXT2] Upgrade to 0.69
CORE-13980
This commit is contained in:
parent
18dee7a392
commit
a1d7e9936d
24 changed files with 3032 additions and 304 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue