1/*
2 * Copyright (c) 2001-2007 Apple Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License").  You may not use this file except in compliance with the
9 * License.  Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
11 *
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
17 * License for the specific language governing rights and limitations
18 * under the License.
19 *
20 * @APPLE_LICENSE_HEADER_END@
21 */
22
23#ifndef _APPLERAID_H
24#define _APPLERAID_H
25
26#ifdef KERNEL
27
28
29#ifdef DEBUG
30
31#define IOASSERT 1
32
33#define IOLog1 IOLog
34//#define IOLog1 IOSleep(100); IOLog
35//#define IOLog2 IOLog
36//#define IOLogOC IOSleep(100); IOLog	// Open Close
37//#define IOLogRW IOSleep(100); IOLog	// Read Write
38//#define IOLogUC IOLog			// User Client
39
40#endif DEBUG
41
42
43#ifndef IOLog1
44#define IOLog1(args...)
45#endif
46#ifndef IOLog2
47#define IOLog2(args...)
48#endif
49#ifndef IOLogOC
50#define IOLogOC(args...)
51#endif
52#ifndef IOLogRW
53#define IOLogRW(args...)
54#endif
55#ifndef IOLogUC
56#define IOLogUC(args...)
57#endif
58
59
60#include <IOKit/IOTypes.h>
61#include <IOKit/IOService.h>
62#include <IOKit/IOWorkLoop.h>
63#include <IOKit/IOEventSource.h>
64#include <IOKit/IOCommand.h>
65#include <IOKit/IOCommandPool.h>
66#include <IOKit/IOCommandGate.h>
67#include <IOKit/IOBufferMemoryDescriptor.h>
68#include <IOKit/IOMessage.h>
69#include <IOKit/IOKitKeys.h>
70#include <IOKit/IOUserClient.h>
71#include <IOKit/IOBSD.h>
72#include <IOKit/storage/IOMedia.h>
73
74class AppleRAID;
75class AppleRAIDSet;
76class AppleRAIDEventSource;
77class AppleRAIDStorageRequest;
78class AppleLVMStorageRequest;
79
80#include "AppleRAIDGlobals.h"
81#include "AppleRAIDMember.h"
82#include "AppleRAIDMemoryDescriptor.h"
83#include "AppleRAIDStorageRequest.h"
84#include "AppleLVMStorageRequest.h"
85#include "AppleRAIDEventSource.h"
86#include "AppleRAIDSet.h"
87#include "AppleRAIDConcatSet.h"
88#include "AppleRAIDMirrorSet.h"
89#include "AppleRAIDStripeSet.h"
90#include "AppleLVMVolume.h"
91#include "AppleLVMGroup.h"
92#include "AppleRAIDUserClient.h"
93#include "AppleRAIDUserLib.h"
94
95
96class AppleRAID : public IOService
97{
98    OSDeclareDefaultStructors(AppleRAID);
99
100private:
101    OSDictionary	* raidSets;
102    OSDictionary	* raidMembers;
103    OSDictionary	* logicalVolumes;
104
105    void addSet(AppleRAIDSet * set);
106    void removeSet(AppleRAIDSet * set);
107
108    void addMember(AppleRAIDMember * member);
109    void removeMember(AppleRAIDMember * member);
110    AppleRAIDMember * findMember(const OSString * uuid);
111
112    void startSet(AppleRAIDSet * set);
113
114public:
115
116    bool init(void);
117    void free(void);
118
119    AppleRAIDSet * findSet(const OSString * uuid);
120    AppleRAIDSet * findSet(AppleRAIDMember * member);
121
122    void addLogicalVolume(AppleLVMVolume * volume);
123    void removeLogicalVolume(AppleLVMVolume * volume);
124    AppleLVMVolume * findLogicalVolume(const OSString * uuid);
125
126    IOReturn newMember(IORegistryEntry * child);
127    IOReturn oldMember(IORegistryEntry * child);
128    void recoverMember(IORegistryEntry * child);
129
130    void degradeSet(AppleRAIDSet * set);
131    void restartSet(AppleRAIDSet * set, bool bump);
132
133    IOReturn updateSet(char * setBuffer, uint32_t setBufferSize, char * retBuffer, uint32_t * retBufferSize);
134
135    IOReturn getListOfSets(UInt32 inFlags, char * outList, uint32_t * outListSize);
136    IOReturn getSetProperties(char * setString, uint32_t setStringSize, char * outProp, uint32_t * outPropSize);
137    IOReturn getMemberProperties(char * memberString, uint32_t memberStringSize, char * outProp, uint32_t * outPropSize);
138
139    IOReturn getVolumesForGroup(char * lvgString, uint32_t lvgStringSize, char * outProp, uint32_t * outPropSize);
140    IOReturn getVolumeProperties(char * lvString, uint32_t lvStringSize, char * outProp, uint32_t * outPropSize);
141    IOReturn getVolumeExtents(char * lvString, uint32_t lvStringSize, char * extentsBuffer, uint32_t * extentsSize);
142    IOReturn updateLogicalVolume(char * lveBuffer, uint32_t lveBufferSize, char * retBuffer, uint32_t * retBufferSize);
143    IOReturn destroyLogicalVolume(char * lvString, uint32_t lvStringSize, char * retBuffer, uint32_t * retBufferSize);
144};
145
146#endif /* KERNEL */
147
148#endif /* ! _APPLERAID_H */
149