diff --git a/src/sys/driver.h b/src/sys/driver.h index b4656c22..4e6f3ec2 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -122,8 +122,11 @@ VOID FspDebugLogIrp(const char *func, PIRP Irp, NTSTATUS Result); #if DBG #define DEBUGTEST(Percent) \ (0 == (fsp_debug & fsp_debug_dt) || DebugRandom() <= (Percent) * 0x7fff / 100) +#define DEBUGTEST_EX(C, Percent, Deflt) \ + ((C) ? DEBUGTEST(Percent) : (Deflt)) #else #define DEBUGTEST(Percent) (TRUE) +#define DEBUGTEST_EX(C, Percent, Deflt) (Deflt) #endif /* FSP_ENTER/FSP_LEAVE */ diff --git a/src/sys/fileinfo.c b/src/sys/fileinfo.c index 32ce5475..9fafd26f 100644 --- a/src/sys/fileinfo.c +++ b/src/sys/fileinfo.c @@ -1069,7 +1069,8 @@ retry: */ Result = FspCheckOplockEx(FspFileNodeAddrOfOplock(FileNode), Irp, OPLOCK_FLAG_COMPLETE_IF_OPLOCKED, 0, 0, 0); - if (STATUS_OPLOCK_BREAK_IN_PROGRESS == Result) + if (STATUS_OPLOCK_BREAK_IN_PROGRESS == Result || + DEBUGTEST_EX(NT_SUCCESS(Result), 10, FALSE)) { FspFileNodeRelease(FileNode, Full); Result = FspCheckOplock(FspFileNodeAddrOfOplock(FileNode), Irp, 0, 0, 0); @@ -1203,7 +1204,8 @@ retry: */ Result = FspCheckOplockEx(FspFileNodeAddrOfOplock(FileNode), Irp, OPLOCK_FLAG_COMPLETE_IF_OPLOCKED, 0, 0, 0); - if (STATUS_OPLOCK_BREAK_IN_PROGRESS == Result) + if (STATUS_OPLOCK_BREAK_IN_PROGRESS == Result || + DEBUGTEST_EX(NT_SUCCESS(Result), 10, FALSE)) { FspFileNodeRelease(FileNode, Full); FspFsvolDeviceFileRenameRelease(FsvolDeviceObject); @@ -1424,7 +1426,8 @@ retry: */ Result = FspCheckOplockEx(FspFileNodeAddrOfOplock(FileNode), Irp, OPLOCK_FLAG_COMPLETE_IF_OPLOCKED, 0, 0, 0); - if (STATUS_OPLOCK_BREAK_IN_PROGRESS == Result) + if (STATUS_OPLOCK_BREAK_IN_PROGRESS == Result || + DEBUGTEST_EX(NT_SUCCESS(Result), 10, FALSE)) { FspFileNodeRelease(FileNode, Full); Result = FspCheckOplock(FspFileNodeAddrOfOplock(FileNode), Irp, 0, 0, 0);