Annotation of driverkit/notes/volcheck, revision 1.1.1.1

1.1       root        1:                        VolumeCheck notes
                      2: 
                      3: * Panel requests
                      4: 
                      5:   -- DiskObject detects "disk not present"
                      6:   -- DiskObject calls vol_panel_disk_num(abort_fcn, queue_ptr)
                      7:   -- either
                      8:      -- Disk is inserted. volCheck thread detects via checkReady:
                      9:      -- WS sends abort. vol driver calls abort_fcn.
                     10:      
                     11:   -- can't have I/O thread(s) block waiting for insertion detection - all
                     12:      threads might evetually block, leaving no thread to do checkReady.
                     13:      
                     14:      
                     15: * Insertion detect
                     16:   -- driver maintains readyState as instance. calls to checkReady: return
                     17:      immediately if state = ready, else do some I/O to find state.
                     18:   -- volCheck thread calls checkReady: once per second if state != ready.
                     19:      -- if transition to ready, call vol_notify_dev if no panel request
                     20:         pending. Call diskPresent: regardless.
                     21:      -- if state was ejecting, and is now ready, bump per-dev counter. If
                     22:         limit exceeded, vol_panel_request(PR_RT_EJECT_REQ).
                     23:      
                     24:   DiskObject subclass's read/write methods verify readyState = ready before
                     25:   proceeding. if not ready, call vol_panel_disk_num(abort_fcn, queue_ptr)....
                     26:   
                     27:   readyState transitions
                     28:  
                     29:        lastReadyState init'd by subclass, then only changed by volCheck!!!
                     30:         
                     31:        init: RS_NOTREADY or RS_NODISK (by subclass)
                     32:   
                     33:        RS_NOTREADY, RS_NODISK
                     34:                ==> RS_READY when checkReady, called by volCheck, determines
                     35:                    that hardware is ready. Done by volCheck.
                     36:                    
                     37:        RS_READY
                     38:                ==> RS_NOTREADY on error. Done by volCheck in 
                     39:                    volCheckNotReady().
                     40:                ==> RS_EJECTING when I/O thread grabs eject cmd from ioQ.
                     41:                    Done by volCheck in volCheckEjecting().
                     42:                
                     43:        RS_EJECTING
                     44:                ==> RS_NODISK when volCheck sees a RS_NODISK or RS_NOTREADY.
                     45:                    Done by volCheck.
                     46:                
                     47: * in DiskObject subclass:
                     48:    
                     49:      generic exported method:
                     50:        if this I/O requires no disk
                     51:                enqueue on queue_(always)
                     52:        else
                     53:                enqueue on queue_(needs_disk)
                     54:        wakeup I/O thread (queueLock)
                     55:        
                     56:      generic I/O thread (floppy I/O thread or SCSI disk thread...) {
                     57:      
                     58:         while(1) {
                     59:            sleep on queueLock;
                     60:            process everything on queue_(always);
                     61:            if state != RS_EJECTING, RS_NODISK
                     62:                process everything in queue_(needs_disk)
                     63:            else {
                     64:                if anything in queue_(needs_disk)
                     65:                    [self requestDisk:]
                     66:            }
                     67:        }
                     68:      }
                     69: 
                     70:      abortRequest (from volCheck thread, from vol driver, from WSM):
                     71:        pass down to I/O thread (via queue_always).
                     72:        I/O thread does ioComplete on everything in queue_(needs_disk);
                     73:        
                     74:      diskPresent: (called by volCheck thread on disk insert detect
                     75:        just wakeup I/O thread. It'll process everything in queue_(needs_disk).
                     76:        
                     77: * in volCheck:
                     78: 
                     79:      state per registered removable drive {
                     80:        readyState_t last_readyState;
                     81:        dev_t dev;
                     82:        boolean_t is_ejecting;
                     83:        int eject_counter;
                     84:        boolean_t eject_request_pending;
                     85:        boolean_t disk_request_pending;
                     86:      }
                     87:      A queue of these is set up, one element per removable drive at
                     88:         registerDisk: time.
                     89:        
                     90:      while(1) {
                     91:        for each abort request in queue (from WSM) {
                     92:            [driver_id abortRequest:]
                     93:            disk_request_pending = FALSE for that drive;
                     94:        }
                     95:        
                     96:        for each registered removable drive {
                     97:            switch last_readyState {
                     98:                RS_READY:
                     99:                    if is_ejecting {
                    100:                        checkReady;
                    101:                        switch new state {
                    102:                            RS_READY:
                    103:                                if(!eject_request_pending) {
                    104:                                    bump eject_counter;
                    105:                                    if exceeded {
                    106:                                        make eject_request;
                    107:                                        eject_request_pending = TRUE;
                    108:                                    }
                    109:                                 }
                    110:                                 break;
                    111:                            RS_NOTREADY:
                    112:                            RS_NODISK:
                    113:                            default:
                    114:                                if(eject_request_pending) {
                    115:                                    cancel panel;
                    116:                                    eject_request_pending = FALSE;
                    117:                                }
                    118:                        }
                    119:                    }
                    120:                    else no action;
                    121:                
                    122:                default (no disk, not ready):
                    123:                    checkReady;
                    124:                    switch new state {
                    125:                        RS_READY:
                    126:                            if(disk_request_pending) 
                    127:                                cancel panel;
                    128:                            else
                    129:                                vol_notify_dev();
                    130:                            [driver_id diskPresent:]; // REGARDLESS
                    131:                            [NXDisk probe:]
                    132:                            break;
                    133:                        default:
                    134:                            no action;
                    135:                    }
                    136:                    break;
                    137:            } /* switch last ready state */
                    138:        }  /* for each drive */  
                    139:        sleep(one second);
                    140:      }
                    141:      
                    142: /*
                    143:  * Called by vol driver
                    144:  */
                    145: volCheckAbort(param = id of device? ptr to volCheckEntry?) {
                    146:        add an abortRequest to volCheck's abortReqQueue;
                    147: }
                    148: 
                    149: /*
                    150:  * Called by DiskObject subclass
                    151:  */
                    152: requestDisk {
                    153:        if(!disk_request_pending) {
                    154:                vol_panel_dev();
                    155:                disk_request_pending = TRUE;
                    156:        }
                    157: }
                    158: 
                    159: exception conditions:
                    160:   -- eject request pending, disk still ready
                    161:      volCheck thread knows isEjecting. Counts 'n' "ready" states. requests
                    162:          eject panel.
                    163:         
                    164:   -- panel request pending, disk detected.
                    165:      volCheck knows requestPending; detects transition to RS_READY.
                    166:      invokes driver's diskPresent:
                    167:      driver's I/O thread wakes up, sees RS_READY, processes everything in
                    168:        queue_(needs_disk).
                    169:        
                    170:   -- panel request pending, WS sends abort message
                    171:      volCheckabort calls  driver's abortRequest:
                    172:      driver's abortReqeust:
                    173:        pass down to I/O thread.
                    174:        I/O thread ioComplete's everything on queue_(needs_disk).
                    175:      
                    176:   

unix.superglobalmegacorp.com

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