Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2d7091bc authored by Bart Van Assche's avatar Bart Van Assche Committed by Roland Dreier
Browse files

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: default avatarBart Van Assche <bvanassche@acm.org>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent e7ffde01
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -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;

+1 −0
Original line number Diff line number Diff line
@@ -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 {