>erezz at voltaire.com wrote on Wed, 15 Aug 2007 12:26 +0300: >> At first, I thought that this will be easy to fix - just move the va & >> stag from the conn object to the task object. However, when ep_read >> (iscsi_iser_read in iSER's case) is called, the task isn't allocated >> yet. iSER must save the data from the received iSER header in some task >> object (e.g. iser_task). > > You could add a new transport call .ep_task_init and call that near > the iscsi_alloc_task() in iscsi_scsi_cmd_rx_start(). It gets the > newly allocated struct iscsi_task. The TCP case would be a noop. > The RDMA case would take the cached rem_stag values from the > connection structure and stick them in the task struct. This is all > done synchronously while working on the single received PDU so > should be safe. You only need to call ->ep_task_init(task) in the > SCSI command case, not TM functions or other places that will not do > RDMA data transfers. Do you mean to say that after do_recv is called and the va & stag are saved on conn_info, we can be sure that no other new command will be received before iscsi_alloc task is called? If yes, it should be easy, and I already have some of the code for it. Erez |