sahlberg / libiscsi

iscsi client library and utilities
Other
192 stars 164 forks source link

lun_reset cancelling lun tasks only #400

Closed anatoliy-glagolev closed 5 months ago

anatoliy-glagolev commented 1 year ago

The existing implementation of iscsi_task_mgmt_lun_reset_async cancels all tasks in ready-to-send and wait-for-completion queues. If the ISCSI context has in-flight tasks for a different LUNs or tasks that are not LUN-specific (such as NOPIN, NOPOUT), those tasks are not supposed to be affected by the LUN reset. Also, the tasks for the LUN being reset may have in-flight responses not affected by a concurrent LUN reset; they have to be handled accordingly.

This change cancels only the tasks for the LUN being reset if they are in the ready-to-send queue ('outqueue'). The tasks in the wait-for- completion queue should be cancelled on LUN reset completion. For example:

iscsi_task_mgmt_lun_reset_async(iscsi, lun, lun_reset_cb, ctxt);
....

.... void lun_reset_cb(struct iscsi_context iscsi, int status, void command_data, void private_data) { // 'response' field per ISCSI spec rfc7143 section 11.6.1 uint8_t iscsi_response = (uint8_t *)command_data; if (iscsi_response == 0) { // The LUN has been reset. No further replies are expected // for in-flight tasks for that LUN. Explicitly cancelling // the tasks in wait-for-completion queue. for (.. scsi_task-s in flight ..) { iscsi_scsi_cancel_task(iscsi, task); } } ... }