Annotation of driverkit/doc/OLD_NRW/IODiskTalk.rtf, revision 1.1

1.1     ! root        1: {\rtf0\nextcset {\fonttbl{\f41487\fnil Ohlfs;}{\f21\fswiss 
        !             2: Helvetica;}{\f3\fswiss Helvetica;}}
        !             3: \paperw12240\paperh15840 \margl1800\margr1800\margt0\margb0 
        !             4: \pgnstart1\ftnstart1 \deftab31680 \sectd\sbknone \linemod0\linex0 
        !             5: \ftnbj \headery0\footery0 \cols1 {\header \pard \li0\ri0\fi0\qc\sl320 
        !             6: \plain \f3 \par 
        !             7: \par 
        !             8: \par 
        !             9: \par 
        !            10: }{\footer \pard \li0\ri0\fi0\qc\sl320 \plain \f3 \par 
        !            11: \par 
        !            12: \par 
        !            13: \par 
        !            14: }\pard \li0\ri0\fi0\qc\sl280 \tx360 \tx6120 \plain \f21\fs36\b 
        !            15: Driverkit Disk Classes\par 
        !            16: 16 April, 1993\par 
        !            17: \par 
        !            18: \pard \li0\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !            19: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !            20: \tx8260 \par 
        !            21: \par 
        !            22: \par 
        !            23: Outline:\par 
        !            24: \par 
        !            25: \'b7 Introduction\par 
        !            26: \par 
        !            27: \'b7 The volCheck module\par 
        !            28: \par 
        !            29: \'b7 IODiskReadingAndWriting protocol\par 
        !            30: \par 
        !            31: \'b7 IOPhysicalDiskMethods protocol\par 
        !            32: \par 
        !            33: \'b7 Interfacing to cdevsw and bdevsw\par 
        !            34: \par 
        !            35: \'b7 I/O thread architecture\par 
        !            36: \par 
        !            37: \'b7 Q & A\par 
        !            38: \par 
        !            39: \par 
        !            40: \page \pard \li0\ri0\fi0\qc\sl280 \tx360 \tx1080 \tx1800 
        !            41: \tx2520 \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 
        !            42: \tx7560 \tx8260 \par 
        !            43: Class Hierarchy\par 
        !            44: \pard \li0\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !            45: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !            46: \tx8260 \par 
        !            47: \par 
        !            48: \par 
        !            49: \par 
        !            50: \par 
        !            51: \pard \keep \li0\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !            52: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !            53: \tx8260 \par 
        !            54: \pard \keep \li0\ri0\fi0\qc\sl280 \tx360 \tx1080 \tx1800 
        !            55: \tx2520 \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 
        !            56: \tx7560 \tx8260    \par 
        !            57: \pard \keep \li0\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !            58: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !            59: \tx8260 \par 
        !            60: \par 
        !            61: \page \pard \li0\ri0\fi0\qc\sl280 \tx360 \tx1080 \tx1800 
        !            62: \tx2520 \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 
        !            63: \tx7560 \tx8260 \par 
        !            64: \par 
        !            65: The volCheck module\par 
        !            66: \pard \li0\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !            67: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !            68: \tx8260 \par 
        !            69: \par 
        !            70: \par 
        !            71: \par 
        !            72: \par 
        !            73: \'b7 Disk Insertion detection\par 
        !            74: \par 
        !            75: \'b7 Automount\par 
        !            76: \par 
        !            77: \'b7 Alert panels\par 
        !            78: \par 
        !            79: \'b7 abort notification\par 
        !            80: \par 
        !            81: \par 
        !            82: \page IODiskReadingAndWriting protocol\par 
        !            83: \pard \li0\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !            84: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !            85: \tx8260 \par 
        !            86: \par 
        !            87: \f-24049\fs24\b0 @protocol IODiskReadingAndWriting\par 
        !            88: \par 
        !            89: - (IOReturn) readAt\tab \tab : (unsigned)offset \par 
        !            90: \tab \tab \tab \tab   length : (unsigned)length \par 
        !            91: \tab \tab \tab \tab   buffer : (unsigned char *)buffer\par 
        !            92: \tab \tab \tab \tab   actualLength : (unsigned *)actualLength 
        !            93: \par 
        !            94: \tab \tab \tab \tab   client : (vm_task_t)client;\par 
        !            95: \par 
        !            96: - (IOReturn) readAsyncAt\tab : (unsigned)offset \par 
        !            97: \tab \tab \tab \tab   length : (unsigned)length \par 
        !            98: \tab \tab \tab \tab   buffer : (unsigned char *)buffer\par 
        !            99: \tab \tab \tab \tab   pending : (void *)pending\par 
        !           100: \tab \tab \tab \tab   client : (vm_task_t)client;\par 
        !           101: \tab \tab \par 
        !           102: - (IOReturn) writeAt\tab \tab : (unsigned)offset \par 
        !           103: \tab \tab \tab \tab   length : (unsigned)length \par 
        !           104: \tab \tab \tab \tab   buffer : (unsigned char *)buffer\par 
        !           105: \tab \tab \tab \tab   actualLength : (unsigned *)actualLength 
        !           106: \par 
        !           107: \tab \tab \tab \tab   client : (vm_task_t)client;\par 
        !           108: \tab \tab   \par 
        !           109: - (IOReturn) writeAsyncAt\tab : (unsigned)offset \par 
        !           110: \tab \tab \tab \tab   length : (unsigned)length \par 
        !           111: \tab \tab \tab \tab   buffer : (unsigned char *)buffer\par 
        !           112: \tab \tab \tab \tab   pending : (void *)pending\par 
        !           113: \tab \tab \tab \tab   client : (vm_task_t)client;\par 
        !           114: \par 
        !           115: @end\par 
        !           116: \f21\fs36\b \par 
        !           117: \par 
        !           118: \page \pard \li0\ri0\fi0\qc\sl280 \tx360 \tx1080 \tx1800 
        !           119: \tx2520 \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 
        !           120: \tx7560 \tx8260 IOPhysicalDiskMethods protocol\par 
        !           121: \pard \li0\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !           122: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !           123: \tx8260 \par 
        !           124: \f-24049\fs24\b0 @protocol IOPhysicalDiskMethods\par 
        !           125: \par 
        !           126: /*\par 
        !           127:  * Get physical parameters (dev_size, block_size, etc.) 
        !           128: from\par 
        !           129:  * new disk. Called upon disk insertion detection, or 
        !           130: other\par 
        !           131:  * transition to RS_READY, or other change of state 
        !           132: of\par 
        !           133:  * disk (like a transition to "formatted").\par 
        !           134:  */\par 
        !           135: - (IOReturn)updatePhysicalParameters;\par 
        !           136: \par 
        !           137: /*\par 
        !           138:  * Called by volCheck thread when WS has told us that 
        !           139: a\par 
        !           140:  * requested disk is not present. Pending I/Os which 
        !           141: require\par 
        !           142:  * a disk to be present must be aborted.\par 
        !           143:  */\par 
        !           144: - (void)abortRequest;\par 
        !           145: \par 
        !           146: /*\par 
        !           147:  * Called by the volCheck thread when a transition 
        !           148: to\par 
        !           149:  * "ready" is detected. Pending I/Os which require a 
        !           150: disk\par 
        !           151:  *  may proceed.\par 
        !           152:  */\par 
        !           153: - (void)diskBecameReady;\par 
        !           154: \par 
        !           155: /*\par 
        !           156:  * Inquire if disk is present; if not, and 'prompt' 
        !           157: is TRUE,\par 
        !           158:  * ask for it. \par 
        !           159:  * Returns IO_R_NODISK if:\par 
        !           160:  *    prompt TRUE, disk not present, and user cancels\par 
        !           161:  *        request for disk.\par 
        !           162:  *    prompt FALSE, disk not present.\par 
        !           163:  * Else returns IO_R_SUCCESS.\par 
        !           164:  */\par 
        !           165: - (IOReturn)isDiskReady\tab : (BOOL)prompt;\par 
        !           166: \par 
        !           167: \page \par 
        !           168: /*\par 
        !           169:  * Device-specific eject method, only called on physical\par 
        !           170:  * device.\par 
        !           171:  */\par 
        !           172: - (IOReturn) ejectPhysical;\par 
        !           173: \par 
        !           174: /*\par 
        !           175:  * Determine basic state of device. This method should 
        !           176: NOT\par 
        !           177:  * implement any retries. It also should not return\par 
        !           178:  * RS_EJECTING (That's only used in the lastReadyState\par 
        !           179:  * instance variable).\par 
        !           180:  */\par 
        !           181: - (IODiskReadyState)updateReadyState;\par 
        !           182: \par 
        !           183: @end\par 
        !           184: \f21\fs36\b \par 
        !           185: \par 
        !           186: \f-24049\fs24\b0 /*\par 
        !           187:  * Basic "usefulness" state of drive.\par 
        !           188:  */\par 
        !           189: typedef enum \{\par 
        !           190: \tab IO_Ready, \tab \tab // Ready for r/w operations\par 
        !           191: \tab IO_NotReady,\tab \tab // not ready (spinning up 
        !           192: or busy)\par 
        !           193: \tab IO_NoDisk, \tab \tab // no disk present\par 
        !           194: \tab IO_Ejecting\tab \tab // eject in progress\par 
        !           195: \} IODiskReadyState;\par 
        !           196: \f21\fs36\b \par 
        !           197: \page \pard \li0\ri0\fi0\qc\sl280 \tx360 \tx1080 \tx1800 
        !           198: \tx2520 \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 
        !           199: \tx7560 \tx8260 Kernel "Glue" Layer\par 
        !           200: \pard \li0\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !           201: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !           202: \tx8260 \par 
        !           203: \par 
        !           204: This struct provides mapping between dev_t and id:\par 
        !           205: \par 
        !           206: \f-24049\fs24\b0 typedef struct \{\par 
        !           207: \tab id liveId;\tab \tab \tab // instance for live partition\par 
        !           208: \tab id partitionId[NPART-1];\tab // for block and raw 
        !           209: devices\par 
        !           210: \tab dev_t rawDev;\tab \tab \tab // used by volCheck 
        !           211: logic\par 
        !           212: \tab dev_t blockDev;\tab \tab // ditto\par 
        !           213: \} IODevAndIdInfo;\par 
        !           214: \f21\fs36\b \par 
        !           215: \par 
        !           216: \'b7 Allocated in glue layer module, one per physical\par 
        !           217:   disk\par 
        !           218: \par 
        !           219: \'b7 Each instance of IODisk (or subclass) contains a 
        !           220: \par 
        !           221:   pointer to the associated IODevAndIdInfo.\par 
        !           222: \par 
        !           223: \'b7 rawDev and blockDev initialized in device-\par 
        !           224:   specific routine in kernel glue layer, typically\par 
        !           225:   called from +probe or +initialize.\par 
        !           226: \par 
        !           227: \'b7 Id fields initialized by IODiskPartition (drivers\par 
        !           228:   don't need to worry about these).\par 
        !           229: \par 
        !           230: \par 
        !           231: \page \pard \li0\ri0\fi0\qc\sl280 \tx360 \tx1080 \tx1800 
        !           232: \tx2520 \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 
        !           233: \tx7560 \tx8260 I/O Threads\par 
        !           234: \pard \li0\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !           235: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !           236: \tx8260 \par 
        !           237: Instance variables:\par 
        !           238: \par 
        !           239: \pard \li380\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !           240: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !           241: \tx8260 \f-24049\fs24\b0 queue_head_t\tab ioQueueDisk;\tab 
        !           242: // for I/Os requiring disk \par 
        !           243: queue_head_t\tab ioQueueNodisk;\tab // for other I/O\par 
        !           244: id \tab \tab \tab ioQLock;\tab \tab // NXConditionLock 
        !           245: - \par 
        !           246: \tab \tab \tab \tab \tab \tab // protects the queues; 
        !           247: I/O\par 
        !           248: \tab \tab \tab \tab \tab \tab // thread(s) sleeps on 
        !           249: this\par 
        !           250: \par 
        !           251: /*\par 
        !           252:  * Values for ioQLock.condition.\par 
        !           253:  */\par 
        !           254:  typedef enum \{ IOQueuesEmpty, WorkAvailable \}; \par 
        !           255: \pard \li0\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !           256: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !           257: \tx8260 \par 
        !           258: \f21\fs36\b \par 
        !           259: Command Buffer:\par 
        !           260: \f-24049\fs24\b0 \par 
        !           261: \pard \li380\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !           262: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !           263: \tx8260 typedef struct \{\par 
        !           264: \tab /* \par 
        !           265:  \tab  * device-specific stuff here which defines one 
        !           266: I/O.\par 
        !           267: \tab  * For example, block number, transfer count,\par 
        !           268: \tab  * return status, etc.\par 
        !           269: \tab  */\par 
        !           270: \par 
        !           271: \tab /* \par 
        !           272: \tab  * cmdLock is what an exported method blocks on\par 
        !           273:  \tab  * when waiting for the I/O thread to process 
        !           274: this\par 
        !           275: \tab  * command.\par 
        !           276: \tab  */\par 
        !           277: \tab NXConditionLock\tab cmdLock;\par 
        !           278: \par 
        !           279: \tab /*\par 
        !           280: \tab  * This determines whether the operation is \par 
        !           281:    \tab  * synchronous or async.\par 
        !           282: \tab  */\par 
        !           283: \tab void \tab \tab \tab *pending;\par 
        !           284: \} commandBuf;\par 
        !           285: \page \pard \li0\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !           286: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !           287: \tx8260 \par 
        !           288: \f21\fs36\b Exported method:\par 
        !           289: \par 
        !           290: \pard \li380\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !           291: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !           292: \tx8260 \f-24049\fs24\b0 \{\par 
        !           293: \tab Cons up a commandBuffer for this I/O;\par 
        !           294: \par 
        !           295: \tab /*\par 
        !           296: \tab  * Enqueue on appropriate I/O queue and wake up 
        !           297: I/O\par 
        !           298: \tab  * thread.\par 
        !           299: \tab  */\par 
        !           300: \tab if this I/O requires disk \{\par 
        !           301: \tab \tab enqueue on ioQueueDisk;\par 
        !           302: \tab \}\par 
        !           303: \tab else \{\par 
        !           304: \tab \tab enqueue on ioQueueNodisk;\par 
        !           305: \tab \}\par 
        !           306: \tab [ioQLock lock];\par 
        !           307: \tab [ioQLock unlockWith:WorkAvailable];\par 
        !           308: \par 
        !           309: \tab /*\par 
        !           310: \tab  * Wait for I/O complete.\par 
        !           311: \tab  */\par 
        !           312: \tab [commandBuffer.cmdLock lockWhen:YES];\par 
        !           313: \pard \li0\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !           314: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !           315: \tx8260 \}\par 
        !           316: \par 
        !           317: \f21\fs36\b \par 
        !           318: \page \par 
        !           319: I/O thread:\par 
        !           320: \par 
        !           321: \par 
        !           322: \pard \li380\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !           323: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !           324: \tx8260 \f-24049\fs24\b0 \{\par 
        !           325: \tab initialize;\par 
        !           326: \tab while(1) \{\par 
        !           327: \tab \tab [ioQLock lockWhen: WorkAvailable];\par 
        !           328: \tab \tab [ioQLock unlock];\par 
        !           329: \tab \tab process everything on ioQueueNodisk;\par 
        !           330: \tab \tab if((lastReadyState != IO_RS_NODISK) &&\par 
        !           331:       \tab   (lastReadyState != IO_RS_EJECTING)) 
        !           332: \{\par 
        !           333: \tab \tab \tab process everything in ioQueueDisk;\par 
        !           334: \tab \tab else \{\par 
        !           335: \tab \tab \tab if ioQueueDisk non-empty \{\par 
        !           336: \tab \tab \tab   [self requestInsertionPanelForDiskType];\par 
        !           337: \tab \tab \tab \}\par 
        !           338: \tab \tab \}\par 
        !           339: \tab \tab [ioQLock unlockWith:<current queue state>];\par 
        !           340: \tab \}\par 
        !           341:  \}\par 
        !           342: \par 
        !           343: \page \par 
        !           344: \pard \li0\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !           345: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !           346: \tx8260 \f21\fs36\b To process one commandBuf:\par 
        !           347: \par 
        !           348: \pard \li380\ri0\fi0\sl280 \tx360 \tx1080 \tx1800 \tx2520 
        !           349: \tx3240 \tx3960 \tx4680 \tx5400 \tx6120 \tx6840 \tx7560 
        !           350: \tx8260 \f-24049\fs24\b0 \{\par 
        !           351: \tab perform device-specific I/O described in\par 
        !           352: \tab \tab commandBuf;\par 
        !           353: \tab if(commandBuf.pending) \{\par 
        !           354: \tab \tab /*\par 
        !           355: \tab \tab  * Async operation. \par 
        !           356: \tab \tab  */\par 
        !           357: \tab \tab [self completeTransfer:commandBuf.pending\par 
        !           358: \tab \tab \tab \tab \tab withStatus:...\par 
        !           359: \tab \tab \tab \tab \tab actualLength:...];\par 
        !           360: \tab \}\par 
        !           361: \tab else \{\par 
        !           362: \tab \tab /*\par 
        !           363: \tab \tab  * Wake up client.\par 
        !           364: \tab \tab  */\par 
        !           365: \tab \tab [commandBuf.cmdLock lock];\par 
        !           366: \tab \tab [commandBuf.cmdLock unlockWith:YES];\par 
        !           367: \tab \} \par 
        !           368: \}\par 
        !           369: }

unix.superglobalmegacorp.com

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