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: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Roland Dreier <roland@purestorage.com>
This commit is contained in:
parent
e7ffde0164
commit
2d7091bcf6
|
@ -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 @@ err_free_mem:
|
|||
|
||||
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 {
|
||||
|
|
Loading…
Reference in New Issue