142 lines
3.4 KiB
C
142 lines
3.4 KiB
C
/*++
|
|
|
|
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 );
|
|
}
|
|
}
|
|
}
|