| From b95ad0140dc8d2375bff4b0f30f6832cbb29e17c Mon Sep 17 00:00:00 2001 | 
 | From: Alex Elder <elder@inktank.com> | 
 | Date: Wed, 26 Dec 2012 10:43:57 -0600 | 
 | Subject: libceph: WARN, don't BUG on unexpected connection states | 
 |  | 
 | From: Alex Elder <elder@inktank.com> | 
 |  | 
 | (cherry picked from commit 122070a2ffc91f87fe8e8493eb0ac61986c5557c) | 
 |  | 
 | A number of assertions in the ceph messenger are implemented with | 
 | BUG_ON(), killing the system if connection's state doesn't match | 
 | what's expected.  At this point our state model is (evidently) not | 
 | well understood enough for these assertions to trigger a BUG(). | 
 | Convert all BUG_ON(con->state...) calls to be WARN_ON(con->state...) | 
 | so we learn about these issues without killing the machine. | 
 |  | 
 | We now recognize that a connection fault can occur due to a socket | 
 | closure at any time, regardless of the state of the connection.  So | 
 | there is really nothing we can assert about the state of the | 
 | connection at that point so eliminate that assertion. | 
 |  | 
 | Reported-by: Ugis <ugis22@gmail.com> | 
 | Tested-by: Ugis <ugis22@gmail.com> | 
 | Signed-off-by: Alex Elder <elder@inktank.com> | 
 | Reviewed-by: Sage Weil <sage@inktank.com> | 
 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 
 | --- | 
 |  net/ceph/messenger.c |   11 +++++------ | 
 |  1 file changed, 5 insertions(+), 6 deletions(-) | 
 |  | 
 | --- a/net/ceph/messenger.c | 
 | +++ b/net/ceph/messenger.c | 
 | @@ -561,7 +561,7 @@ void ceph_con_open(struct ceph_connectio | 
 |  	mutex_lock(&con->mutex); | 
 |  	dout("con_open %p %s\n", con, ceph_pr_addr(&addr->in_addr)); | 
 |   | 
 | -	BUG_ON(con->state != CON_STATE_CLOSED); | 
 | +	WARN_ON(con->state != CON_STATE_CLOSED); | 
 |  	con->state = CON_STATE_PREOPEN; | 
 |   | 
 |  	con->peer_name.type = (__u8) entity_type; | 
 | @@ -1509,7 +1509,7 @@ static int process_banner(struct ceph_co | 
 |  static void fail_protocol(struct ceph_connection *con) | 
 |  { | 
 |  	reset_connection(con); | 
 | -	BUG_ON(con->state != CON_STATE_NEGOTIATING); | 
 | +	WARN_ON(con->state != CON_STATE_NEGOTIATING); | 
 |  	con->state = CON_STATE_CLOSED; | 
 |  } | 
 |   | 
 | @@ -1635,7 +1635,7 @@ static int process_connect(struct ceph_c | 
 |  			return -1; | 
 |  		} | 
 |   | 
 | -		BUG_ON(con->state != CON_STATE_NEGOTIATING); | 
 | +		WARN_ON(con->state != CON_STATE_NEGOTIATING); | 
 |  		con->state = CON_STATE_OPEN; | 
 |   | 
 |  		con->peer_global_seq = le32_to_cpu(con->in_reply.global_seq); | 
 | @@ -2132,7 +2132,6 @@ more: | 
 |  		if (ret < 0) | 
 |  			goto out; | 
 |   | 
 | -		BUG_ON(con->state != CON_STATE_CONNECTING); | 
 |  		con->state = CON_STATE_NEGOTIATING; | 
 |   | 
 |  		/* | 
 | @@ -2160,7 +2159,7 @@ more: | 
 |  		goto more; | 
 |  	} | 
 |   | 
 | -	BUG_ON(con->state != CON_STATE_OPEN); | 
 | +	WARN_ON(con->state != CON_STATE_OPEN); | 
 |   | 
 |  	if (con->in_base_pos < 0) { | 
 |  		/* | 
 | @@ -2374,7 +2373,7 @@ static void ceph_fault(struct ceph_conne | 
 |  	dout("fault %p state %lu to peer %s\n", | 
 |  	     con, con->state, ceph_pr_addr(&con->peer_addr.in_addr)); | 
 |   | 
 | -	BUG_ON(con->state != CON_STATE_CONNECTING && | 
 | +	WARN_ON(con->state != CON_STATE_CONNECTING && | 
 |  	       con->state != CON_STATE_NEGOTIATING && | 
 |  	       con->state != CON_STATE_OPEN); | 
 |   |