IOFilterScheme

Inherits from
IOStorage
Availability
Available in OS X v10.6 and later.
Declared in
IOFilterScheme.h

Overview

The common base class for all filter scheme objects.

The IOFilterScheme class is the common base class for all filter scheme objects. It extends the IOStorage class by implementing the appropriate open and close semantics for filter objects (standard semantics are act as a relay for incoming opens, producing one outgoing open for each incoming open). It also implements the default read and write semantics, which pass all reads and writes through to the provider media unprocessed. For simple schemes, the default behavior is sufficient. More complex filter schemes such as RAID will want to do extra processing for reads and writes.

Tasks

Miscellaneous

Instance Methods

copyPhysicalExtent

virtual IOStorage * copyPhysicalExtent( IOService *client, UInt64 *byteStart, UInt64 *byteCount);
Parameters
client

Client requesting the operation.

byteStart

Starting byte offset for the operation. Returns a physical byte offset, relative to the physical storage object, on success.

byteCount

Size of the operation. Returns the actual number of bytes which can be transferred, relative to the physical storage object, on success.

Return Value

A reference to the physical storage object, which should be released by the caller, or a null on error.

Discussion

Convert the specified byte offset into a physical byte offset, relative to a physical storage object. This call should only be made within the context of lockPhysicalExtents().

handleClose

virtual void handleClose( IOService *client, IOOptionBits options);
Parameters
client

Client requesting the close.

options

Options for the close. Set to zero.

Discussion

The handleClose method closes the client's access to this object.

This implementation replaces the IOService definition of handleClose().

handleIsOpen

virtual bool handleIsOpen( const IOService *client) const;
Parameters
client

Client to check the open state of. Set to zero to check the open state of all clients.

Return Value

Returns true if the client was (or clients were) open, false otherwise.

Discussion

The handleIsOpen method determines whether the specified client, or any client if none is specified, presently has an open on this object.

This implementation replaces the IOService definition of handleIsOpen().

handleOpen

virtual bool handleOpen( IOService *client, IOOptionBits options, void *access);
Parameters
client

Client requesting the open.

options

Options for the open. Set to zero.

access

Access level for the open. Set to kIOStorageAccessReader or kIOStorageAccessReaderWriter.

Return Value

Returns true if the open was successful, false otherwise.

Discussion

The handleOpen method grants or denies permission to access this object to an interested client. The argument is an IOStorageAccess value that specifies the level of access desired -- reader or reader-writer.

This method can be invoked to upgrade or downgrade the access level for an existing client as well. The previous access level will prevail for upgrades that fail, of course. A downgrade should never fail. If the new access level should be the same as the old for a given client, this method will do nothing and return success. In all cases, one, singular close-per-client is expected for all opens-per-client received.

This implementation replaces the IOService definition of handleOpen().

lockPhysicalExtents

virtual bool lockPhysicalExtents( IOService *client);
Parameters
client

Client requesting the operation.

Return Value

Returns true if the lock was successful, false otherwise.

Discussion

Lock the contents of the storage object against relocation temporarily, for the purpose of getting physical extents.

read

virtual void read( IOService *client, UInt64 byteStart, IOMemoryDescriptor *buffer, IOStorageAttributes *attributes, IOStorageCompletion *completion);
Parameters
client

Client requesting the read.

byteStart

Starting byte offset for the data transfer.

buffer

Buffer for the data transfer. The size of the buffer implies the size of the data transfer.

attributes

Attributes of the data transfer. See IOStorageAttributes. It is the responsibility of the callee to maintain the information for the duration of the data transfer, as necessary.

completion

Completion routine to call once the data transfer is complete. It is the responsibility of the callee to maintain the information for the duration of the data transfer, as necessary.

Discussion

Read data from the storage object at the specified byte offset into the specified buffer, asynchronously. When the read completes, the caller will be notified via the specified completion action.

The buffer will be retained for the duration of the read.

For simple filter schemes, the default behavior is to simply pass the read through to the provider media. More complex filter schemes such as RAID will need to do extra processing here.

synchronizeCache

virtual IOReturn synchronizeCache( IOService *client);
Parameters
client

Client requesting the cache synchronization.

Return Value

Returns the status of the cache synchronization.

Discussion

Flush the cached data in the storage object, if any, synchronously.

unlockPhysicalExtents

virtual void unlockPhysicalExtents( IOService *client);
Parameters
client

Client requesting the operation.

Discussion

Unlock the contents of the storage object for relocation again. This call must balance a successful call to lockPhysicalExtents().

unmap

virtual IOReturn unmap( IOService *client, IOStorageExtent *extents, UInt32 extentsCount, UInt32 options = 0);
Parameters
client

Client requesting the operation.

extents

List of extents. See IOStorageExtent. It is legal for the callee to overwrite the contents of this buffer in order to satisfy the request.

extentsCount

Number of extents.

Return Value

Returns the status of the operation.

Discussion

Delete unused data from the storage object at the specified byte offsets, synchronously.

write

virtual void write( IOService *client, UInt64 byteStart, IOMemoryDescriptor *buffer, IOStorageAttributes *attributes, IOStorageCompletion *completion);
Parameters
client

Client requesting the write.

byteStart

Starting byte offset for the data transfer.

buffer

Buffer for the data transfer. The size of the buffer implies the size of the data transfer.

attributes

Attributes of the data transfer. See IOStorageAttributes. It is the responsibility of the callee to maintain the information for the duration of the data transfer, as necessary.

completion

Completion routine to call once the data transfer is complete. It is the responsibility of the callee to maintain the information for the duration of the data transfer, as necessary.

Discussion

Write data into the storage object at the specified byte offset from the specified buffer, asynchronously. When the write completes, the caller will be notified via the specified completion action.

The buffer will be retained for the duration of the write.

For simple filter schemes, the default behavior is to simply pass the write through to the provider media. More complex filter schemes such as RAID will need to do extra processing here.