MCPcopy Create free account
hub / github.com/bobranten/Ext4Fsd / Ext2QueryUnusedFcb

Function Ext2QueryUnusedFcb

Ext4Fsd/memory.c:3300–3356  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3298/* get unused Fcbs to free */
3299
3300BOOLEAN
3301Ext2QueryUnusedFcb(PEXT2_VCB Vcb, PLIST_ENTRY list)
3302{
3303 PEXT2_FCB Fcb;
3304 PLIST_ENTRY next = NULL;
3305 LARGE_INTEGER start, now;
3306
3307 ULONG count = 0;
3308 ULONG tries = 0;
3309 BOOLEAN wake = FALSE;
3310 BOOLEAN retry = TRUE;
3311
3312 KeQuerySystemTime(&start);
3313
3314 ExAcquireResourceExclusiveLite(&Vcb->FcbLock, TRUE);
3315
3316again:
3317
3318 KeQuerySystemTime(&now);
3319 while (!IsListEmpty(&Vcb->FcbList)) {
3320
3321 next = RemoveHeadList(&Vcb->FcbList);
3322 Fcb = CONTAINING_RECORD(next, EXT2_FCB, Next);
3323
3324 if (Fcb->ReferenceCount > 0) {
3325 InsertTailList(&Vcb->FcbList, &Fcb->Next);
3326 break;
3327 }
3328
3329 retry = FALSE;
3330
3331 if (now.QuadPart < Fcb->TsDrop.QuadPart + 10*1000*1000*120) {
3332 InsertHeadList(&Vcb->FcbList, &Fcb->Next);
3333 break;
3334 }
3335
3336 Ext2UnlinkFcb(Fcb);
3337 Ext2DerefXcb(&Vcb->FcbCount);
3338 InsertTailList(list, &Fcb->Next);
3339 if (++count >= Ext2Global->MaxDepth) {
3340 break;
3341 }
3342 }
3343
3344 if (start.QuadPart + 10*1000*1000 > now.QuadPart) {
3345 retry = FALSE;
3346 }
3347
3348 if (retry) {
3349 if (++tries < (Vcb->FcbCount >> 4) )
3350 goto again;
3351 }
3352
3353 ExReleaseResourceLite(&Vcb->FcbLock);
3354
3355 return 0;
3356}
3357

Callers 1

Ext2FcbReaperThreadFunction · 0.85

Calls 1

Ext2UnlinkFcbFunction · 0.85

Tested by

no test coverage detected