diff options
author | Matt Wu <matt@ext2fsd.com> | 2016-08-12 12:28:53 +0300 |
---|---|---|
committer | Matt Wu <matt@ext2fsd.com> | 2016-08-12 12:28:53 +0300 |
commit | 24f59ceae511fa41411328ad695babc1ba0cca64 (patch) | |
tree | f96c18b5047270732d3df645a06b4c80b680a1ae /Ext3Fsd | |
parent | d207974ed2ecfcc20123fbfb685254dfa2055485 (diff) |
FIXME: possible hang of mcb release thread
Diffstat (limited to 'Ext3Fsd')
-rwxr-xr-x | Ext3Fsd/memory.c | 54 |
1 files changed, 31 insertions, 23 deletions
diff --git a/Ext3Fsd/memory.c b/Ext3Fsd/memory.c index 3e03888..58438ae 100755 --- a/Ext3Fsd/memory.c +++ b/Ext3Fsd/memory.c @@ -2957,40 +2957,48 @@ Ext2FirstUnusedMcb(PEXT2_VCB Vcb, BOOLEAN Wait, ULONG Number) 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))) { + List = RemoveHeadList(&Vcb->McbList); + Mcb = CONTAINING_RECORD(List, EXT2_MCB, Link); + ASSERT(IsFlagOn(Mcb->Flags, MCB_VCB_LINK)); - Ext2RemoveMcb(Vcb, Mcb); - ClearLongFlag(Mcb->Flags, MCB_VCB_LINK); - Ext2DerefXcb(&Vcb->NumOfMcb); + if (Mcb->Fcb == NULL && !IsMcbRoot(Mcb) && + Mcb->Refercount == 0 && + (Mcb->Child == NULL || IsMcbSymLink(Mcb))) { - /* attach all Mcb into a chain*/ - if (Head) { - ASSERT(Tail != NULL); - Tail->Next = Mcb; - Tail = Mcb; - } else { - Head = Tail = Mcb; - } - Tail->Next = NULL; + 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; |