windows-nt/Source/XPSP1/NT/admin/pchealth/sr/kernel/lock.c

142 lines
3.4 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1998-1999 Microsoft Corporation
Module Name:
lock.c
Abstract:
this file contains the routines that help with managing the
volume locks.
Author:
Molly Brown (mollybro) 04-Jan-2001
Revision History:
--*/
#include "precomp.h"
#ifdef ALLOC_PRAGMA
#pragma alloc_text( PAGE, SrPauseVolumeActivity )
#pragma alloc_text( PAGE, SrResumeVolumeActivity )
#endif // ALLOC_PRAGMA
/***************************************************************************++
Routine Description:
This routine will exclusively acquire the ActivityLock for each volume
in the system. Once the lock is acquired, we set the flag in the device
extension saying that we know it is acquired so that we know what we need
to release in case of an error.
Note: This routine assumes that the DeviceExtensionListLock is already
held, either shared or exclusive.
Arguments:
None
Return Value:
Returns STATUS_SUCCESS if all the locks were acquired successfully and
returns STATUS_LOCK_NOT_GRANTED otherwise.
--***************************************************************************/
NTSTATUS
SrPauseVolumeActivity (
)
{
NTSTATUS status = STATUS_LOCK_NOT_GRANTED;
PLIST_ENTRY pCurrentEntry;
PSR_DEVICE_EXTENSION pExtension;
ASSERT( IS_DEVICE_EXTENSION_LIST_LOCK_ACQUIRED() );
try {
for (pCurrentEntry = global->DeviceExtensionListHead.Flink;
pCurrentEntry != &global->DeviceExtensionListHead;
pCurrentEntry = pCurrentEntry->Flink) {
pExtension = CONTAINING_RECORD( pCurrentEntry,
SR_DEVICE_EXTENSION,
ListEntry );
ASSERT( IS_VALID_SR_DEVICE_EXTENSION( pExtension ) );
SrAcquireActivityLockExclusive( pExtension );
pExtension->ActivityLockHeldExclusive = TRUE;
}
//
// We successfully acquired all the volume activity locks exclusively.
//
status = STATUS_SUCCESS;
} finally {
status = FinallyUnwind( SrPauseVolumeActivity, status );
if (!NT_SUCCESS( status )) {
SrResumeVolumeActivity();
}
}
RETURN( status );
}
/***************************************************************************++
Routine Description:
This routine will iterate through this list of device extensions and
release any activity locks that are held.
Note: This routine assumes that the DeviceExtensionListLock is already
held, either shared or exclusive.
Arguments:
None
Return Value:
None.
--***************************************************************************/
VOID
SrResumeVolumeActivity (
)
{
PLIST_ENTRY pCurrentEntry;
PSR_DEVICE_EXTENSION pExtension;
ASSERT( IS_DEVICE_EXTENSION_LIST_LOCK_ACQUIRED() );
for (pCurrentEntry = global->DeviceExtensionListHead.Flink;
pCurrentEntry != &global->DeviceExtensionListHead;
pCurrentEntry = pCurrentEntry->Flink) {
pExtension = CONTAINING_RECORD( pCurrentEntry,
SR_DEVICE_EXTENSION,
ListEntry );
ASSERT( IS_VALID_SR_DEVICE_EXTENSION( pExtension ) );
if (pExtension->ActivityLockHeldExclusive) {
pExtension->ActivityLockHeldExclusive = FALSE;
SrReleaseActivityLock( pExtension );
}
}
}