Annotation of XNU/iokit/IOKit/storage/IOHDDrive.h, revision 1.1

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:  * Copyright (c) 1999 Apple Computer, Inc.  All rights reserved. 
        !            24:  *
        !            25:  * IOHDDrive.h
        !            26:  *
        !            27:  * This class implements generic Hard Disk functionality, independent of
        !            28:  * the physical connection protocol (e.g. SCSI, ATA, USB).
        !            29:  *
        !            30:  * A protocol-specific provider implements the functionality using an appropriate
        !            31:  * protocol and commands.
        !            32:  */
        !            33: 
        !            34: #ifndef        _IOHDDRIVE_H
        !            35: #define        _IOHDDRIVE_H
        !            36: 
        !            37: #include <IOKit/IOTypes.h>
        !            38: #include <IOKit/storage/IOStorage.h>
        !            39: #include <IOKit/storage/IODrive.h>
        !            40: #include <IOKit/IOMemoryDescriptor.h>
        !            41: 
        !            42: class IOHDDriveNub;
        !            43: class IOMedia;
        !            44: 
        !            45: /*!
        !            46:  * @class
        !            47:  * IOHDDrive : public IODrive
        !            48:  * @abstract
        !            49:  * Generic Hard Disk Driver.
        !            50:  * @discussion
        !            51:  * Storage drivers are split into two parts: the Generic Driver handles
        !            52:  * all generic device issues, independent of the lower-level transport
        !            53:  * mechanism (e.g. SCSI, ATA, USB, FireWire). All storage operations
        !            54:  * at the Generic Driver level are translated into a series of generic
        !            55:  * device operations. These operations are passed via the Device Nub
        !            56:  * to a Transport Driver, which implements the appropriate
        !            57:  * transport-dependent protocol to execute these operations.
        !            58:  * 
        !            59:  * To determine the write-protect state of a device (or media), for
        !            60:  * example, the generic driver would issue a call to the
        !            61:  * Transport Driver's reportWriteProtection method. If this were a SCSI
        !            62:  * device, its Transport Driver would issue a Mode Sense command to
        !            63:  * extract the write-protection status bit. The Transport Driver then
        !            64:  * reports true or false to the generic driver.
        !            65:  * 
        !            66:  * The generic driver therefore has no knowledge of, or involvement
        !            67:  * with, the actual commands and mechanisms used to communicate with
        !            68:  * the device. It is expected that the generic driver will rarely, if
        !            69:  * ever, need to be subclassed to handle device idiosyncrasies; rather,
        !            70:  * the Transport Driver should be changed via overrides.
        !            71:  * 
        !            72:  * A generic driver could be subclassed to create a different type of
        !            73:  * generic device. The generic driver IOCDDrive class is a subclass
        !            74:  * of IOHDDrive, adding CD functions. Similarly, the Transport Driver
        !            75:  * IOSCSICDDrive is a subclass of IOSCSIHDDrive, adding CD functions.
        !            76: */
        !            77: 
        !            78: class IOHDDrive : public IODrive {
        !            79: 
        !            80:     OSDeclareDefaultStructors(IOHDDrive)
        !            81: 
        !            82: public:
        !            83: 
        !            84: struct context {
        !            85:     IOStorageCompletion                completion;
        !            86:     IOMemoryDescriptor *       buffer;
        !            87:     UInt64                     byteStart;
        !            88:     UInt64                     byteCount;
        !            89: 
        !            90:     IOReturn                   result;
        !            91:     UInt64                     actualTransferCount;
        !            92: };
        !            93: 
        !            94:     /* Overrides from IORegistryEntry */
        !            95: 
        !            96:     virtual void       free(void);
        !            97:     virtual bool       init(OSDictionary * properties);
        !            98: 
        !            99:     /* Overrides from IOService */
        !           100: 
        !           101:     /*!
        !           102:      * @function probe
        !           103:      * @abstract
        !           104:      * Probe for proper client Transport Driver.
        !           105:      * @discussion
        !           106:      * This method first verifies that our provider is of class IOHDDriveNub, then
        !           107:      * checks that the provider's property "kDeviceTypeProperty" matches what we expect.
        !           108:      * Failure of either test causes a return of NULL.
        !           109:      */
        !           110:     virtual IOService * probe(IOService * provider,SInt32 * score);
        !           111:     
        !           112:     /* Mandatory overrides from IODrive: */
        !           113: 
        !           114:     /*!
        !           115:      * @function constrainByteCount
        !           116:      * @abstract
        !           117:      * Constrain the byte count for this IO to device limits.
        !           118:      * @discussion
        !           119:      * This function should be called prior to each read or write operation, so that
        !           120:      * the driver can constrain the requested byte count, as necessary, to meet
        !           121:      * current device limits. Such limits could be imposed by the device depending
        !           122:      * on operating modes, media types, or transport prototol (e.g. ATA, SCSI).
        !           123:      * 
        !           124:      * At present, this method is not used.
        !           125:      * @param requestedCount
        !           126:      * The requested byte count for the next read or write operation.
        !           127:      * @param isWrite
        !           128:      * True if the operation will be a write; False if the operation will be a read.
        !           129:      */
        !           130:     virtual UInt64     constrainByteCount(UInt64 requestedCount,bool isWrite);
        !           131: 
        !           132:     /*!
        !           133:      * @function ejectMedia
        !           134:      * @abstract
        !           135:      * Eject the media.
        !           136:      */
        !           137:     virtual IOReturn   ejectMedia(void);
        !           138: 
        !           139:     /*!
        !           140:      * @function formatMedia
        !           141:      * @abstract
        !           142:      * Format the media to the specified byte capacity.
        !           143:      * @param byteCapacity
        !           144:      * The requested final byte capacity for the formatted media.
        !           145:      */
        !           146:     virtual IOReturn   formatMedia(UInt64 byteCapacity);
        !           147: 
        !           148:     /*!
        !           149:      * @function getFormatCapacities
        !           150:      * @abstract
        !           151:      * Return the allowable formatting byte capacities.
        !           152:      * @discussion
        !           153:      * This function returns the supported byte capacities for the device.
        !           154:      * @param capacities
        !           155:      * Pointer for returning the list of capacities.
        !           156:      * @param capacitiesMaxCount
        !           157:      * The number of capacity values returned in "capacities."
        !           158:      */
        !           159:     virtual UInt32     getFormatCapacities(UInt64 * capacities,
        !           160:                                             UInt32   capacitiesMaxCount) const;
        !           161: 
        !           162:     /*!
        !           163:      * @function getMediaBlockSize
        !           164:      * @abstract
        !           165:      * Return the block size for the device, in bytes.
        !           166:      */
        !           167:     virtual UInt64     getMediaBlockSize(void) const;
        !           168: 
        !           169:     /*!
        !           170:      * @function getMediaState
        !           171:      * @abstract
        !           172:      * Return the state of media in the device.
        !           173:      */
        !           174:     virtual IODrive::IOMediaState getMediaState(void) const;
        !           175: 
        !           176:     /*!
        !           177:      * @function handleStart
        !           178:      * @abstract
        !           179:      * Handle startup functionality after superclass is ready.
        !           180:      * @discussion
        !           181:      * This function obtains device description strings (e.g. Vendor name), prints
        !           182:      * a message describing the device, and then obtains all removable-media information
        !           183:      * (if the device is removable.) Finally, a check for media is performed.
        !           184:      * @param provider
        !           185:      * A pointer to our provider.
        !           186:      */
        !           187:     virtual bool       handleStart(IOService * provider);
        !           188: 
        !           189:     /*!
        !           190:      * @function handleStop
        !           191:      * @abstract
        !           192:      * Handle clean up functionality before driver is unloaded.
        !           193:      * @discussion
        !           194:      * If the media is writable, this method issues a Synchronize Cache operation.
        !           195:      * Then the media is ejected.
        !           196:      * @param provider
        !           197:      * A pointer to our provider.
        !           198:      */
        !           199:     virtual void       handleStop(IOService * provider);
        !           200: 
        !           201:     /*!
        !           202:      * @function isMediaEjectable
        !           203:      * @abstract
        !           204:      * Report whether the media is removable or not.
        !           205:      * @result
        !           206:      * True indicates the media can be ejected by software; False indicates it cannot.
        !           207:      */
        !           208:     virtual bool       isMediaEjectable(void) const;
        !           209: 
        !           210:     /*!
        !           211:      * @function isMediaPollExpensive
        !           212:      * @abstract
        !           213:      * Report whether polling for media is expensive.
        !           214:      * @result
        !           215:      * True indicates the media poll is expensive; False indicates polling is cheap.
        !           216:      */
        !           217:     virtual bool       isMediaPollExpensive(void) const;
        !           218: 
        !           219:     /*!
        !           220:      * @function isMediaPollRequired
        !           221:      * @abstract
        !           222:      * Report whether device must be polled to determine media state.
        !           223:      * @discussion
        !           224:      * @result
        !           225:      * True indicates that polling is required; False indicates that no polling is needed.
        !           226:      */
        !           227:     virtual bool       isMediaPollRequired(void) const;
        !           228: 
        !           229:     /*!
        !           230:      * @function lockMedia
        !           231:      * @abstract
        !           232:      * Lock or unlock the media in the device.
        !           233:      * @discussion
        !           234:      * This method may be used to lock the media in the device, thus preventing the user
        !           235:      * from removing the media manually.
        !           236:      * 
        !           237:      * This method only makes sense if it is known that the device supports locking.
        !           238:      * @param lock
        !           239:      * True indicates the media should be locked in the device;
        !           240:      * False indicates the media should be unlocked.
        !           241:      */
        !           242:     virtual IOReturn   lockMedia(bool lock);
        !           243: 
        !           244:     /*!
        !           245:      * @function pollMedia
        !           246:      * @abstract
        !           247:      * Poll for media insertion/removal.
        !           248:      * @discussion
        !           249:      * This method is called periodically by the superclass, if isMediaPollRequired has
        !           250:      * previously reported True. We are responsible for reacting to new media insertion,
        !           251:      * or to existing media being removed.
        !           252:      */
        !           253:     virtual IOReturn   pollMedia(void);
        !           254: 
        !           255: protected:
        !           256: 
        !           257:     /*!
        !           258:      * @function executeRequest
        !           259:      * @abstract
        !           260:      * Start an asynchronous read or write operation.
        !           261:      * @discussion
        !           262:      * This method is the main entry to start an asynchronous read or
        !           263:      * write operation. All IO operations must be block aligned and a
        !           264:      * multiple of the device block size. After some validations, the
        !           265:      * request is passed to the Transport Driver's doAsyncReadWrite method.
        !           266:      * The completion from the operation is set to call RWCompletion, by
        !           267:      * way of the gc_glue C function.
        !           268:      * @param byteStart
        !           269:      * The starting byte offset of the data transfer.
        !           270:      * @param buffer
        !           271:      * The data buffer for the operation. A pointer to an IOMemoryDescriptor.
        !           272:      * @param completion
        !           273:      * The completion information for an asynchronous read or write operation.
        !           274:      */
        !           275:     virtual void       executeRequest(UInt64               byteStart,
        !           276:                                       IOMemoryDescriptor * buffer,
        !           277:                                       IOStorageCompletion  completion);
        !           278: 
        !           279:     /*!
        !           280:      * @function acceptNewMedia
        !           281:      * @abstract
        !           282:      * React to new media insertion.
        !           283:      * @discussion
        !           284:      * This method logs the media block size and block count, then calls
        !           285:      * instantiateMediaObject to get a media object instantiated. The
        !           286:      * media object is then attached above us and registered.
        !           287:      * 
        !           288:      * This method can be overridden to control what happens when new media
        !           289:      * is inserted. The default implementation deals with one IOMedia object.
        !           290:      */
        !           291:     virtual IOReturn   acceptNewMedia(void);
        !           292:     
        !           293:     /*!
        !           294:      * @function decommissionMedia
        !           295:      * @abstract
        !           296:      * Decommission an existing piece of media that has gone away.
        !           297:      * @discussion
        !           298:      * This method wraps a call to tearDown, to tear down the stack and
        !           299:      * the IOMedia object for the media. If "forcible" is true, the media
        !           300:      * object will be forgotten, and initMediaStates will be called. A
        !           301:      * forcible decommission would occur when an unrecoverable error
        !           302:      * happens during teardown (e.g. perhaps a client is still open), but
        !           303:      * we must still forget about the media.
        !           304:      * @param forcible
        !           305:      * True to force forgetting of the media object even if tearDown reports
        !           306:      * that there was an active client.
        !           307:      */
        !           308:     virtual IOReturn   decommissionMedia(bool forcible);
        !           309: 
        !           310:     /*!
        !           311:      * @function instantiateDesiredMediaObject
        !           312:      * @abstract
        !           313:      * Create an IOMedia object for media.
        !           314:      * @discussion
        !           315:      * This method creates the exact type of IOMedia object desired. It is called by
        !           316:      * instantiateMediaObject. A subclass may override this one-line method to change
        !           317:      * the type of media object actually instantiated.
        !           318:      */
        !           319:     virtual IOMedia *  instantiateDesiredMediaObject(void);
        !           320: 
        !           321:     /*!
        !           322:      * @function instantiateMediaObject
        !           323:      * @abstract
        !           324:      * Create an IOMedia object for media.
        !           325:      * @discussion
        !           326:      * This method creates an IOMedia object from the supplied parameters. It is a
        !           327:      * convenience method to wrap the handful of steps to do the job.
        !           328:      * @param media
        !           329:      * A pointer to the created IOMedia object.
        !           330:      * @param base
        !           331:      * Byte number of beginning of active data area of the media. Usually zero.
        !           332:      * @param byteSize
        !           333:      * Size of the data area of the media, in bytes.
        !           334:      * @param blockSize
        !           335:      * Block size of the media, in bytes.
        !           336:      * @param isWholeMedia
        !           337:      * True indicates the IOMedia object represents the entire media; False indicates
        !           338:      * the IOMedia object represents a portion of the entire media.
        !           339:      * @param mediaName
        !           340:      * Name of the IOMedia object.
        !           341:      */
        !           342:     virtual IOReturn   instantiateMediaObject(IOMedia **media,UInt64 base,UInt64 byteSize,UInt32 blockSize,
        !           343:                                             bool isWholeMedia,char *mediaName);
        !           344: 
        !           345:     /*!
        !           346:      * @function recordAdditionalMediaParameters
        !           347:      * @abstract
        !           348:      * Record any additional media parameters as necessary.
        !           349:      * @discussion
        !           350:      * This method is called by recordMediaParameters() when media is detected.
        !           351:      * The default implementation does nothing and returns kIOReturnSuccess. A
        !           352:      * subclass may override this method to record additional parameters.
        !           353:      */
        !           354:     virtual IOReturn   recordAdditionalMediaParameters(void);
        !           355:     
        !           356:     /* --- Internally used methods. --- */
        !           357: 
        !           358:     /*
        !           359:      * @group
        !           360:      * Internally Used Methods
        !           361:      * @discussion
        !           362:      * These methods are used internally, and will not generally be modified.
        !           363:      */
        !           364:     
        !           365:     /*!
        !           366:      * @function allocateContext
        !           367:      * @abstract
        !           368:      * Allocate a context structure for use with the current async operation.
        !           369:      * @discussion
        !           370:      * A context structure is only needed for asynchronous read or write operations,
        !           371:      * to contain information used to complete the request with the client.
        !           372:      */
        !           373:     virtual struct IOHDDrive::context *allocateContext(void);
        !           374:     
        !           375:     /*!
        !           376:      * @function checkForMedia
        !           377:      * @abstract
        !           378:      * Check if media has newly arrived or disappeared.
        !           379:      * @discussion
        !           380:      * This method does most of the work in polling for media, first
        !           381:      * calling the Transport Driver's reportMediaState method. If
        !           382:      * reportMediaState reports no change in the media state, kIOReturnSuccess
        !           383:      * is returned. If media has just become available, calls are made to
        !           384:      * recordMediaParameters and acceptNewMedia. If media has just gone
        !           385:      * away, a call is made to decommissionMedia, with the forcible
        !           386:      * parameter set to true. The forcible teardown is needed to enforce
        !           387:      * the disappearance of media, regardless of interested clients.
        !           388:      */
        !           389:     virtual IOReturn   checkForMedia(void);
        !           390: 
        !           391:     /*!
        !           392:      * @function constructMediaProperties
        !           393:      * @abstract
        !           394:      * Create properties related to the media.
        !           395:      * @discussion
        !           396:      * This function creates a set of properties to express media properties.
        !           397:      * 
        !           398:      * This function is presently called by recordMediaParameters, but it does nothing.
        !           399:      */
        !           400:     virtual OSDictionary *constructMediaProperties(void);
        !           401:     
        !           402:     /*!
        !           403:      * @function deleteContext
        !           404:      * @abstract
        !           405:      * Delete a context structure.
        !           406:      * @discussion
        !           407:      * This method also issues a "release" for the IO buffer, if any.
        !           408:      * @param cx
        !           409:      * A pointer to the context structure to be deleted.
        !           410:      */
        !           411:     virtual void       deleteContext(struct IOHDDrive::context *cx);
        !           412:     
        !           413:     /*!
        !           414:      * @function getDeviceTypeName
        !           415:      * @abstract
        !           416:      * Return the desired device name.
        !           417:      * @discussion
        !           418:      * This method returns a string, used to compare the kDeviceTypeProperty of
        !           419:      * our provider. This method is called from probe.
        !           420:      *  
        !           421:      * The default implementation of this method returns kDeviceTypeHardDisk.
        !           422:      */
        !           423:     virtual const char * getDeviceTypeName(void);
        !           424:     
        !           425:     /*!
        !           426:      * @function initMediaStates
        !           427:      * @abstract
        !           428:      * Initialize media-related instance variables.
        !           429:      * @discussion
        !           430:      * Called when media is not present, this method marks the drive state
        !           431:      * as not having media present, not spun up, and write-enabled.
        !           432:      */
        !           433:     virtual void       initMediaStates(void);
        !           434:     
        !           435:     /*!
        !           436:      * @function recordMediaParameters
        !           437:      * @abstract
        !           438:      * Obtain media-related parameters on media insertion.
        !           439:      * @discussion
        !           440:      * This method obtains media-related parameters via calls to the
        !           441:      * Transport Driver's reportBlockSize, reportMaxValidBlock,
        !           442:      * reportMaxReadTransfer, reportMaxWriteTransfer, and reportWriteProtection
        !           443:      * methods.
        !           444:      */
        !           445:     virtual IOReturn   recordMediaParameters(void);
        !           446:     
        !           447:     /*!
        !           448:      * @function setProvider
        !           449:      * @abstract
        !           450:      * Store the provider pointer.
        !           451:      * @discussion
        !           452:      * This method uses IODynamicCast to verify that the provider is of
        !           453:      * the proper class type. The default implementation checks for a nub
        !           454:      * of type IOHDDriveNub.
        !           455:      * 
        !           456:      * This method would be overridden for a new generic driver subclass. For
        !           457:      * example, a generic CD driver would need to accept a different provider
        !           458:      * class (e.g. IOCDDriveNub instead of IOHDDriveNub).
        !           459:      * @param provider
        !           460:      * A pointer to our provider.
        !           461:      */
        !           462:     virtual bool       setProvider(IOService * provider);
        !           463:     
        !           464:     /*!
        !           465:      * @function showStats
        !           466:      * @abstract
        !           467:      * Print debugging statistics.
        !           468:      * @discussion
        !           469:      * This method prints debugging statistics maintained by the class.
        !           470:      * 
        !           471:      * Present statistics include counts of up and down calls.
        !           472:      * @result
        !           473:      * True indicates statistics should be printed; False indicates no printing desired.
        !           474:      */
        !           475:     virtual bool       showStats(void);
        !           476:     
        !           477:     /*!
        !           478:      * @function tearDown
        !           479:      * @abstract
        !           480:      * Tear down the stack above this object when media goes away.
        !           481:      * @discussion
        !           482:      * This method calls media->terminate, and if that succeeds, issues
        !           483:      * a release on the media object, followed by a call to initMediaStates.
        !           484:      * @param media
        !           485:      * A pointer to the IOMedia object from which to initiate teardown.
        !           486:      */
        !           487:     virtual IOReturn   tearDown(IOService *media);
        !           488: 
        !           489:     /*
        !           490:      * @endgroup
        !           491:      */
        !           492:     
        !           493:     /*!
        !           494:      * @function validateNewMedia
        !           495:      * @abstract
        !           496:      * Verify that new media is acceptable.
        !           497:      * @discussion
        !           498:      * This method will be called whenever new media is detected. Return true to accept
        !           499:      * the media, or false to reject it (andcall rejectMedia). Vendors might override
        !           500:      * this method to handle password-protection for new media.
        !           501:      * 
        !           502:      * The default implementation always returns True, indicating media is accepted.
        !           503:      */
        !           504:     virtual bool       validateNewMedia(void);
        !           505:     
        !           506:     /*!
        !           507:      * @function rejectMedia
        !           508:      * @abstract
        !           509:      * Reject new media.
        !           510:      * @discussion
        !           511:      * This method will be called if validateNewMedia returns False (thus rejecting
        !           512:      * the new media. A vendor may choose to override this method to control behavior
        !           513:      * when media is rejected.
        !           514:      * 
        !           515:      * The default implementation simply calls ejectMedia.
        !           516:      */
        !           517:     virtual void       rejectMedia(void);      /* default ejects */
        !           518:     
        !           519: public:
        !           520:         
        !           521:     /*!
        !           522:      * @function RWCompletion
        !           523:      * @abstract
        !           524:      * Handle a C callback for an IO completion.
        !           525:      * @discussion
        !           526:      * This method must be public so we can reach it from the C-language callback
        !           527:      * "glue" routine. It should not be called from outside this class.
        !           528:      */
        !           529:     virtual void       RWCompletion(struct IOHDDrive::context *cx);
        !           530: 
        !           531: protected:
        !           532: 
        !           533:     /* -------------*/
        !           534: 
        !           535:     /*!
        !           536:      * @var _provider
        !           537:      * A pointer to our provider.
        !           538:      */
        !           539:     IOHDDriveNub *     _provider;
        !           540: 
        !           541:     /* Device info: */
        !           542: 
        !           543:     /*!
        !           544:      * @var _removable
        !           545:      * True if the media is removable; False if it is fixed (not removable).
        !           546:      */
        !           547:     bool               _removable;
        !           548: 
        !           549:     /*!
        !           550:      * @var _ejectable
        !           551:      * True if the media is ejectable under software control.
        !           552:      */
        !           553:     bool               _ejectable;             /* software-ejectable */
        !           554: 
        !           555:     /*!
        !           556:      * @var _lockable
        !           557:      * True if the media can be locked in the device under software control.
        !           558:      */
        !           559:     bool               _lockable;              /* software lockable in drive */
        !           560:     /*!
        !           561:      * @var _pollIsRequired
        !           562:      * True if we must poll to detect media insertion or removal.
        !           563:      */
        !           564:     bool               _pollIsRequired;
        !           565:     /*!
        !           566:      * @var _pollIsExpensive
        !           567:      * True if polling is expensive; False if not.
        !           568:      */
        !           569:     bool               _pollIsExpensive;
        !           570: 
        !           571:     /* Async IO statistics, usually only useful for debugging. These counters show
        !           572:      * outstanding IO operations and completions.
        !           573:      */
        !           574: 
        !           575:     /*!
        !           576:      * @struct stats
        !           577:      * A data structure to contain debugging statistics. Each field is a count.
        !           578:      * @field clientReceived
        !           579:      * Requests received from our client.
        !           580:      * @field providerSent
        !           581:      * Requests sent to our provider.
        !           582:      * @field providerReject
        !           583:      * Client requests we rejected without sending to our provider.
        !           584:      * @field providerCompletionsRcvd
        !           585:      * Completion calls that have arrived from our provider. 
        !           586:      * @field clientCompletionsSent
        !           587:      * Completion calls that have been made to our client.
        !           588:      * @field clientCompletionsDone
        !           589:      * Completion calls to the client that have come back to us.
        !           590:      * This count MUST match clientCompletionsSent!
        !           591:      */
        !           592:     /*!
        !           593:      * @var stats
        !           594:      * The stats structure.
        !           595:      */
        !           596:     struct stats {                             /* executeRequest & completion counts */
        !           597:         int            clientReceived;         /* requests received from client */
        !           598:         int            providerSent;           /* requests sent to provider */
        !           599:         int            providerReject;         /* provider requests rejected */
        !           600:         int            providerCompletionsRcvd; /* completions received from provider */
        !           601:         int            clientCompletionsSent;  /* completions sent to client */
        !           602:         int            clientCompletionsDone;  /* client completions made it back to us */
        !           603:     }                  _stats;
        !           604:                                             
        !           605:     /* Media info and states: */
        !           606: 
        !           607:     /*!
        !           608:      * @var _mediaObject
        !           609:      * A pointer to the media object we have instantiated (if any).
        !           610:      */
        !           611:     IOMedia *          _mediaObject;
        !           612:     /*!
        !           613:      * @var _mediaPresent
        !           614:      * True if media is present in the device; False if not.
        !           615:      */
        !           616:     bool               _mediaPresent;          /* media is present and ready */
        !           617:     /*!
        !           618:      * @var _writeProtected
        !           619:      * True if the media is write-protected; False if not.
        !           620:      */
        !           621:     bool               _writeProtected;
        !           622:     
        !           623:     /*!
        !           624:      * @var _mediaStateLock
        !           625:      * A lock used to protect during media checks.
        !           626:      */
        !           627:     IOLock *           _mediaStateLock;
        !           628: 
        !           629:     /*!
        !           630:      * @var _mediaBlockSize
        !           631:      * The block size of the media, in bytes.
        !           632:      */
        !           633:     UInt64             _mediaBlockSize;
        !           634:     /*!
        !           635:      * @var _maxBlockNumber
        !           636:      * The maximum allowable block number for the media, zero-based.
        !           637:      */
        !           638:     UInt64             _maxBlockNumber;
        !           639: 
        !           640:     /*!
        !           641:      * @var _maxReadByteTransfer
        !           642:      * The maximum byte transfer allowed for read operations.
        !           643:      */
        !           644:     UInt64             _maxReadByteTransfer;
        !           645: 
        !           646:     /*!
        !           647:      * @var _maxWriteByteTransfer
        !           648:      * The maximum byte transfer allowed for write operations.
        !           649:      */
        !           650:     UInt64             _maxWriteByteTransfer;
        !           651: };
        !           652: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.