From: Mike Christie <michaelc@cs.wisc.edu>
Date: Mon, 13 May 2013 12:13:08 +0530
Subject: [SCSI] iscsi class, qla4xxx: fix sess/conn refcounting when find fns
	are used
Patch-mainline: v3.10-rc1
Git-commit: 8526cb114f771851d84425d85d8735a6e0816ba2
References: FATE#313902 bnc#818154

This fixes a bug where the iscsi class/driver did not do a put_device
when a sess/conn device was found.

Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Acked-by: Lee Duncan <lduncan@suse.com>
---
 drivers/scsi/qla4xxx/ql4_os.c       |  3 +++
 drivers/scsi/scsi_transport_iscsi.c | 19 ++++++++++++++++---
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
index c4e4613..abc8e9d 100644
--- a/drivers/scsi/qla4xxx/ql4_os.c
+++ b/drivers/scsi/qla4xxx/ql4_os.c
@@ -5606,6 +5606,7 @@ static int qla4xxx_sysfs_ddb_add(struct Scsi_Host *shost, const char *buf,
 		ql4_printk(KERN_ERR, ha,
 			   "%s: A non-persistent entry %s found\n",
 			   __func__, dev->kobj.name);
+		put_device(dev);
 		goto exit_ddb_add;
 	}
 
@@ -6348,6 +6349,8 @@ qla4xxx_sysfs_ddb_get_param(struct iscsi_bus_flash_session *fnode_sess,
 		rc = -ENOSYS;
 		break;
 	}
+
+	put_device(dev);
 	return rc;
 }
 
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index bff6cab..cc63fff 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -2851,11 +2851,15 @@ static int iscsi_set_flashnode_param(struct iscsi_transport *transport,
 					iscsi_is_flashnode_conn_dev);
 	if (!dev) {
 		err = -ENODEV;
-		goto put_host;
+		goto put_sess;
 	}
 
 	fnode_conn = iscsi_dev_to_flash_conn(dev);
 	err = transport->set_flashnode_param(fnode_sess, fnode_conn, data, len);
+	put_device(dev);
+
+put_sess:
+	put_device(&fnode_sess->dev);
 
 put_host:
 	scsi_host_put(shost);
@@ -2931,6 +2935,7 @@ static int iscsi_del_flashnode(struct iscsi_transport *transport,
 	}
 
 	err = transport->del_flashnode(fnode_sess);
+	put_device(&fnode_sess->dev);
 
 put_host:
 	scsi_host_put(shost);
@@ -2976,11 +2981,15 @@ static int iscsi_login_flashnode(struct iscsi_transport *transport,
 					iscsi_is_flashnode_conn_dev);
 	if (!dev) {
 		err = -ENODEV;
-		goto put_host;
+		goto put_sess;
 	}
 
 	fnode_conn = iscsi_dev_to_flash_conn(dev);
 	err = transport->login_flashnode(fnode_sess, fnode_conn);
+	put_device(dev);
+
+put_sess:
+	put_device(&fnode_sess->dev);
 
 put_host:
 	scsi_host_put(shost);
@@ -3026,12 +3035,16 @@ static int iscsi_logout_flashnode(struct iscsi_transport *transport,
 					iscsi_is_flashnode_conn_dev);
 	if (!dev) {
 		err = -ENODEV;
-		goto put_host;
+		goto put_sess;
 	}
 
 	fnode_conn = iscsi_dev_to_flash_conn(dev);
 
 	err = transport->logout_flashnode(fnode_sess, fnode_conn);
+	put_device(dev);
+
+put_sess:
+	put_device(&fnode_sess->dev);
 
 put_host:
 	scsi_host_put(shost);

