Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
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;
}
Пример #6
0
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;
}
Пример #7
0
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;
}