Protect outqueue and waitpdu with a spinlock
Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
This commit is contained in:
@@ -280,6 +280,7 @@ void iscsi_reconnect_cb(struct iscsi_context *iscsi, int status,
|
||||
void *command_data, void *private_data)
|
||||
{
|
||||
struct iscsi_context *old_iscsi;
|
||||
struct iscsi_pdu *tmp = NULL;
|
||||
int i;
|
||||
|
||||
if (status != SCSI_STATUS_GOOD) {
|
||||
@@ -305,16 +306,20 @@ void iscsi_reconnect_cb(struct iscsi_context *iscsi, int status,
|
||||
old_iscsi = iscsi->old_iscsi;
|
||||
iscsi->old_iscsi = NULL;
|
||||
|
||||
iscsi_mt_spin_lock(&iscsi->iscsi_lock);
|
||||
while (old_iscsi->outqueue) {
|
||||
struct iscsi_pdu *pdu = old_iscsi->outqueue;
|
||||
ISCSI_LIST_REMOVE(&old_iscsi->outqueue, pdu);
|
||||
ISCSI_LIST_ADD_END(&old_iscsi->waitpdu, pdu);
|
||||
}
|
||||
tmp = old_iscsi->waitpdu;
|
||||
old_iscsi->waitpdu = NULL;
|
||||
iscsi_mt_spin_unlock(&iscsi->iscsi_lock);
|
||||
|
||||
while (old_iscsi->waitpdu) {
|
||||
struct iscsi_pdu *pdu = old_iscsi->waitpdu;
|
||||
while (tmp) {
|
||||
struct iscsi_pdu *pdu = tmp;
|
||||
|
||||
ISCSI_LIST_REMOVE(&old_iscsi->waitpdu, pdu);
|
||||
ISCSI_LIST_REMOVE(&tmp, pdu);
|
||||
if (pdu->itt == 0xffffffff) {
|
||||
iscsi->drv->free_pdu(old_iscsi, pdu);
|
||||
continue;
|
||||
@@ -351,6 +356,7 @@ void iscsi_reconnect_cb(struct iscsi_context *iscsi, int status,
|
||||
iscsi->drv->free_pdu(old_iscsi, pdu);
|
||||
}
|
||||
|
||||
iscsi_mt_spin_lock(&iscsi->iscsi_lock);
|
||||
if (old_iscsi->incoming != NULL) {
|
||||
iscsi_free_iscsi_in_pdu(old_iscsi, old_iscsi->incoming);
|
||||
}
|
||||
@@ -358,6 +364,7 @@ void iscsi_reconnect_cb(struct iscsi_context *iscsi, int status,
|
||||
if (old_iscsi->outqueue_current != NULL && old_iscsi->outqueue_current->flags & ISCSI_PDU_DELETE_WHEN_SENT) {
|
||||
iscsi->drv->free_pdu(old_iscsi, old_iscsi->outqueue_current);
|
||||
}
|
||||
iscsi_mt_spin_unlock(&iscsi->iscsi_lock);
|
||||
|
||||
iscsi_free(old_iscsi, old_iscsi->opaque);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user