From: Anton N. <ano...@gm...> - 2007-11-12 17:08:00
|
I'm looking for a help in understanding of SCST internal architecture and operation. The problem I'm experiencing now is that SCST seems to process deferred commands incorrectly in some cases. More specifically, I'm confused with the 'while' loop in scst_send_to_midlev function. As far as I understand, the basic execution path consists of a call to scst_do_send_midlev followed by taking of a decision on this command (continue with this command, reschedule it, or move to the next one), the decision is stored in 'int res', which is then returned from the function. However, if there are deferred commands on the device, the function does not return but makes another call to scst_do_send_to_midlev, analyzes the return code again and stores the decision in 'int res' thereby erasing the decision for the previous command. If scst_send_to_midlev exits now, it will return the _new_ decision (for the deferred command) whereas the scst_process_active_cmd will think that it is the decision for the command that was originally passed to scst_send_to_midlev. For example, this will cause problems in the following situation: 1. scst_send_to_midlev is called with cmd == 0x80000100 2. scst_do_send_to_midlev is called with cmd == 0x8000100 3. scst_do_send_to_midlev returns with SCST_EXEC_COMPLETED (in certain scenarios the command is already destroyed at this point) 4. scst_check_deferred_commands finds the defferred cmd == 0x80000200 5. scst_do_send_to_midlev is called with cmd == 0x80000200 6. scst_do_send_to_midlev returns with SCST_EXEC_NEED_THREAD 7. scst_send_to_midlev returns with SCST_CMD_STATE_RES_NEED_THREAD 8. Now, the scst_process_active_cmd will try to reschedule command 0x8000100 which is already destroyed at this point ! Can anyone on the list confirm my guess? Or, this situation should never happen because of some other condition which I may have missed? Right now I can't think of any of simple methods to work around the issue, i.e. any of my ideas require rewriting significant part of the code. |