From 90faade1ccdaf07e5db29cdc01f0346af979b3c4 Mon Sep 17 00:00:00 2001 From: Yan Burman Date: Wed, 11 Feb 2015 13:05:20 +0000 Subject: [PATCH] isert: Fix case where we got disconnect before login character device was opened We may receive disconnect before iscsi-scstd had the chance to open the character device. This would result in resource leak, since the device will not be freed. Fix this by only increasing reference once the device is actually opened. Signed-off-by: Yan Burman git-svn-id: http://svn.code.sf.net/p/scst/svn/branches/iser@6080 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- iscsi-scst/kernel/isert-scst/isert_login.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/iscsi-scst/kernel/isert-scst/isert_login.c b/iscsi-scst/kernel/isert-scst/isert_login.c index 168d3834c..b18020f8a 100644 --- a/iscsi-scst/kernel/isert-scst/isert_login.c +++ b/iscsi-scst/kernel/isert-scst/isert_login.c @@ -356,7 +356,6 @@ wait_for_connection: conn_dev = list_first_entry(&dev->new_conn_list, struct isert_conn_dev, conn_list_entry); list_move(&conn_dev->conn_list_entry, &dev->curr_conn_list); - kref_get(&conn_dev->kref); spin_unlock(&dev->conn_lock); res = snprintf(k_buff, sizeof(k_buff), "/dev/"ISER_CONN_DEV_PREFIX"%d", @@ -485,6 +484,14 @@ static int isert_open(struct inode *inode, struct file *filp) dev = container_of(inode->i_cdev, struct isert_conn_dev, cdev); + spin_lock(&isert_listen_dev.conn_lock); + if (unlikely(dev->occupied == 0)) { + spin_unlock(&isert_listen_dev.conn_lock); + res = -ENODEV; /* already closed */ + goto out; + } + spin_unlock(&isert_listen_dev.conn_lock); + if (unlikely(!atomic_dec_and_test(&dev->available))) { atomic_inc(&dev->available); res = -EBUSY; /* already open */ @@ -493,6 +500,7 @@ static int isert_open(struct inode *inode, struct file *filp) spin_lock(&isert_listen_dev.conn_lock); list_del_init(&dev->conn_list_entry); + kref_get(&dev->kref); spin_unlock(&isert_listen_dev.conn_lock); filp->private_data = dev; /* for other methods */