sys: FspFsvolCreateRetryComplete

This commit is contained in:
Bill Zissimopoulos 2016-01-26 20:43:51 -08:00
parent 79a6539caa
commit e86f4b0836
3 changed files with 35 additions and 38 deletions

View File

@ -362,38 +362,7 @@ NTSTATUS FspFsvolCreatePrepare(
FSP_FILE_DESC *FileDesc; FSP_FILE_DESC *FileDesc;
PFILE_OBJECT FileObject; PFILE_OBJECT FileObject;
if (FspFsctlTransactReservedKind == Request->Kind) if (FspFsctlTransactCreateKind == Request->Kind)
{
/*
* This branch is not taken during IRP preparation, but rather during IRP completion
* when FlushImageSection needs to be retried.
*/
FileDesc = FspIopRequestContext(Request, RequestFileDesc);
FileNode = FileDesc->FileNode;
FileObject = FspIopRequestContext(Request, RequestFileObject);
Result = FspFsvolCreateTryOpen(Irp, Request, FileNode, FileDesc, FileObject);
if (STATUS_PENDING == Result)
return Result;
else
{
if (NT_SUCCESS(Result))
{
/* SUCCESS! */
FspFileNodeSetFileInfo(FileNode, &FileDesc->State.FileInfo);
FspIopRequestContext(Request, RequestFileDesc) = 0;
Irp->IoStatus.Information = FILE_OPENED;
Result = STATUS_SUCCESS;
}
DEBUGLOGIRP(Irp, Result);
FspIopCompleteIrp(Irp, Result);
return FSP_STATUS_COMPLETED;
}
}
else if (FspFsctlTransactCreateKind == Request->Kind)
{ {
SecuritySubjectContext = &IrpSp->Parameters.Create.SecurityContext-> SecuritySubjectContext = &IrpSp->Parameters.Create.SecurityContext->
AccessState->SubjectSecurityContext; AccessState->SubjectSecurityContext;
@ -718,7 +687,38 @@ NTSTATUS FspFsvolCreateRetryComplete(
{ {
PAGED_CODE(); PAGED_CODE();
return STATUS_NOT_IMPLEMENTED; NTSTATUS Result;
FSP_FSCTL_TRANSACT_REQ *Request = FspIrpRequest(Irp);
FSP_FILE_NODE *FileNode;
FSP_FILE_DESC *FileDesc;
PFILE_OBJECT FileObject;
ASSERT(FspFsctlTransactReservedKind == Request->Kind);
FileDesc = FspIopRequestContext(Request, RequestFileDesc);
FileNode = FileDesc->FileNode;
FileObject = FspIopRequestContext(Request, RequestFileObject);
Result = FspFsvolCreateTryOpen(Irp, Request, FileNode, FileDesc, FileObject);
if (STATUS_PENDING == Result)
return Result;
else
{
if (NT_SUCCESS(Result))
{
/* SUCCESS! */
FspFileNodeSetFileInfo(FileNode, &FileDesc->State.FileInfo);
FspIopRequestContext(Request, RequestFileDesc) = 0;
Irp->IoStatus.Information = FILE_OPENED;
Result = STATUS_SUCCESS;
}
DEBUGLOGIRP(Irp, Result);
FspIopCompleteIrp(Irp, Result);
return STATUS_SUCCESS;
}
} }
static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request, static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request,
@ -760,7 +760,7 @@ static NTSTATUS FspFsvolCreateTryOpen(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request,
Request->Kind = FspFsctlTransactReservedKind; Request->Kind = FspFsctlTransactReservedKind;
} }
FspIoqPostIrpBestEffort(FsvolDeviceExtension->Ioq, Irp, &Result); FspIoqRetryCompleteIrp(FsvolDeviceExtension->Ioq, Irp, &Result);
return Result; return Result;
} }

View File

@ -29,7 +29,6 @@
#define FSP_STATUS_PRIVATE_BIT (0x20000000) #define FSP_STATUS_PRIVATE_BIT (0x20000000)
#define FSP_STATUS_IOQ_POST (FSP_STATUS_PRIVATE_BIT | 0x0000) #define FSP_STATUS_IOQ_POST (FSP_STATUS_PRIVATE_BIT | 0x0000)
#define FSP_STATUS_IOQ_POST_BEST_EFFORT (FSP_STATUS_PRIVATE_BIT | 0x0001) #define FSP_STATUS_IOQ_POST_BEST_EFFORT (FSP_STATUS_PRIVATE_BIT | 0x0001)
#define FSP_STATUS_COMPLETED (FSP_STATUS_PRIVATE_BIT | 0x0002)
/* misc macros */ /* misc macros */
#define FSP_ALLOC_INTERNAL_TAG 'IpsF' #define FSP_ALLOC_INTERNAL_TAG 'IpsF'

View File

@ -594,9 +594,7 @@ NTSTATUS FspVolumeTransact(
PendingIrpRequest = FspIrpRequest(PendingIrp); PendingIrpRequest = FspIrpRequest(PendingIrp);
Result = FspIopDispatchPrepare(PendingIrp, PendingIrpRequest); Result = FspIopDispatchPrepare(PendingIrp, PendingIrpRequest);
if (FSP_STATUS_COMPLETED == Result) if (STATUS_PENDING == Result)
;
else if (STATUS_PENDING == Result)
{ {
/* /*
* The IRP has been reposted to our Ioq. Remember the first such IRP, * The IRP has been reposted to our Ioq. Remember the first such IRP,