From 7bcd0af193e646ddd3895f4892c088a4d9cec6bb Mon Sep 17 00:00:00 2001 From: Yan Burman Date: Wed, 11 Feb 2015 13:12:54 +0000 Subject: [PATCH] isert: Fix case where we got disconnect before login character device was opened (merge r6080 from iser) git-svn-id: http://svn.code.sf.net/p/scst/svn/branches/3.0.x-iser@6082 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 b2e18eb7a..96c268c3a 100644 --- a/iscsi-scst/kernel/isert-scst/isert_login.c +++ b/iscsi-scst/kernel/isert-scst/isert_login.c @@ -367,7 +367,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", @@ -496,6 +495,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 */ @@ -504,6 +511,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 */