| 273 | } |
| 274 | |
| 275 | VOID |
| 276 | Ext2ReleaseFcb (IN PEXT2_FCB Fcb) |
| 277 | { |
| 278 | PEXT2_VCB Vcb = Fcb->Vcb; |
| 279 | PEXT2_MCB Mcb; |
| 280 | |
| 281 | if (0 != Ext2DerefXcb(&Fcb->ReferenceCount)) |
| 282 | return; |
| 283 | |
| 284 | ExAcquireResourceExclusiveLite(&Vcb->FcbLock, TRUE); |
| 285 | ExAcquireResourceExclusiveLite(&Fcb->MainResource, TRUE); |
| 286 | |
| 287 | Mcb = Fcb->Mcb; |
| 288 | RemoveEntryList(&Fcb->Next); |
| 289 | |
| 290 | if (IsFlagOn(Fcb->Flags, FCB_DELETE_PENDING) || |
| 291 | NULL == Mcb || IsFileDeleted(Mcb)) { |
| 292 | InsertHeadList(&Vcb->FcbList, &Fcb->Next); |
| 293 | Fcb->TsDrop.QuadPart = 0; |
| 294 | } else { |
| 295 | InsertTailList(&Vcb->FcbList, &Fcb->Next); |
| 296 | KeQuerySystemTime(&Fcb->TsDrop); |
| 297 | } |
| 298 | ExReleaseResourceLite(&Fcb->MainResource); |
| 299 | ExReleaseResourceLite(&Vcb->FcbLock); |
| 300 | |
| 301 | if ((Vcb->FcbCount >> 6) > (ULONG)(Ext2Global->MaxDepth)) { |
| 302 | KeSetEvent(&Ext2Global->FcbReaper.Wait, 0, FALSE); |
| 303 | } |
| 304 | } |
| 305 | |
| 306 | /* Insert Fcb to Vcb->FcbList queue, with Vcb->FcbLock Acquired. */ |
| 307 |
no outgoing calls
no test coverage detected