|
|
1.1 root 1: /*
2: * Copyright (c) 1998-2000 Apple Computer, 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: /*!
24: * @header IOPartitionScheme
25: * @abstract
26: * This header contains the IOPartitionScheme class definition.
27: */
28:
29: #ifndef _IOPARTITIONSCHEME_H
30: #define _IOPARTITIONSCHEME_H
31:
32: /*!
33: * @defined kIOMediaPartitionID
34: * @abstract
35: * kIOMediaPartitionID is property of IOMedia objects. It is an OSNumber.
36: * @discussion
37: * The kIOMediaPartitionID property is placed into each IOMedia instance created
38: * via the partition scheme. It is an ID that differentiates one partition from
39: * the other (within a given scheme). It is typically an index into the on-disk
40: * partition table.
41: */
42:
43: #define kIOMediaPartitionID "Partition ID"
44:
45: /*
46: * Kernel
47: */
48:
49: #if defined(KERNEL) && defined(__cplusplus)
50:
51: #include <IOKit/storage/IOMedia.h>
52: #include <IOKit/storage/IOStorage.h>
53:
54: /*!
55: * @class IOPartitionScheme
56: * @abstract
57: * The IOPartitionScheme class is the common base class for all partition scheme
58: * objects.
59: * @discussion
60: * The IOPartitionScheme class is the common base class for all partition scheme
61: * objects. It extends the IOStorage class by implementing the appropriate open
62: * and close semantics for partition objects (standard semantics are to act as a
63: * multiplexor for incoming opens, producing one outgoing open with the correct
64: * access). It also implements the default read and write semantics, which pass
65: * all reads and writes through to the provider media unprocessed. For simple
66: * schemes, the default behavior is sufficient. More complex partition schemes
67: * such as RAID will want to do extra processing for reads and writes.
68: */
69:
70: class IOPartitionScheme : public IOStorage
71: {
72: OSDeclareDefaultStructors(IOPartitionScheme);
73:
74: protected:
75:
76: IOStorageAccess _openLevel;
77: OSSet * _openReaders;
78: OSSet * _openReaderWriters;
79:
80: /*
81: * Free all of this object's outstanding resources.
82: */
83:
84: virtual void free();
85:
86: /*!
87: * @function handleOpen
88: * @discussion
89: * The handleOpen method grants or denies permission to access this object
90: * to an interested client. The argument is an IOStorageAccess value that
91: * specifies the level of access desired -- reader or reader-writer.
92: *
93: * This method can be invoked to upgrade or downgrade the access level for
94: * an existing client as well. The previous access level will prevail for
95: * upgrades that fail, of course. A downgrade should never fail. If the
96: * new access level should be the same as the old for a given client, this
97: * method will do nothing and return success. In all cases, one, singular
98: * close-per-client is expected for all opens-per-client received.
99: *
100: * This implementation replaces the IOService definition of handleOpen().
101: * @param client
102: * Client requesting the open.
103: * @param options
104: * Options for the open. Set to zero.
105: * @param access
106: * Access level for the open. Set to kAccessReader or kAccessReaderWriter.
107: * @result
108: * Returns true if the open was successful, false otherwise.
109: */
110:
111: virtual bool handleOpen(IOService * client,
112: IOOptionBits options,
113: void * access);
114:
115: /*!
116: * @function handleIsOpen
117: * @discussion
118: * The handleIsOpen method determines whether the specified client, or any
119: * client if none is specificed, presently has an open on this object.
120: *
121: * This implementation replaces the IOService definition of handleIsOpen().
122: * @param client
123: * Client to check the open state of. Set to zero to check the open state
124: * of all clients.
125: * @result
126: * Returns true if the client was (or clients were) open, false otherwise.
127: */
128:
129: virtual bool handleIsOpen(const IOService * client) const;
130:
131: /*!
132: * @function handleClose
133: * @discussion
134: * The handleClose method closes the client's access to this object.
135: *
136: * This implementation replaces the IOService definition of handleClose().
137: * @param client
138: * Client requesting the close.
139: * @param options
140: * Options for the close. Set to zero.
141: */
142:
143: virtual void handleClose(IOService * client, IOOptionBits options);
144:
145: public:
146:
147: ///m:2333367:workaround:commented:start
148: // IOStorage::open;
149: // IOStorage::close;
150: // IOStorage::read;
151: // IOStorage::write;
152: ///m:2333367:workaround:commented:stop
153:
154: /*
155: * Initialize this object's minimal state.
156: */
157:
158: virtual bool init(OSDictionary * properties = 0);
159:
160: /*!
161: * @function read
162: * @discussion
163: * Read data from the storage object at the specified byte offset into the
164: * specified buffer, asynchronously. When the read completes, the caller
165: * will be notified via the specified completion action.
166: *
167: * The buffer will be retained for the duration of the read.
168: *
169: * For simple partition schemes, the default behavior is to simply pass the
170: * read through to the provider media. More complex partition schemes such
171: * as RAID will need to do extra processing here.
172: * @param client
173: * Client requesting the read.
174: * @param byteStart
175: * Starting byte offset for the data transfer.
176: * @param buffer
177: * Buffer for the data transfer. The size of the buffer implies the size of
178: * the data transfer.
179: * @param completion
180: * Completion routine to call once the data transfer is complete.
181: */
182:
183: virtual void read(IOService * client,
184: UInt64 byteStart,
185: IOMemoryDescriptor * buffer,
186: IOStorageCompletion completion);
187:
188: /*!
189: * @function write
190: * @discussion
191: * Write data into the storage object at the specified byte offset from the
192: * specified buffer, asynchronously. When the write completes, the caller
193: * will be notified via the specified completion action.
194: *
195: * The buffer will be retained for the duration of the write.
196: *
197: * For simple partition schemes, the default behavior is to simply pass the
198: * write through to the provider media. More complex partition schemes such
199: * as RAID will need to do extra processing here.
200: * @param client
201: * Client requesting the write.
202: * @param byteStart
203: * Starting byte offset for the data transfer.
204: * @param buffer
205: * Buffer for the data transfer. The size of the buffer implies the size of
206: * the data transfer.
207: * @param completion
208: * Completion routine to call once the data transfer is complete.
209: */
210:
211: virtual void write(IOService * client,
212: UInt64 byteStart,
213: IOMemoryDescriptor * buffer,
214: IOStorageCompletion completion);
215:
216: /*
217: * Obtain this object's provider. We override the superclass's method
218: * to return a more specific subclass of OSObject -- an IOMedia. This
219: * method serves simply as a convenience to subclass developers.
220: */
221:
222: virtual IOMedia * getProvider() const
223: {
224: return (IOMedia *) IOStorage::getProvider();
225: }
226: };
227:
228: #endif /* defined(KERNEL) && defined(__cplusplus) */
229:
230: #endif /* !_IOPARTITIONSCHEME_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.