diff mbox series

[10/28] scsi: iscsi: Add iscsi_cls_conn refcount helpers

Message ID 20210523175739.360324-11-michael.christie@oracle.com
State New
Headers show
Series [01/28] scsi: iscsi: Add task completion helper | expand

Commit Message

Mike Christie May 23, 2021, 5:57 p.m. UTC
There are a couple places where we could free the iscsi_cls_conn while
it's still in use. This adds some helpers to get/put a refcount on the
struct and converts an exiting user. The next patches will then use the
helpers to fix 2 bugs in the eh code.

Signed-off-by: Mike Christie <michael.christie@oracle.com>
---
 drivers/scsi/libiscsi.c             |  7 ++-----
 drivers/scsi/scsi_transport_iscsi.c | 12 ++++++++++++
 include/scsi/scsi_transport_iscsi.h |  2 ++
 3 files changed, 16 insertions(+), 5 deletions(-)

Comments

Lee Duncan May 24, 2021, 6:34 p.m. UTC | #1
On 5/23/21 10:57 AM, Mike Christie wrote:
> There are a couple places where we could free the iscsi_cls_conn while

> it's still in use. This adds some helpers to get/put a refcount on the

> struct and converts an exiting user. The next patches will then use the

> helpers to fix 2 bugs in the eh code.

> 

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

> ---

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

>  drivers/scsi/scsi_transport_iscsi.c | 12 ++++++++++++

>  include/scsi/scsi_transport_iscsi.h |  2 ++

>  3 files changed, 16 insertions(+), 5 deletions(-)

> 

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

> index 2aaf83678654..ab39d7f65bbb 100644

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

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

> @@ -1361,7 +1361,6 @@ void iscsi_session_failure(struct iscsi_session *session,

>  			   enum iscsi_err err)

>  {

>  	struct iscsi_conn *conn;

> -	struct device *dev;

>  

>  	spin_lock_bh(&session->frwd_lock);

>  	conn = session->leadconn;

> @@ -1370,10 +1369,8 @@ void iscsi_session_failure(struct iscsi_session *session,

>  		return;

>  	}

>  

> -	dev = get_device(&conn->cls_conn->dev);

> +	iscsi_get_conn(conn->cls_conn);

>  	spin_unlock_bh(&session->frwd_lock);

> -	if (!dev)

> -	        return;

>  	/*

>  	 * if the host is being removed bypass the connection

>  	 * recovery initialization because we are going to kill

> @@ -1383,7 +1380,7 @@ void iscsi_session_failure(struct iscsi_session *session,

>  		iscsi_conn_error_event(conn->cls_conn, err);

>  	else

>  		iscsi_conn_failure(conn, err);

> -	put_device(dev);

> +	iscsi_put_conn(conn->cls_conn);

>  }

>  EXPORT_SYMBOL_GPL(iscsi_session_failure);

>  

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

> index b8a93e607891..909134b9c313 100644

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

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

> @@ -2457,6 +2457,18 @@ int iscsi_destroy_conn(struct iscsi_cls_conn *conn)

>  }

>  EXPORT_SYMBOL_GPL(iscsi_destroy_conn);

>  

> +void iscsi_put_conn(struct iscsi_cls_conn *conn)

> +{

> +	put_device(&conn->dev);

> +}

> +EXPORT_SYMBOL_GPL(iscsi_put_conn);

> +

> +void iscsi_get_conn(struct iscsi_cls_conn *conn)

> +{

> +	get_device(&conn->dev);

> +}

> +EXPORT_SYMBOL_GPL(iscsi_get_conn);

> +

>  /*

>   * iscsi interface functions

>   */

> diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h

> index 3974329d4d02..c5d7810fd792 100644

> --- a/include/scsi/scsi_transport_iscsi.h

> +++ b/include/scsi/scsi_transport_iscsi.h

> @@ -443,6 +443,8 @@ extern void iscsi_remove_session(struct iscsi_cls_session *session);

>  extern void iscsi_free_session(struct iscsi_cls_session *session);

>  extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess,

>  						int dd_size, uint32_t cid);

> +extern void iscsi_put_conn(struct iscsi_cls_conn *conn);

> +extern void iscsi_get_conn(struct iscsi_cls_conn *conn);

>  extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);

>  extern void iscsi_unblock_session(struct iscsi_cls_session *session);

>  extern void iscsi_block_session(struct iscsi_cls_session *session);

> 


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

Patch

diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index 2aaf83678654..ab39d7f65bbb 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -1361,7 +1361,6 @@  void iscsi_session_failure(struct iscsi_session *session,
 			   enum iscsi_err err)
 {
 	struct iscsi_conn *conn;
-	struct device *dev;
 
 	spin_lock_bh(&session->frwd_lock);
 	conn = session->leadconn;
@@ -1370,10 +1369,8 @@  void iscsi_session_failure(struct iscsi_session *session,
 		return;
 	}
 
-	dev = get_device(&conn->cls_conn->dev);
+	iscsi_get_conn(conn->cls_conn);
 	spin_unlock_bh(&session->frwd_lock);
-	if (!dev)
-	        return;
 	/*
 	 * if the host is being removed bypass the connection
 	 * recovery initialization because we are going to kill
@@ -1383,7 +1380,7 @@  void iscsi_session_failure(struct iscsi_session *session,
 		iscsi_conn_error_event(conn->cls_conn, err);
 	else
 		iscsi_conn_failure(conn, err);
-	put_device(dev);
+	iscsi_put_conn(conn->cls_conn);
 }
 EXPORT_SYMBOL_GPL(iscsi_session_failure);
 
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index b8a93e607891..909134b9c313 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -2457,6 +2457,18 @@  int iscsi_destroy_conn(struct iscsi_cls_conn *conn)
 }
 EXPORT_SYMBOL_GPL(iscsi_destroy_conn);
 
+void iscsi_put_conn(struct iscsi_cls_conn *conn)
+{
+	put_device(&conn->dev);
+}
+EXPORT_SYMBOL_GPL(iscsi_put_conn);
+
+void iscsi_get_conn(struct iscsi_cls_conn *conn)
+{
+	get_device(&conn->dev);
+}
+EXPORT_SYMBOL_GPL(iscsi_get_conn);
+
 /*
  * iscsi interface functions
  */
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h
index 3974329d4d02..c5d7810fd792 100644
--- a/include/scsi/scsi_transport_iscsi.h
+++ b/include/scsi/scsi_transport_iscsi.h
@@ -443,6 +443,8 @@  extern void iscsi_remove_session(struct iscsi_cls_session *session);
 extern void iscsi_free_session(struct iscsi_cls_session *session);
 extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess,
 						int dd_size, uint32_t cid);
+extern void iscsi_put_conn(struct iscsi_cls_conn *conn);
+extern void iscsi_get_conn(struct iscsi_cls_conn *conn);
 extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);
 extern void iscsi_unblock_session(struct iscsi_cls_session *session);
 extern void iscsi_block_session(struct iscsi_cls_session *session);