提交 2d7091bc 编写于 作者: B Bart Van Assche 提交者: Roland Dreier

IB/srp: Avoid duplicate connections

The connection uniqueness check is performed before a new connection
is added to the target list. This patch protects both actions by a
mutex such that simultaneous writes from two different threads into the
"add_target" variable do not result in duplicate connections.
Signed-off-by: NBart Van Assche <bvanassche@acm.org>
Signed-off-by: NRoland Dreier <roland@purestorage.com>
上级 e7ffde01
...@@ -2614,6 +2614,8 @@ static ssize_t srp_create_target(struct device *dev, ...@@ -2614,6 +2614,8 @@ static ssize_t srp_create_target(struct device *dev,
target->tl_retry_count = 7; target->tl_retry_count = 7;
target->queue_size = SRP_DEFAULT_QUEUE_SIZE; target->queue_size = SRP_DEFAULT_QUEUE_SIZE;
mutex_lock(&host->add_target_mutex);
ret = srp_parse_options(buf, target); ret = srp_parse_options(buf, target);
if (ret) if (ret)
goto err; goto err;
...@@ -2682,7 +2684,11 @@ static ssize_t srp_create_target(struct device *dev, ...@@ -2682,7 +2684,11 @@ static ssize_t srp_create_target(struct device *dev,
be64_to_cpu(target->service_id), be64_to_cpu(target->service_id),
target->path.sgid.raw, target->path.dgid.raw); target->path.sgid.raw, target->path.dgid.raw);
return count; ret = count;
out:
mutex_unlock(&host->add_target_mutex);
return ret;
err_disconnect: err_disconnect:
srp_disconnect_target(target); srp_disconnect_target(target);
...@@ -2698,8 +2704,7 @@ static ssize_t srp_create_target(struct device *dev, ...@@ -2698,8 +2704,7 @@ static ssize_t srp_create_target(struct device *dev,
err: err:
scsi_host_put(target_host); scsi_host_put(target_host);
goto out;
return ret;
} }
static DEVICE_ATTR(add_target, S_IWUSR, NULL, srp_create_target); static DEVICE_ATTR(add_target, S_IWUSR, NULL, srp_create_target);
...@@ -2735,6 +2740,7 @@ static struct srp_host *srp_add_port(struct srp_device *device, u8 port) ...@@ -2735,6 +2740,7 @@ static struct srp_host *srp_add_port(struct srp_device *device, u8 port)
INIT_LIST_HEAD(&host->target_list); INIT_LIST_HEAD(&host->target_list);
spin_lock_init(&host->target_lock); spin_lock_init(&host->target_lock);
init_completion(&host->released); init_completion(&host->released);
mutex_init(&host->add_target_mutex);
host->srp_dev = device; host->srp_dev = device;
host->port = port; host->port = port;
......
...@@ -105,6 +105,7 @@ struct srp_host { ...@@ -105,6 +105,7 @@ struct srp_host {
spinlock_t target_lock; spinlock_t target_lock;
struct completion released; struct completion released;
struct list_head list; struct list_head list;
struct mutex add_target_mutex;
}; };
struct srp_request { struct srp_request {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册