NTSTATUS PvfsScheduleCancelNotify( PPVFS_IRP_CONTEXT pIrpContext ) { NTSTATUS ntError = STATUS_UNSUCCESSFUL; PPVFS_IRP_CONTEXT pIrpCtx = NULL; BAIL_ON_INVALID_PTR(pIrpContext->pScb, ntError); pIrpCtx = PvfsReferenceIrpContext(pIrpContext); ntError = LwRtlQueueWorkItem( gPvfsDriverState.ThreadPool, PvfsNotifyCleanIrpList, pIrpCtx, LW_SCHEDULE_HIGH_PRIORITY); BAIL_ON_NT_STATUS(ntError); error: if (!NT_SUCCESS(ntError)) { if (pIrpCtx) { PvfsReleaseIrpContext(&pIrpCtx); } } return ntError; }
VOID PvfsFreeNotifyRecord( PPVFS_NOTIFY_FILTER_RECORD *ppNotifyRecord ) { PPVFS_NOTIFY_FILTER_RECORD pFilter = NULL; if (ppNotifyRecord && *ppNotifyRecord) { pFilter = *ppNotifyRecord; if (pFilter->pIrpContext) { PvfsReleaseIrpContext(&pFilter->pIrpContext); } PvfsNotifyFreeChangeBuffer(&pFilter->Buffer); if (pFilter->pCcb) { PvfsReleaseCCB(pFilter->pCcb); } PVFS_FREE(ppNotifyRecord); } return; }
VOID PvfsFreeCreateContext( IN OUT PVOID *ppContext ) { PPVFS_PENDING_CREATE pCreateCtx = NULL; if (ppContext && *ppContext) { pCreateCtx = (PPVFS_PENDING_CREATE)*ppContext; if (pCreateCtx->pIrpContext) { PvfsReleaseIrpContext(&pCreateCtx->pIrpContext); } if (pCreateCtx->pCcb) { PvfsReleaseCCB(pCreateCtx->pCcb); } if (pCreateCtx->pFcb) { PvfsReleaseFCB(&pCreateCtx->pFcb); } RtlCStringFree(&pCreateCtx->pszDiskFilename); RtlCStringFree(&pCreateCtx->pszOriginalFilename); PVFS_FREE(ppContext); } return; }
static VOID PvfsFreeSetAllocationContext( IN OUT PVOID *ppContext ) { PPVFS_PENDING_SET_ALLOCATION pAllocationCtx = NULL; if (ppContext && ppContext) { pAllocationCtx = (PPVFS_PENDING_SET_ALLOCATION)(*ppContext); if (pAllocationCtx->pIrpContext) { PvfsReleaseIrpContext(&pAllocationCtx->pIrpContext); } if (pAllocationCtx->pCcb) { PvfsReleaseCCB(pAllocationCtx->pCcb); } PVFS_FREE(ppContext); } return; }
static VOID PvfsFreeSetEndOfFileContext( IN OUT PVOID *ppContext ) { PPVFS_PENDING_SET_END_OF_FILE pEoFCtx = NULL; if (ppContext && *ppContext) { pEoFCtx = (PPVFS_PENDING_SET_END_OF_FILE)(*ppContext); if (pEoFCtx->pIrpContext) { PvfsReleaseIrpContext(&pEoFCtx->pIrpContext); } if (pEoFCtx->pCcb) { PvfsReleaseCCB(pEoFCtx->pCcb); } PVFS_FREE(ppContext); } return; }
static VOID PvfsFreeReadContext( IN OUT PVOID *ppContext ) { PPVFS_PENDING_READ pReadCtx = NULL; if (ppContext && *ppContext) { pReadCtx = (PPVFS_PENDING_READ)(*ppContext); if (pReadCtx->pZctContext) { PvfsFreeZctContext(&pReadCtx->pZctContext); } if (pReadCtx->pIrpContext) { PvfsReleaseIrpContext(&pReadCtx->pIrpContext); } if (pReadCtx->pCcb) { PvfsReleaseCCB(pReadCtx->pCcb); } PVFS_FREE(ppContext); } return; }
static VOID PvfsNotifyCleanIrpList( PVOID pContext ) { PPVFS_IRP_CONTEXT pIrpCtx = (PPVFS_IRP_CONTEXT)pContext; PPVFS_FCB pFcb = NULL; BOOLEAN bFcbLocked = FALSE; PPVFS_NOTIFY_FILTER_RECORD pFilter = NULL; PLW_LIST_LINKS pFilterLink = NULL; PLW_LIST_LINKS pNextLink = NULL; BOOLEAN bFound = FALSE; LWIO_ASSERT(pIrpCtx->pScb->pOwnerFcb); // We have the IrpCtx->Scb's reference so no need to take another pFcb = pIrpCtx->pScb->pOwnerFcb; LWIO_LOCK_MUTEX(bFcbLocked, &pFcb->BaseControlBlock.Mutex); pFilterLink = PvfsListTraverse(pFcb->pNotifyListIrp, NULL); while (pFilterLink) { pFilter = LW_STRUCT_FROM_FIELD( pFilterLink, PVFS_NOTIFY_FILTER_RECORD, NotifyList); pNextLink = PvfsListTraverse(pFcb->pNotifyListIrp, pFilterLink); if (pFilter->pIrpContext != pIrpCtx) { pFilterLink = pNextLink; continue; } bFound = TRUE; PvfsListRemoveItem(pFcb->pNotifyListIrp, pFilterLink); pFilterLink = NULL; LWIO_UNLOCK_MUTEX(bFcbLocked, &pFcb->BaseControlBlock.Mutex); pFilter->pIrpContext->pIrp->IoStatusBlock.Status = STATUS_CANCELLED; PvfsCompleteIrpContext(pFilter->pIrpContext); PvfsFreeNotifyRecord(&pFilter); /* Can only be one IrpContext match so we are done */ } LWIO_UNLOCK_MUTEX(bFcbLocked, &pFcb->BaseControlBlock.Mutex); if (!bFound) { pIrpCtx->pIrp->IoStatusBlock.Status = STATUS_CANCELLED; PvfsCompleteIrpContext(pIrpCtx); } if (pIrpCtx) { PvfsReleaseIrpContext(&pIrpCtx); } return; }