2437 TRACE(
"(%p, %p, %I64x, %I64x)\n",
Vcb,
c, stripe_start, stripe_end);
2439 full_stripe_len = (
c->chunk_item->num_stripes - num_parity_stripes) *
c->chunk_item->stripe_length;
2440 run_start =
c->offset + (stripe_start * full_stripe_len);
2441 run_end =
c->offset + ((stripe_end + 1) * full_stripe_len);
2443 searchkey.
obj_id = run_start;
2445 searchkey.
offset = 0xffffffffffffffff;
2449 ERR(
"find_item returned %08lx\n",
Status);
2453 num_sectors = (
uint32_t)(((stripe_end - stripe_start + 1) * full_stripe_len) >>
Vcb->sector_shift);
2458 ERR(
"out of memory\n");
2464 ERR(
"out of memory\n");
2476 if (!
context.parity_scratch) {
2477 ERR(
"out of memory\n");
2486 ERR(
"out of memory\n");
2498 ERR(
"out of memory\n");
2509 if (!
context.parity_scratch2) {
2510 ERR(
"out of memory\n");
2536 bool extent_is_tree =
false;
2541 extent_is_tree =
true;
2552 extent_is_tree =
true;
2563 searchkey.
offset = extent_start;
2567 ERR(
"find_item returned %08lx\n",
Status);
2585 (
ULONG)(((csum_end - csum_start) *
Vcb->csum_size) >>
Vcb->sector_shift));
2605 ERR(
"out of memory\n");
2610 max_read = (
uint32_t)
min(1048576 /
c->chunk_item->stripe_length, stripe_end - stripe_start + 1);
2612 for (
i = 0;
i <
c->chunk_item->num_stripes;
i++) {
2617 ERR(
"out of memory\n");
2619 for (
j = 0;
j <
i;
j++) {
2629 if (!
context.stripes[
i].errorarr) {
2632 ERR(
"out of memory\n");
2636 for (
j = 0;
j <
i;
j++) {
2648 context.stripes[
i].rewrite =
false;
2660 bool need_wait =
false;
2662 if (max_read < stripe_end + 1 -
stripe)
2663 read_stripes = max_read;
2667 context.stripes_left =
c->chunk_item->num_stripes;
2670 for (
i = 0;
i <
c->chunk_item->num_stripes;
i++) {
2671 if (
c->devices[
i]->devobj) {
2677 ERR(
"IoAllocateIrp failed\n");
2690 if (!
context.stripes[
i].Irp->AssociatedIrp.SystemBuffer) {
2691 ERR(
"out of memory\n");
2701 if (!
context.stripes[
i].Irp->MdlAddress) {
2702 ERR(
"IoAllocateMdl failed\n");
2716 ERR(
"MmProbeAndLockPages threw exception %08lx\n",
Status);
2729 context.stripes[
i].missing =
false;
2733 Vcb->scrub.data_scrubbed += read_stripes *
c->chunk_item->stripe_length;
2744 ERR(
"too many missing devices (%u, maximum 1)\n", missing_devices);
2748 ERR(
"too many missing devices (%u, maximum 2)\n", missing_devices);
2756 for (
i = 0;
i <
c->chunk_item->num_stripes;
i++) {
2757 if (
c->devices[
i]->devobj)
2765 for (
i = 0;
i <
c->chunk_item->num_stripes;
i++) {
2774 for (
i = 0;
i < read_stripes;
i++) {
2778 for (
i = 0;
i < read_stripes;
i++) {
2785 for (
i = 0;
i <
c->chunk_item->num_stripes;
i++) {
2796 context.stripes[
i].buf, (
uint32_t)(read_stripes *
c->chunk_item->stripe_length));
2799 ERR(
"write_data_phys returned %08lx\n",
Status);
2809 }
while (
stripe < stripe_end);
2814 for (
i = 0;
i <
c->chunk_item->num_stripes;
i++) {
#define STATUS_INSUFFICIENT_RESOURCES
NTSYSAPI void WINAPI RtlInitializeBitMap(PRTL_BITMAP, PULONG, ULONG)
VOID NTAPI MmUnlockPages(IN PMDL Mdl)
unsigned short int uint16_t
NTSTATUS NTSTATUS bool find_next_item(_Requires_lock_held_(_Curr_->tree_lock) device_extension *Vcb, const traverse_ptr *tp, traverse_ptr *next_tp, bool ignore, PIRP Irp) __attribute__((nonnull(1
#define TYPE_METADATA_ITEM
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
#define STATUS_INTERNAL_ERROR
void chunk_unlock_range(_In_ device_extension *Vcb, _In_ chunk *c, _In_ uint64_t start, _In_ uint64_t length)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
_In_ uint64_t _In_ uint64_t _In_ uint64_t _In_opt_ traverse_ptr * tp
GLboolean GLboolean GLboolean b
NTSTATUS write_data_phys(_In_ PDEVICE_OBJECT device, _In_ PFILE_OBJECT fileobj, _In_ uint64_t address, _In_reads_bytes_(length) void *data, _In_ uint32_t length)
NTSTATUS find_item(_In_ _Requires_lock_held_(_Curr_->tree_lock) device_extension *Vcb, _In_ root *r, _Out_ traverse_ptr *tp, _In_ const KEY *searchkey, _In_ bool ignore, _In_opt_ PIRP Irp) __attribute__((nonnull(1
#define NT_SUCCESS(StatCode)
#define EXCEPTION_EXECUTE_HANDLER
static void scrub_raid5_stripe(device_extension *Vcb, chunk *c, scrub_context_raid56 *context, uint64_t stripe_start, uint64_t bit_start, uint64_t num, uint16_t missing_devices)
void chunk_lock_range(_In_ device_extension *Vcb, _In_ chunk *c, _In_ uint64_t start, _In_ uint64_t length)
_In_opt_ PVOID _In_ ULONG _In_ PVOID context
VOID NTAPI IoFreeMdl(PMDL Mdl)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define InterlockedDecrement
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
#define BTRFS_DEV_STAT_READ_ERRORS
PMDL NTAPI IoAllocateMdl(IN PVOID VirtualAddress, IN ULONG Length, IN BOOLEAN SecondaryBuffer, IN BOOLEAN ChargeQuota, IN PIRP Irp)
#define KeInitializeEvent(pEvt, foo, foo2)
#define IRP_INPUT_OPERATION
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
void log_device_error(_In_ device_extension *Vcb, _Inout_ device *dev, _In_ int error)
#define EXTENT_ITEM_TREE_BLOCK
_In_ PIO_STACK_LOCATION IrpSp
NTSYSAPI void WINAPI RtlSetBits(PRTL_BITMAP, ULONG, ULONG)
static void scrub_raid6_stripe(device_extension *Vcb, chunk *c, scrub_context_raid56 *context, uint64_t stripe_start, uint64_t bit_start, uint64_t num, uint16_t missing_devices)
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSYSAPI void WINAPI RtlClearAllBits(PRTL_BITMAP)
#define STATUS_UNEXPECTED_IO_ERROR
#define IRP_DEALLOCATE_BUFFER
VOID NTAPI IoFreeIrp(IN PIRP Irp)
#define BTRFS_DEV_STAT_WRITE_ERRORS
static CRYPT_DATA_BLOB b2[]
#define RtlCopyMemory(Destination, Source, Length)
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
#define _SEH2_EXCEPT(...)
#define _SEH2_GetExceptionCode()
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters