FSCTL_REQUEST_OPLOCK IOCTL(winioctl.h)
파일에 대한 기회 잠금(oplock)을 요청하고 oplock 중단이 발생했음을 인정합니다.
이 작업을 수행하려면 다음 매개 변수를 사용하여 DeviceIoControl 함수를 호출합니다.
BOOL DeviceIoControl(
(HANDLE) hDevice, // handle to file
FSCTL_REQUEST_OPLOCK, // dwIoControlCode
(LPVOID) lpInBuffer, // pointer to REQUEST_OPLOCK_INPUT_BUFFER
(DWORD) nInBufferSize, // size of input buffer
(LPVOID) lpOutBuffer, // pointer to REQUEST_OPLOCK_OUTPUT_BUFFER
(DWORD) nOutBufferSize, // size of output buffer
NULL, // number of bytes returned
(LPOVERLAPPED) lpOverlapped // OVERLAPPED structure
);
발언
이 작업은 클라이언트 애플리케이션에서 로컬 서버에서 기회 잠금(oplock)을 요청하는 데 사용됩니다. 클라이언트 애플리케이션은 원격 서버에서 직접 기회 잠금을 요청해서는 안 됩니다. 네트워크 리디렉션자는 애플리케이션에 대한 기회 잠금을 투명하게 요청합니다. 이 작업을 사용하여 원격 서버에서 기회 잠금을 요청하면 요청이 거부됩니다.
DeviceIoControl 작업이 오류 코드 ERROR_IO_PENDING반환하면 oplock 요청이 부여됩니다. 다른 오류 코드를 반환하는 경우 oplock이 부여되지 않았습니다. 오류 코드가 ERROR_CANNOT_GRANT_REQUESTED_OPLOCK 같은 경고 값인 경우 REQUEST_OPLOCK_OUTPUT_BUFFER 구조에서 확장 정보를 사용할 수 있습니다.
부여된 oplock이 중단되면 OVERLAPPED 구조체의 이벤트 개체에 신호가 전송되고 정보가 REQUEST_OPLOCK_OUTPUT_BUFFER 구조에 반환됩니다. OVERLAPPED 구조의 내부 멤버는 oplock이 어떻게 끊어졌는지에 대한 확장 정보를 제공하는 NTSTATUS 값으로 설정됩니다.
겹쳐진. 내부 값 | 의미 |
---|---|
STATUS_SUCCESS 0x0 |
다른 파일 시스템 작업으로 인해 oplock이 손상되었습니다. |
STATUS_OPLOCK_HANDLE_CLOSED 0x00000216 |
oplock을 요청하는 데 사용된 파일 핸들이 닫혔기 때문에 oplock이 더 이상 적용되지 않습니다. oplock을 요청하는 데 사용된 핸들이 닫혔기 때문에 oplock이 중단되는 경우 oplock 형식에 관계없이 중단을 승인할 필요가 없습니다. |
STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE 0x00000215 |
oplock은 여전히 유효합니다. 그러나 더 이상 요청하는 데 사용된 파일 핸들과 연결되지 않습니다. 호출자는 파일에 다른 핸들을 사용하여 새 oplock을 요청했으며, 해당 핸들은 이제 oplock을 소유합니다. |
FSCTL_REQUEST_OPLOCK 제어 코드는 FSCTL_REQUEST_OPLOCK_LEVEL_1, FSCTL_REQUEST_OPLOCK_LEVEL_2, FSCTL_REQUEST_FILTER_OPLOCK및 FSCTL_REQUEST_BATCH_OPLOCK관련된 제어 코드보다 더 효율적인 기능을 제공합니다. 를 사용할 때 핸들을 닫고 다시 열지 않고 동일한 핸들에서 다른 oplock 수준을 반복적으로 요청할 수 FSCTL_REQUEST_OPLOCK; 다른 컨트롤 코드에서는 핸들을 닫은 다음 CreateFile 다시 열어 이러한 변경을 수행해야 합니다. 이 작업은 FSCTL_REQUEST_OPLOCK 제어 코드를 다시 발급할 때 REQUEST_OPLOCK_INPUT_BUFFER 구조체의 RequestedOplockLevel 멤버를 조작하여 수행됩니다.
다음 표에서는 FSCTL_REQUEST_OPLOCK 사용할 수 있는 oplock 형식의 캐싱 기능이 수준 2, 수준 1 및 일괄 처리 oplock에 해당하는 방법을 요약합니다.
대체 제어 코드 | 해당 RequestedOplockLevel 플래그 값 | Oplock 형식 |
---|---|---|
FSCTL_REQUEST_BATCH_OPLOCK | OPLOCK_LEVEL_CACHE_READ \| OPLOCK_LEVEL_CACHE_WRITE \| OPLOCK_LEVEL_CACHE_HANDLE |
RWH |
FSCTL_REQUEST_OPLOCK_LEVEL_1 | OPLOCK_LEVEL_CACHE_READ \| OPLOCK_LEVEL_CACHE_WRITE |
RW |
FSCTL_REQUEST_OPLOCK_LEVEL_2 | OPLOCK_LEVEL_CACHE_READ |
R |
RequestedOplockLevel 멤버가 OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE
설정된 FSCTL_REQUEST_OPLOCK 제어 코드를 사용하면 RH 형식의 oplock이 부여됩니다. RH oplock은 FSCTL_REQUEST_FILTER_OPLOCK 제어 코드에서 부여한 필터 oplock과 유사합니다. 그러나 필터 oplock을 사용하면 한 번에 하나의 클라이언트만 파일에 oplock을 유지할 수 있습니다. FSCTL_REQUEST_OPLOCK 한 번에 여러 클라이언트가 파일에 대한 RH 잠금을 가질 수 있습니다. 또 다른 차이점은 쓰기가 발생하기 전에 FSCTL_REQUEST_FILTER_OPLOCK oplock 중단 승인이 필요하다는 점입니다. 여기서 FSCTL_REQUEST_OPLOCK oplock 중단 알림은 권고 전용이며 쓰기는 승인 없이 진행할 수 있기 때문입니다. 자세한 내용은 중단 Oplocks참조하세요.
파일이 겹치지 않는(동기) 모드로 열려 있으면 FSCTL_REQUEST_OPLOCK 제어 코드가 실패합니다.
이 작업에 겹치는 I/O의 의미는 DeviceIoControl 항목의 설명 섹션을 참조하세요.
Windows 8 및 Windows Server 2012에서 이 코드는 다음 기술에서 지원됩니다.
기술 | 지원 |
---|---|
SMB(서버 메시지 블록) 3.0 프로토콜 | 아니요 |
SMB 3.0 TFO(투명한 장애 조치(failover) | 아니요 |
SO(스케일 아웃 파일 공유)가 있는 SMB 3.0 | 아니요 |
CsvFS(클러스터 공유 볼륨 파일 시스템) | 예 |
ReFS(복원 파일 시스템) | 예 |
또한 Windows 8 및 Windows Server 2012부터 FSCTL_REQUEST_OPLOCK 제어 코드를 사용하여 디렉터리 및 파일에 대한 oplock을 요청할 수 있습니다. 디렉터리에 대한 oplock 요청은 RequestedOplockLevel 멤버에서 OPLOCK_LEVEL_CACHE_READ
또는 OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE
지정할 수 있습니다.
디렉터리 열거형의 내용이 변경되면 디렉터리의 R 또는 RH oplock이 None으로 바뀝니다. 예를 들어 디렉터리에서 파일을 추가/삭제하고, 디렉터리에 있는 파일의 크기를 변경하고, 디렉터리에 있는 파일의 타임스탬프를 수정하면 디렉터리의 oplock이 모두 중단됩니다. 이 oplock 중단은 디렉터리의 변경이 발생하기 전에 승인이 필요하지 않습니다. 권고 전용입니다.
디렉터리 자체의 이름을 바꾸거나 삭제하면 디렉터리의 RH oplock이 R로 중단됩니다. 이 oplock 중단은 디렉터리 변경이 발생하기 전에 승인이 필요합니다.
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 7 [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2008 R2 [데스크톱 앱만 해당] |
헤더 | winioctl.h(Windows.h 포함) |
참고 항목
- CreateFile
- DeviceIoControl
- 겹치는
- oplock 의미 체계
- 기회 잠금