다음을 통해 공유


FSCTL_FILE_LEVEL_TRIM 제어 코드

FSCTL_FILE_LEVEL_TRIM 제어 코드는 파일에서 데이터 범위를 트리밍하는 메서드를 제공합니다. 파일 트리밍 범위는 액세스 성능을 향상시키기 위해 리소스 조직을 최적화할 수 있도록 기본 스토리지 디바이스로 변환됩니다. FSCTL_FILE_LEVEL_TRIM 요청을 사용하면 가상 디스크에서 해제된 데이터 범위에 해당하도록 실제 스토리지를 트리밍하는 동안 고정된 크기로 가상 디스크 파일을 다시 할당할 수 기본 있습니다.

이 작업을 수행하려면 다음 매개 변수를 사용하여 FltFsControlFile 또는 ZwFsControlFile을 호출합니다.

매개 변수

  • 인스턴스 [in]: FltFsControlFile 만 해당합니다. 호출자에 대한 불투명 인스턴스 포인터입니다. 이 매개 변수는 필수이며 NULL수 없습니다.

  • FileObject [in]: FltFsControlFile 만 해당합니다. 트리밍할 데이터가 있는 파일에 대한 파일 개체 포인터입니다. 이 매개 변수는 필수이며 NULL수 없습니다.

  • FileHandle [in]: ZwFsControlFile 만 해당합니다. 트리밍할 데이터가 있는 파일의 파일 핸들입니다. 이 매개 변수는 필수이며 NULL수 없습니다.

  • FsControlCode [in]: 작업에 대한 제어 코드입니다. 이 작업에는 FSCTL_FILE_LEVEL_TRIM 사용합니다.

  • InputBuffer [in]: 파일의 트리밍 범위 배열을 포함하는 FILE_LEVEL_TRIM 구조체에 대한 포인터입니다.

  • InputBufferLength [in]: InputBuffer 매개 변수가 가리키는 버퍼의 크기(바이트)입니다 . 이 값은 적어도 sizeof(FILE_LEVEL_TRIM)여야 합니다.

  • OutputBuffer [out]: 트리밍 작업의 결과를 수신하는 선택적 FILE_LEVEL_TRIM_OUTPUT 구조체에 대한 포인터입니다.

  • OutputBufferLength [out]: OutputBuffer 매개 변수가 가리키는 버퍼의 크기(바이트)입니다 . FILE_LEVEL_TRIM_OUTPUT OutputBuffer에 포함된 경우 이 값은 적어도 sizeof(FILE_LEVEL_TRIM_OUTPUT)여야 합니다. 그렇지 않으면 0으로 설정됩니다.

상태 블록

FltFsControlFile 또는 ZwFsControlFile 은 STATUS_SUCCESS 반환하거나 다음 값 중 하나일 수 있습니다.

코드 의미
STATUS_INVALID_PARAMETER 트리밍할 파일이 압축되거나 암호화되었거나 입력 또는 출력 버퍼 길이가 잘못되었거나 트리밍 범위가 지정되지 않았습니다.
STATUS_INSUFFICIENT_RESOURCES 내부 리소스 할당에 실패했습니다.
STATUS_FILE_LOCK_CONFLICT 트리밍 범위는 이전에 잠긴 바이트 범위의 일부입니다.
STATUS_VOLUME_DISMOUNTED 파일이 있는 볼륨은 탑재되지 않습니다.
STATUS_PURGE_FAILED 트리밍 범위에 대해 캐시 제거에 실패했습니다.
STATUS_NO_RANGES_PROCESSED 트리밍 범위 배열의 범위가 처리되지 않았습니다.

설명

