提交 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,
target->tl_retry_count = 7;
target->queue_size = SRP_DEFAULT_QUEUE_SIZE;
mutex_lock(&host->add_target_mutex);
ret = srp_parse_options(buf, target);
if (ret)
goto err;
......@@ -2682,7 +2684,11 @@ static ssize_t srp_create_target(struct device *dev,
be64_to_cpu(target->service_id),
target->path.sgid.raw, target->path.dgid.raw);
return count;
ret = count;
out:
mutex_unlock(&host->add_target_mutex);
return ret;
err_disconnect:
srp_disconnect_target(target);
......@@ -2698,8 +2704,7 @@ static ssize_t srp_create_target(struct device *dev,
err:
scsi_host_put(target_host);
return ret;
goto out;
}
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)
INIT_LIST_HEAD(&host->target_list);
spin_lock_init(&host->target_lock);
init_completion(&host->released);
mutex_init(&host->add_target_mutex);
host->srp_dev = device;
host->port = port;
......
......@@ -105,6 +105,7 @@ struct srp_host {
spinlock_t target_lock;
struct completion released;
struct list_head list;
struct mutex add_target_mutex;
};
struct srp_request {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册