Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matt-wu/Ext3Fsd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Wu <matt@ext2fsd.com>2016-08-12 12:28:53 +0300
committerMatt Wu <matt@ext2fsd.com>2016-08-12 12:28:53 +0300
commit24f59ceae511fa41411328ad695babc1ba0cca64 (patch)
treef96c18b5047270732d3df645a06b4c80b680a1ae /Ext3Fsd
parentd207974ed2ecfcc20123fbfb685254dfa2055485 (diff)
FIXME: possible hang of mcb release thread
Diffstat (limited to 'Ext3Fsd')
-rwxr-xr-xExt3Fsd/memory.c54
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;