diff --git a/src/sys/create.c b/src/sys/create.c index eacf7233..d4860dec 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -405,13 +405,10 @@ NTSTATUS FspFsvolCreatePrepare( FileObject = FspIopRequestContext(Request, RequestFileObject); /* lock the FileNode for overwriting */ - Success = FspFileNodeTryAcquireExclusive(FileNode, Both); + Success = DEBUGRANDTEST(90, TRUE) && FspFileNodeTryAcquireExclusive(FileNode, Both); if (!Success) { - /* repost the IRP to retry later */ - FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = - FspFsvolDeviceExtension(IrpSp->DeviceObject); - FspIoqPostIrpBestEffort(FsvolDeviceExtension->Ioq, Irp, &Result); + FspIopRetryPrepareIrp(Irp, &Result); return Result; } diff --git a/src/sys/driver.h b/src/sys/driver.h index 3661f04f..d4a74408 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -424,6 +424,7 @@ NTSTATUS FspIopPostWorkRequestFunnel(PDEVICE_OBJECT DeviceObject, FSP_FSCTL_TRANSACT_REQ *Request, BOOLEAN BestEffort); VOID FspIopCompleteIrpEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceDereference); VOID FspIopCompleteCanceledIrp(PIRP Irp); +BOOLEAN FspIopRetryPrepareIrp(PIRP Irp, NTSTATUS *PResult); BOOLEAN FspIopRetryCompleteIrp(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response, NTSTATUS *PResult); FSP_FSCTL_TRANSACT_RSP *FspIopIrpResponse(PIRP Irp); NTSTATUS FspIopDispatchPrepare(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request); diff --git a/src/sys/fileinfo.c b/src/sys/fileinfo.c index 7c1b62de..077cc877 100644 --- a/src/sys/fileinfo.c +++ b/src/sys/fileinfo.c @@ -562,6 +562,7 @@ NTSTATUS FspFsvolQueryInformationComplete( ASSERT(FSP_STATUS_IOQ_POST != Result); + if (STATUS_PENDING != Result) Irp->IoStatus.Information = (UINT_PTR)((PUINT8)Buffer - (PUINT8)Irp->AssociatedIrp.SystemBuffer); FSP_LEAVE_IOC("%s, FileObject=%p", diff --git a/src/sys/iop.c b/src/sys/iop.c index 83d3aef9..eb596680 100644 --- a/src/sys/iop.c +++ b/src/sys/iop.c @@ -18,6 +18,7 @@ NTSTATUS FspIopPostWorkRequestFunnel(PDEVICE_OBJECT DeviceObject, static IO_COMPLETION_ROUTINE FspIopPostWorkRequestCompletion; VOID FspIopCompleteIrpEx(PIRP Irp, NTSTATUS Result, BOOLEAN DeviceDereference); VOID FspIopCompleteCanceledIrp(PIRP Irp); +BOOLEAN FspIopRetryPrepareIrp(PIRP Irp, NTSTATUS *PResult); BOOLEAN FspIopRetryCompleteIrp(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response, NTSTATUS *PResult); FSP_FSCTL_TRANSACT_RSP *FspIopIrpResponse(PIRP Irp); NTSTATUS FspIopDispatchPrepare(PIRP Irp, FSP_FSCTL_TRANSACT_REQ *Request); @@ -31,6 +32,7 @@ NTSTATUS FspIopDispatchComplete(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response #pragma alloc_text(PAGE, FspIopPostWorkRequestFunnel) #pragma alloc_text(PAGE, FspIopCompleteIrpEx) #pragma alloc_text(PAGE, FspIopCompleteCanceledIrp) +#pragma alloc_text(PAGE, FspIopRetryPrepareIrp) #pragma alloc_text(PAGE, FspIopRetryCompleteIrp) #pragma alloc_text(PAGE, FspIopIrpResponse) #pragma alloc_text(PAGE, FspIopDispatchPrepare) @@ -266,6 +268,16 @@ VOID FspIopCompleteCanceledIrp(PIRP Irp) FspIopCompleteIrpEx(Irp, STATUS_CANCELLED, TRUE); } +BOOLEAN FspIopRetryPrepareIrp(PIRP Irp, NTSTATUS *PResult) +{ + PAGED_CODE(); + + PDEVICE_OBJECT DeviceObject = IoGetCurrentIrpStackLocation(Irp)->DeviceObject; + FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); + + return FspIoqPostIrpBestEffort(FsvolDeviceExtension->Ioq, Irp, PResult); +} + BOOLEAN FspIopRetryCompleteIrp(PIRP Irp, const FSP_FSCTL_TRANSACT_RSP *Response, NTSTATUS *PResult) { PAGED_CODE();