#ifndef _APPLERAIDMEMBER_H
#define _APPLERAIDMEMBER_H
#define kAppleRAIDSignature "AppleRAIDHeader"
enum {
kAppleRAIDHeaderSize = 0x1000,
kAppleRAIDDefaultChunkSize = 0x8000
};
#define ARHEADER_OFFSET(s) ( (UInt64)(s) / kAppleRAIDHeaderSize * kAppleRAIDHeaderSize - kAppleRAIDHeaderSize )
#define ARCHUNK_COUNT(s, cs) ( ARHEADER_OFFSET(s) / (UInt64)(cs) )
struct AppleRAIDHeaderV2 {
char raidSignature[16];
char raidUUID[64];
char memberUUID[64];
UInt64 size;
char plist[];
};
typedef struct AppleRAIDHeaderV2 AppleRAIDHeaderV2;
#ifdef KERNEL
#include <uuid/uuid.h>
#define kAppleRAIDBaseOffsetKey "appleraid-BaseOffset" // CFNumber 64bit
#define kAppleRAIDNativeBlockSizeKey "appleraid-NativeBlockSize" // CFNumber 64bit
#define kAppleRAIDMemberCountKey "appleraid-MemberCount" // CFNumber 32bit
enum {
kAppleRAIDMemberStateBroken = 0,
kAppleRAIDMemberStateSpare,
kAppleRAIDMemberStateClosed,
kAppleRAIDMemberStateClosing,
kAppleRAIDMemberStateRebuilding,
kAppleRAIDMemberStateOpen
};
class AppleRAID;
class AppleRAIDMember: public IOStorage {
OSDeclareDefaultStructors(AppleRAIDMember)
private:
IOMedia * arTarget;
UInt64 arHeaderOffset;
IOBufferMemoryDescriptor *arHeaderBuffer;
thread_call_t arSyncronizeCacheThreadCall;
protected:
OSDictionary * arHeader;
AppleRAID * arController;
UInt32 arMemberState;
UInt64 arNativeBlockSize;
UInt64 arBaseOffset;
bool arIsEjectable;
bool arIsWritable;
bool arIsRAIDMember;
virtual bool handleOpen(IOService * client, IOOptionBits options, void * access);
virtual bool handleIsOpen(const IOService* client) const;
virtual void handleClose(IOService*client, IOOptionBits options);
public:
virtual bool init(OSDictionary * properties = 0);
virtual void free(void);
virtual bool start(IOService * provider);
virtual void stop(IOService * provider);
virtual bool requestTerminate(IOService *provider, IOOptionBits options);
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 synchronizeCacheCallout(AppleRAIDSet *masterSet);
virtual IOReturn readRAIDHeader(void);
virtual IOReturn writeRAIDHeader(void);
virtual IOReturn updateRAIDHeader(OSDictionary * props);
virtual IOReturn zeroRAIDHeader(void);
virtual IOReturn parseRAIDHeaderV1(void);
virtual IOReturn buildOnDiskHeaderV1(void);
virtual IOReturn parseRAIDHeaderV2(void);
virtual IOReturn buildOnDiskHeaderV2(void);
virtual OSDictionary * getHeader(void);
virtual OSObject * getHeaderProperty( const OSString * aKey) const;
virtual OSObject * getHeaderProperty( const char * aKey) const;
virtual bool setHeaderProperty(const OSString * aKey, OSObject * anObject);
virtual bool setHeaderProperty(const char * aKey, OSObject * anObject);
virtual bool setHeaderProperty(const char * aKey, const char * cString);
virtual bool setHeaderProperty(const char * aKey, unsigned long long aValue, unsigned int aNumberOfBits);
virtual const OSString * getSetName(void);
virtual const char * getSetNameString(void);
virtual const OSString * getUUID(void);
virtual const char * getUUIDString(void);
virtual const OSString * getSetUUID(void);
virtual const char * getSetUUIDString(void);
virtual const OSString * getDiskName(void);
virtual IOStorage * getTarget(void) const;
virtual bool isRAIDSet(void);
virtual bool isRAIDMember(void);
virtual bool isSpare(void);
virtual bool isBroken(void);
virtual UInt64 getSize(void) const;
virtual UInt32 getMemberIndex(void);
virtual bool isEjectable(void) const;
virtual bool isWritable(void) const;
virtual UInt64 getPreferredBlockSize(void) const;
virtual UInt64 getBase(void) const;
virtual bool addBootDeviceInfo(OSArray * bootArray);
virtual OSDictionary * getMemberProperties(void);
virtual bool changeMemberState(UInt32 newState, bool force = 0);
inline UInt32 getMemberState(void) { return arMemberState; };
};
#endif KERNEL
#endif