AppleLVMStorageRequest.cpp [plain text]
#include "AppleRAID.h"
#define super AppleRAIDStorageRequest
OSDefineMetaClassAndStructors(AppleLVMStorageRequest, AppleRAIDStorageRequest);
AppleLVMStorageRequest * AppleLVMStorageRequest::withAppleRAIDSet(AppleRAIDSet *set)
{
AppleLVMStorageRequest *storageRequest = new AppleLVMStorageRequest;
if (storageRequest != 0) {
if (!storageRequest->initWithAppleRAIDSet(set)) {
storageRequest->release();
storageRequest = 0;
}
}
return storageRequest;
}
void AppleLVMStorageRequest::read(IOService *client, UInt64 byteStart, IOMemoryDescriptor *buffer,
IOStorageCompletion completion)
{
AppleRAIDMember *member;
IOStorageCompletion storageCompletion;
AppleRAIDMemoryDescriptor *memoryDescriptor;
srClient = client;
srCompletion = completion;
srCompletedCount = 0;
srMemoryDescriptor = buffer;
srMemoryDescriptorDirection = buffer->getDirection();
srByteCount = buffer->getLength();
srByteStart = byteStart;
storageCompletion.target = srEventSource;
storageCompletion.action = srEventSource->getStorageCompletionActionLVG();
AppleLVMVolume * lv = OSDynamicCast(AppleLVMVolume, client);
if (!lv) {
IOLog("AppleLVMStorageRequest::read() received a non-lvm request?\n");
IOStorage::complete(completion, kIOReturnInternalError, 0);
return;
}
if (lv->getTypeID() == kLVMTypeSnapRO) {
lv = lv->parentVolume(); assert(lv);
}
UInt64 requestSize = srByteCount;
UInt64 requestStart = srByteStart;
UInt32 requestCountMax = srRAIDSet->getMaxRequestCount();
srRequestCount = 0;
IOLogRW(" lvm read (%lu) requestStart %llu requestSize %llu\n", srRequestCount, requestStart, requestSize);
while (requestSize && srRequestCount < requestCountMax) {
memoryDescriptor = srMemoryDescriptors[srRequestCount];
assert(memoryDescriptor);
if (!memoryDescriptor->configureForMemoryDescriptor(buffer, requestStart, requestSize, lv)) {
IOLog(" lvm read configure failed\n");
break;
}
requestStart += memoryDescriptor->getLength();
requestSize -= memoryDescriptor->getLength();
srRequestCount++;
IOLogRW(" lvm read (%lu) requestStart %llu requestSize %llu\n", srRequestCount, requestStart, requestSize);
}
if (requestSize) {
if (srRequestCount < requestCountMax) {
IOLog(" lvm read failed #1, srByteStart %llu srByteCount %llu srRequestCount %lu requestStart %llu requestSize %llu\n",
srByteStart, srByteCount, srRequestCount, requestStart, requestSize);
IOStorage::complete(completion, kIOReturnInternalError, 0);
return;
}
IOLog(" lvm read failed #2, srByteStart %llu srByteCount %llu srRequestCount %lu requestStart %llu requestSize %llu\n",
srByteStart, srByteCount, srRequestCount, requestStart, requestSize);
IOStorage::complete(completion, kIOReturnInternalError, 0);
return;
}
assert(srMemberBaseOffset == 0);
UInt32 i;
for (i=0; i < srRequestCount; i++) {
memoryDescriptor = srMemoryDescriptors[i];
storageCompletion.parameter = memoryDescriptor;
member = srRAIDSet->arMembers[memoryDescriptor->mdMemberIndex];
if (member) {
storageCompletion.parameter = memoryDescriptor;
member->read(srRAIDSet, memoryDescriptor->mdMemberByteStart, memoryDescriptor, storageCompletion);
} else {
srEventSource->completeRequest(memoryDescriptor, kIOReturnSuccess, 0); }
}
}
void AppleLVMStorageRequest::write(IOService * client, UInt64 byteStart, IOMemoryDescriptor * buffer,
IOStorageCompletion completion)
{
AppleRAIDMember *member;
IOStorageCompletion storageCompletion;
AppleRAIDMemoryDescriptor *memoryDescriptor;
srClient = client;
srCompletion = completion;
srCompletedCount = 0;
srMemoryDescriptor = buffer;
srMemoryDescriptorDirection = buffer->getDirection();
srByteCount = buffer->getLength();
srByteStart = byteStart;
storageCompletion.target = srEventSource;
storageCompletion.action = srEventSource->getStorageCompletionActionLVG();
AppleLVMVolume * lv = OSDynamicCast(AppleLVMVolume, client);
if (!lv) {
IOLog("AppleLVMStorageRequest::write() received a non-lvm request?\n");
IOStorage::complete(completion, kIOReturnInternalError, 0);
return;
}
if (lv->getTypeID() == kLVMTypeSnapRO) {
lv = lv->parentVolume(); assert(lv);
}
UInt64 requestSize = srByteCount;
UInt64 requestStart = srByteStart;
UInt32 requestCountMax = srRAIDSet->getMaxRequestCount();
srRequestCount = 0;
IOLogRW(" lvm write (%lu) requestStart %llu requestSize %llu\n", srRequestCount, requestStart, requestSize);
while (requestSize && srRequestCount < requestCountMax) {
memoryDescriptor = srMemoryDescriptors[srRequestCount];
assert(memoryDescriptor);
if (!memoryDescriptor->configureForMemoryDescriptor(buffer, requestStart, requestSize, lv)) {
IOLog(" lvm write configure failed\n");
break;
}
requestStart += memoryDescriptor->getLength();
requestSize -= memoryDescriptor->getLength();
srRequestCount++;
IOLogRW(" lvm write (%lu) requestStart %llu requestSize %llu\n", srRequestCount, requestStart, requestSize);
}
if (requestSize) {
if (srRequestCount < requestCountMax) {
IOLog(" lvm write failed #1, srByteStart %llu srByteCount %llu srRequestCount %lu requestStart %llu requestSize %llu\n",
srByteStart, srByteCount, srRequestCount, requestStart, requestSize);
IOStorage::complete(completion, kIOReturnInternalError, 0);
return;
}
IOLog(" lvm write failed #2, srByteStart %llu srByteCount %llu srRequestCount %lu requestStart %llu requestSize %llu\n",
srByteStart, srByteCount, srRequestCount, requestStart, requestSize);
IOStorage::complete(completion, kIOReturnInternalError, 0);
return;
}
assert(srMemberBaseOffset == 0);
UInt32 i;
for (i=0; i < srRequestCount; i++) {
memoryDescriptor = srMemoryDescriptors[i];
storageCompletion.parameter = memoryDescriptor;
member = srRAIDSet->arMembers[memoryDescriptor->mdMemberIndex];
if (member) {
storageCompletion.parameter = memoryDescriptor;
member->write(srRAIDSet, memoryDescriptor->mdMemberByteStart, memoryDescriptor, storageCompletion);
} else {
srEventSource->completeRequest(memoryDescriptor, kIOReturnSuccess, 0); }
}
}