#ifndef _APPLERAIDSET_H
#define _APPLERAIDSET_H
#define kARSetCompleteTimeoutNone 0
#define kARSetCompleteTimeoutDefault 30
enum {
kAppleRAIDSetStateFailed = 0,
kAppleRAIDSetStateTerminating,
kAppleRAIDSetStateInitializing,
kAppleRAIDSetStateOnline,
kAppleRAIDSetStateDegraded
};
class AppleRAIDSet : public AppleRAIDMember
{
OSDeclareAbstractStructors(AppleRAIDSet)
friend class AppleRAIDStorageRequest;
friend class AppleRAID;
protected:
UInt32 arSetState;
UInt32 arHeaderVersion;
UInt64 arSetBlockSize;
UInt64 arSetBlockCount;
UInt64 arSetMediaSize;
UInt32 arSequenceNumber;
UInt32 arSetCompleteTimeout;
IOStorageAccess arOpenLevel;
OSSet * arOpenReaders;
IOService * arOpenReaderWriter;
IOMedia * arMedia;
UInt32 arPublishedSetState;
UInt32 arSetIsPaused;
bool arSetWasBlockedByPause;
UInt32 arStorageRequestsPending;
thread_call_t arRecoveryThreadCall;
UInt32 arActiveCount;
UInt32 arMemberCount;
UInt32 arLastAllocCount;
AppleRAIDMember **arMembers;
UInt32 arSpareCount;
AppleRAIDMember **arSpareMembers;
UInt32 *arLogicalMemberIndexes;
IOWorkLoop *arSetWorkLoop;
IOCommandGate *arSetCommandGate;
AppleRAIDEventSource *arSetEventSource;
IOCommandPool *arStorageRequestPool;
SInt32 arSetIsSyncingCount;
protected:
virtual void free(void);
virtual bool init(void);
virtual bool initWithHeader(OSDictionary * header, bool firstTime);
virtual bool handleOpen(IOService * client, IOOptionBits options, void * access);
virtual bool handleIsOpen(const IOService *client) const;
virtual void handleClose(IOService * client, IOOptionBits options);
virtual void recoverStart(void);
virtual void recoverWait(void);
virtual bool recover(void);
virtual bool pauseSet(bool whenIdle);
virtual void unpauseSet(void);
public:
virtual bool addSpare(AppleRAIDMember * member);
virtual bool addMember(AppleRAIDMember * member);
virtual bool removeMember(AppleRAIDMember * member, IOOptionBits options);
virtual bool upgradeMember(AppleRAIDMember *member);
virtual bool resizeSet(UInt32 newMemberCount);
virtual bool startSet(void);
virtual bool publishSet(void);
virtual bool unpublishSet(void);
virtual bool destroySet(void);
virtual bool reconfigureSet(OSDictionary * updateInfo);
virtual UInt32 getSequenceNumber(void);
virtual void bumpSequenceNumber(void);
virtual IOReturn writeRAIDHeader(void);
virtual const OSString * getSetName(void);
virtual const OSString * getUUID(void);
virtual const OSString * getSetUUID(void);
virtual const OSString * getDiskName(void);
virtual IOStorage * getTarget(void) const;
virtual bool isRAIDSet(void);
virtual bool isSetComplete(void);
virtual bool bumpOnError(void);
virtual UInt64 getSize(void) const;
virtual IOWorkLoop *getWorkLoop(void);
virtual bool changeSetState(UInt32 newState);
inline UInt32 getActiveCount(void) const { return arActiveCount; };
inline UInt32 getMemberCount(void) const { return arMemberCount; };
inline UInt32 getSpareCount(void) const { return arSpareCount; };
inline UInt32 getSetState(void) const { return arSetState; };
virtual bool addBootDeviceInfo(OSArray * bootArray);
virtual OSDictionary * getSetProperties(void);
virtual void read(IOService * client, UInt64 byteStart, IOMemoryDescriptor* buffer, IOStorageCompletion completion);
virtual void write(IOService * client, UInt64 byteStart, IOMemoryDescriptor* buffer, IOStorageCompletion completion);
virtual IOReturn synchronizeCache(IOService* client);
virtual IOReturn synchronizeCacheGated(IOService *client);
virtual void synchronizeStarted(void);
virtual void synchronizeCompleted(void);
virtual void synchronizeCompletedGated(void);
inline bool isPaused(void) const { return arSetIsPaused != 0; };
virtual IOReturn allocateRAIDRequest(AppleRAIDStorageRequest **storageRequest);
virtual void returnRAIDRequest(AppleRAIDStorageRequest *storageRequest);
virtual void completeRAIDRequest(AppleRAIDStorageRequest *storageRequest);
virtual AppleRAIDMemoryDescriptor * allocateMemoryDescriptor(AppleRAIDStorageRequest *storageRequest, UInt32 memberIndex) = 0;
};
#endif