This procedure has an additional parameter, as compared with “bread”. It is called only by “readi” (6256).
Check if the desired block has already been assigned to a buffer. (It may not yet be available, but at least is it there?);
If not initiate the necessary read operation but don’t wait for it to finish;
Look around for the “read ahead” block. If it is not there, allocate a buffer (4789) but release it (4791) if the buffer is already ready;
The “read ahead” block is not ready, so initiate an asynchronous read operation;
If a buffer was assigned to the current block call “bread” to wrap it up, else...
Wait for the completion of the operation which was started at line 4785.