mbox series

[0/3] iscsi cmd lifetime fixups/cleanups

Message ID 1608069210-5755-1-git-send-email-michael.christie@oracle.com
Headers show
Series iscsi cmd lifetime fixups/cleanups | expand

Message

Mike Christie Dec. 15, 2020, 9:53 p.m. UTC
The following patches were made over Linus's tree. Martin's staging
branches were missing fe0a8a95e7134d0b44cd407bc0085b9ba8d8fe31.

The patches are mix of cleanups and fixups. The first patch is
just a fix that was in the same code path as the second.

The second patch was originally mode to drop the taskqueuelock use, but
it also moved the running cmd cleanup code to the failure functions.

The 3rd patch then takes a ref to the cmd in the EH and timer paths
and utilizes the running cmd cleanup from the 2nd patch to handle
an issue in bnx2i where it wants to sleep in the cleanup_task callout
and needs to know what locks are held.

Comments

Lee Duncan Dec. 16, 2020, 5:39 p.m. UTC | #1
On 12/15/20 1:53 PM, Mike Christie wrote:
> If iscsi_prep_scsi_cmd_pdu fails we try to add it back to the

> cmdqueue, but we leave it partially setup. We don't have functions

> that can undo the pdu and init task setup. We only have cleanup_task

> which can cleanup both parts. So this has us just fail the cmd and

> go through the standard cleanup routine and then have scsi-ml retry

> it like is done when it fails in the queuecommand path.

> 

> Signed-off-by: Mike Christie <michael.christie@oracle.com>

> Reviewed-by: Lee Duncan <lduncan@suse.com>

> ---

>  drivers/scsi/libiscsi.c | 11 +++--------

>  1 file changed, 3 insertions(+), 8 deletions(-)

> 

> diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c

> index f9314f1..ee0786b 100644

> --- a/drivers/scsi/libiscsi.c

> +++ b/drivers/scsi/libiscsi.c

> @@ -1532,14 +1532,9 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)

>  		}

>  		rc = iscsi_prep_scsi_cmd_pdu(conn->task);

>  		if (rc) {

> -			if (rc == -ENOMEM || rc == -EACCES) {

> -				spin_lock_bh(&conn->taskqueuelock);

> -				list_add_tail(&conn->task->running,

> -					      &conn->cmdqueue);

> -				conn->task = NULL;

> -				spin_unlock_bh(&conn->taskqueuelock);

> -				goto done;

> -			} else

> +			if (rc == -ENOMEM || rc == -EACCES)

> +				fail_scsi_task(conn->task, DID_IMM_RETRY);

> +			else

>  				fail_scsi_task(conn->task, DID_ABORT);

>  			spin_lock_bh(&conn->taskqueuelock);

>  			continue;

> 


Reviewed-by: Lee Duncan <lduncan@suse.com>