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

Commit a5988c49 authored by Alex Elder's avatar Alex Elder Committed by Alex Elder
Browse files

libceph: set CLOSED state bit in con_init



Once a connection is fully initialized, it is really in a CLOSED
state, so make that explicit by setting the bit in its state field.

It is possible for a connection in NEGOTIATING state to get a
failure, leading to ceph_fault() and ultimately ceph_con_close().
Clear that bits if it is set in that case, to reflect that the
connection truly is closed and is no longer participating in a
connect sequence.

Issue a warning if ceph_con_open() is called on a connection that
is not in CLOSED state.

Signed-off-by: default avatarAlex Elder <elder@inktank.com>
Reviewed-by: default avatarSage Weil <sage@inktank.com>
parent e10006f8
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -454,11 +454,14 @@ void ceph_con_close(struct ceph_connection *con)
{
	dout("con_close %p peer %s\n", con,
	     ceph_pr_addr(&con->peer_addr.in_addr));
	set_bit(CLOSED, &con->state);  /* in case there's queued work */
	clear_bit(NEGOTIATING, &con->state);
	clear_bit(STANDBY, &con->state);  /* avoid connect_seq bump */
	set_bit(CLOSED, &con->state);

	clear_bit(LOSSYTX, &con->flags);  /* so we retry next connect */
	clear_bit(KEEPALIVE_PENDING, &con->flags);
	clear_bit(WRITE_PENDING, &con->flags);

	mutex_lock(&con->mutex);
	reset_connection(con);
	con->peer_global_seq = 0;
@@ -475,7 +478,8 @@ void ceph_con_open(struct ceph_connection *con, struct ceph_entity_addr *addr)
{
	dout("con_open %p %s\n", con, ceph_pr_addr(&addr->in_addr));
	set_bit(OPENING, &con->state);
	clear_bit(CLOSED, &con->state);
	WARN_ON(!test_and_clear_bit(CLOSED, &con->state));

	memcpy(&con->peer_addr, addr, sizeof(*addr));
	con->delay = 0;      /* reset backoff memory */
	queue_con(con);
@@ -530,6 +534,8 @@ void ceph_con_init(struct ceph_messenger *msgr, struct ceph_connection *con)
	INIT_LIST_HEAD(&con->out_queue);
	INIT_LIST_HEAD(&con->out_sent);
	INIT_DELAYED_WORK(&con->work, con_work);

	set_bit(CLOSED, &con->state);
}
EXPORT_SYMBOL(ceph_con_init);

@@ -1933,14 +1939,15 @@ static int try_write(struct ceph_connection *con)

	/* open the socket first? */
	if (con->sock == NULL) {
		clear_bit(NEGOTIATING, &con->state);
		set_bit(CONNECTING, &con->state);

		con_out_kvec_reset(con);
		prepare_write_banner(con);
		ret = prepare_write_connect(con);
		if (ret < 0)
			goto out;
		prepare_read_banner(con);
		set_bit(CONNECTING, &con->state);
		clear_bit(NEGOTIATING, &con->state);

		BUG_ON(con->in_msg);
		con->in_tag = CEPH_MSGR_TAG_READY;