특정 스토리지 디바이스에서 트리밍을 수행하면 향후 쓰기 성능이 크게 향상될 수 있습니다. Trim은 또한 씬 프로비전된 스토리지 시스템의 할당 풀에 리소스를 반환합니다. 가상 디스크에서 파일을 삭제하는 경우 가상 디스크 파일 자체의 크기는 변경되지 않습니다. 가상 디스크에서 해제된 데이터 범위는 가상 디스크 파일이 있는 실제 스토리지에서 잘리지 않습니다. 가상 디스크 디바이스는 가상 디스크 파일의 특정 데이터 범위를 FSCTL_FILE_LEVEL_TRIM 요청으로 물리적 스토리지 디바이스에서 트리밍할 수 있음을 파일 시스템에 알릴 수 있습니다. 그러면 파일 시스템에서 물리적 스토리지에 대한 트리밍 요청을 실행합니다. 데이터베이스 또는 메모리 스왑 파일을 관리하는 서비스 애플리케이션에서 FSCTL_FILE_LEVEL_TRIM 요청을 발급할 수도 있습니다.

FSCTL_FILE_LEVEL_TRIM 제어 코드는 스토리지 디바이스에서 파일의 선택한 바이트 범위를 트리밍하려고 시도합니다. 바이트 범위는 FILE_LEVEL_TRIM 구조의 Ranges 배열에 포함됩니다. Ranges 배열에는 하나 이상의 FILE_LEVEL_TRIM_RANGE 구조체가 포함되어 있습니다.

범위 배열에 겹치는 범위를 포함하는 것은 반드시 오류 조건이 아닙니다. 이는 기본 스토리지에서 익스텐트 처리를 처리하는 방법에 따라 달라집니다.

잘려진 범위는 파일 시스템 캐시에서 페이지로 제거됩니다. 캐시 페이지 크기와 일치하기 위해 트리밍 범위의 길이가 PAGE_SIZE 배수로 조정됩니다. 또한 트리밍 범위 오프셋이 페이지 경계에서 시작되지 않으면 다음 페이지 경계에 맞춰집니다. 이러한 제약 조건을 사용하면 오프셋이 페이지 정렬되지 않거나 길이가 페이지 크기가 여러 페이지가 아닌 경우 트리밍 범위 길이가 줄어듭니다. 원래 길이가 두 페이지 미만이고 오프셋이 페이지 정렬되지 않은 경우 트리밍 범위 길이가 0으로 줄어들 수 있습니다.

트리밍 범위를 지정하거나 EOF(파일 끝) 이상으로 페이지가 조정되면 범위는 무시됩니다. 그러나 EOF 앞에 정렬되었지만 EOF를 지나 길이가 확장되는 범위 오프셋은 여러 페이지 크기 <= EOF로 조정됩니다.

압축 또는 암호화된 파일(ATTRIBUTE_FLAG_COMPRESSION_MASK 또는 ATTRIBUTE_FLAG_ENCRYPTED 특성이 설정된 파일)에는 파일 수준 트리밍이 지원되지 않습니다.

파일 트리밍은 트랜잭션 외부에서 수행됩니다. 트리밍 작업은 롤백할 수 없습니다.

스파스 파일(ATTRIBUTE_FLAG_SPARSE 특성이 설정된 파일)을 사용하면 파일의 할당되지 않은 부분의 트리밍 범위가 무시됩니다.

OutputBuffer에 포함된 경우 FILE_LEVEL_TRIM_OUTPUT NumRangesProcessed 멤버는 성공적으로 처리된 트리밍 범위 수를 나타냅니다. 트리밍 범위를 처리하는 동안 오류가 발생하면 NumRangesProcessed는 처리되지 않은 범위의 다시기본 처리되지 않은 범위의 시작 인덱스를 지정하고 FILE_LEVEL_TRIM - 1의 NumRanges 멤버에서 끝납니다.

요구 사항

요구 사항 유형 요건
지원되는 최소 클라이언트 Windows 8
헤더 Ntifs.h(Ntifs.h 또는 Fltkernel.h 포함)

참고 항목

FILE_LEVEL_TRIM

FILE_LEVEL_TRIM_OUTPUT

FILE_LEVEL_TRIM_RANGE

FltCreateFile

FltFsControlFile

ZwCreateFile

ZwFsControlFile