1487 uint16_t i, startoffstripe, allowed_missing, missing_devices = 0;
1493 if (
Vcb->log_to_phys_loaded) {
1498 ERR(
"get_chunk_from_address failed\n");
1515 while (le != &
Vcb->sys_chunks) {
1528 ERR(
"out of memory\n");
1544 ERR(
"could not find chunk for %I64x in bootstrap\n",
addr);
1557 allowed_missing = 0;
1560 allowed_missing = 1;
1563 allowed_missing = 1;
1566 allowed_missing = 1;
1569 allowed_missing = 2;
1572 allowed_missing = 2;
1575 allowed_missing = 3;
1578 allowed_missing = 0;
1588 ERR(
"out of memory\n");
1602 context.sector_size =
Vcb->superblock.sector_size;
1632 ERR(
"out of memory\n");
1641 ERR(
"out of memory\n");
1655 ERR(
"MmProbeAndLockPages threw exception %08lx\n",
Status);
1663 if (startoffstripe >
i)
1665 else if (startoffstripe ==
i)
1666 context.stripes[
i].stripestart = startoff;
1670 if (endoffstripe >
i)
1672 else if (endoffstripe ==
i)
1673 context.stripes[
i].stripeend = endoff + 1;
1681 ERR(
"IoAllocateMdl failed\n");
1692 ERR(
"out of memory\n");
1711 stripeoff[
stripe] += readlen;
1713 }
else if (
length - pos < ci->stripe_length) {
1741 orig_ls =
c->last_stripe;
1758 ERR(
"out of memory\n");
1766 context.startoffstripe = startoffstripe;
1777 ERR(
"out of memory\n");
1791 ERR(
"MmProbeAndLockPages threw exception %08lx\n",
Status);
1800 ERR(
"out of memory\n");
1811 bool stripeset =
false;
1813 if (startoffstripe >
i)
1815 else if (startoffstripe ==
i)
1820 if (endoffstripe >
i)
1822 else if (endoffstripe ==
i)
1829 context.stripes[
i+
j].stripestart = sstart;
1833 if (sstart !=
send) {
1837 ERR(
"IoAllocateMdl failed\n");
1853 context.stripes[
i+
j].stripestart = sstart;
1858 if (sstart !=
send) {
1862 ERR(
"IoAllocateMdl failed\n");
1876 ERR(
"could not find stripe to read\n");
1885 ERR(
"out of memory\n");
1905 stripeoff[
stripe] += readlen;
1907 }
else if (
length - pos < ci->stripe_length) {
1930 orig_ls =
i =
c->last_stripe;
1938 ERR(
"no devices available to service request\n");
1954 ERR(
"out of memory\n");
1961 ERR(
"IoAllocateMdl failed\n");
1971 ERR(
"IoAllocateMdl failed\n");
1985 ERR(
"MmProbeAndLockPages threw exception %08lx\n",
Status);
1995 bool need_dummy =
false;
2004 ERR(
"out of memory\n");
2013 ERR(
"out of memory\n");
2027 ERR(
"MmProbeAndLockPages threw exception %08lx\n",
Status);
2044 if (
i == startoffstripe) {
2073 for (
i = 0;
i < startoffstripe;
i++) {
2103 if (endoffstripe ==
i) {
2106 }
else if (endoffstripe >
i)
2120 false,
false,
NULL);
2123 ERR(
"IoAllocateMdl failed\n");
2135 ERR(
"out of memory\n");
2144 ERR(
"IoAllocateMdl failed\n");
2158 ERR(
"out of memory\n");
2183 stripeoff[
stripe] = readlen;
2197 stripeoff[
stripe] = readlen;
2236 stripeoff[
stripe] += readlen;
2254 bool need_dummy =
false;
2263 ERR(
"out of memory\n");
2272 ERR(
"out of memory\n");
2286 ERR(
"MmProbeAndLockPages threw exception %08lx\n",
Status);
2303 if (
i == startoffstripe) {
2332 for (
i = 0;
i < startoffstripe;
i++) {
2365 if (endoffstripe ==
i) {
2368 }
else if (endoffstripe >
i)
2384 ERR(
"IoAllocateMdl failed\n");
2396 ERR(
"out of memory\n");
2405 ERR(
"IoAllocateMdl failed\n");
2419 ERR(
"out of memory\n");
2444 stripeoff[
stripe] = readlen;
2458 stripeoff[
stripe] = readlen;
2468 while (
stripe != parity1) {
2505 stripeoff[
stripe] += readlen;
2531 if (missing_devices > allowed_missing) {
2532 ERR(
"not enough devices to service request (%u missing)\n", missing_devices);
2551 ERR(
"IoAllocateIrp failed\n");
2559 ERR(
"IoMakeAssociatedIrp failed\n");
2572 if (!
context.stripes[
i].Irp->AssociatedIrp.SystemBuffer) {
2573 ERR(
"out of memory\n");
2599 need_to_wait =
false;
2603 need_to_wait =
true;
2625 ERR(
"read_data_raid0 returned %08lx\n",
Status);
2641 ERR(
"read_data_raid10 returned %08lx\n",
Status);
2656 ERR(
"read_data_dup returned %08lx\n",
Status);
2669 Status =
read_data_raid5(
Vcb, file_read ?
context.va :
buf,
addr,
length, &
context, ci,
devices,
offset,
generation,
c, missing_devices > 0 ?
true :
false);
2671 ERR(
"read_data_raid5 returned %08lx\n",
Status);
2684 Status =
read_data_raid6(
Vcb, file_read ?
context.va :
buf,
addr,
length, &
context, ci,
devices,
offset,
generation,
c, missing_devices > 0 ?
true :
false);
2686 ERR(
"read_data_raid6 returned %08lx\n",
Status);
2724 if (!
Vcb->log_to_phys_loaded)
while(CdLookupNextInitialFileDirent(IrpContext, Fcb, FileContext))
#define STATUS_INSUFFICIENT_RESOURCES
VOID NTAPI MmBuildMdlForNonPagedPool(IN PMDL Mdl)
#define IoIsErrorUserInduced(Status)
VOID NTAPI MmUnlockPages(IN PMDL Mdl)
unsigned short int uint16_t
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
_Post_satisfies_ static stripe __inline void get_raid0_offset(_In_ uint64_t off, _In_ uint64_t stripe_length, _In_ uint16_t num_stripes, _Out_ uint64_t *stripeoff, _Out_ uint16_t *stripe)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
#define STATUS_INTERNAL_ERROR
GLenum GLuint GLenum GLsizei const GLchar * buf
GLenum GLuint GLenum GLsizei length
void chunk_unlock_range(_In_ device_extension *Vcb, _In_ chunk *c, _In_ uint64_t start, _In_ uint64_t length)
#define BLOCK_FLAG_RAID1C3
static NTSTATUS read_data_dup(device_extension *Vcb, uint8_t *buf, uint64_t addr, read_data_context *context, CHUNK_ITEM *ci, device **devices, uint64_t generation)
WDF_INTERRUPT_PRIORITY priority
#define BLOCK_FLAG_RAID10
PIRP NTAPI IoMakeAssociatedIrp(IN PIRP Irp, IN CCHAR StackSize)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
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
struct _LIST_ENTRY * Flink
#define NT_SUCCESS(StatCode)
#define EXCEPTION_EXECUTE_HANDLER
INT WSAAPI send(IN SOCKET s, IN CONST CHAR FAR *buf, IN INT len, IN INT flags)
void chunk_lock_range(_In_ device_extension *Vcb, _In_ chunk *c, _In_ uint64_t start, _In_ uint64_t length)
_Ret_maybenull_ device * find_device_from_uuid(_In_ device_extension *Vcb, _In_ BTRFS_UUID *uuid)
_In_opt_ PVOID _In_ ULONG _In_ PVOID context
VOID NTAPI IoFreeMdl(PMDL Mdl)
#define BLOCK_FLAG_RAID1C4
#define ExAllocatePoolWithTag(hernya, size, tag)
static NTSTATUS read_data_raid6(device_extension *Vcb, uint8_t *buf, uint64_t addr, uint32_t length, read_data_context *context, CHUNK_ITEM *ci, device **devices, uint64_t offset, uint64_t generation, chunk *c, bool degraded)
GLenum const GLvoid * addr
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
PMDL NTAPI IoAllocateMdl(IN PVOID VirtualAddress, IN ULONG Length, IN BOOLEAN SecondaryBuffer, IN BOOLEAN ChargeQuota, IN PIRP Irp)
#define IRP_INPUT_OPERATION
#define KeInitializeEvent(pEvt, foo, foo2)
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
static NTSTATUS read_data_raid5(device_extension *Vcb, uint8_t *buf, uint64_t addr, uint32_t length, read_data_context *context, CHUNK_ITEM *ci, device **devices, uint64_t offset, uint64_t generation, chunk *c, bool degraded)
_In_ uint64_t _In_ uint64_t _In_ uint64_t generation
_In_ PIO_STACK_LOCATION IrpSp
tFsRtlUpdateDiskCounters fFsRtlUpdateDiskCounters
NTSTATUS bool void get_raid56_lock_range(chunk *c, uint64_t address, uint64_t length, uint64_t *lockaddr, uint64_t *locklen) __attribute__((nonnull(1
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define STATUS_UNEXPECTED_IO_ERROR
#define IRP_DEALLOCATE_BUFFER
VOID NTAPI IoFreeIrp(IN PIRP Irp)
static NTSTATUS read_data_raid10(device_extension *Vcb, uint8_t *buf, uint64_t addr, uint32_t length, read_data_context *context, CHUNK_ITEM *ci, device **devices, uint64_t generation, uint64_t offset)
#define RtlZeroMemory(Destination, Length)
#define RtlCopyMemory(Destination, Source, Length)
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
static NTSTATUS read_data_raid0(device_extension *Vcb, uint8_t *buf, uint64_t addr, uint32_t length, read_data_context *context, CHUNK_ITEM *ci, device **devices, uint64_t generation, uint64_t offset)
#define _SEH2_EXCEPT(...)
#define BLOCK_FLAG_DUPLICATE
GLuint GLuint GLsizei GLenum type
#define _SEH2_GetExceptionCode()
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
NTSTATUS NTSTATUS NTSTATUS NTSTATUS NTSTATUS chunk * get_chunk_from_address(device_extension *Vcb, uint64_t address) __attribute__((nonnull(1)))
#define STATUS_DEVICE_NOT_READY