mirror of https://gitee.com/openkylin/linux.git
rds: tcp: allow progress of rds_conn_shutdown if the rds_connection is marked ERROR by an intervening FIN
rds_conn_shutdown() runs in workq context, and marks the rds_connection as DISCONNECTING before quiescing Tx/Rx paths. However, after all I/O has quiesced, we may still find the rds_connection state to be RDS_CONN_ERROR if an intervening FIN was processed in softirq context. This is not a fatal error: rds_conn_shutdown() should continue the shutdown, and there is no need to log noisy messages about this event. Signed-off-by: Sowmini Varadhan <sowmini.varadhan@oracle.com> Acked-by: Santosh Shilimkar <santosh.shilimkar@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d3fbff306c
commit
e97656d03c
|
@ -333,11 +333,19 @@ void rds_conn_shutdown(struct rds_conn_path *cp)
|
|||
rds_conn_path_reset(cp);
|
||||
|
||||
if (!rds_conn_path_transition(cp, RDS_CONN_DISCONNECTING,
|
||||
RDS_CONN_DOWN) &&
|
||||
!rds_conn_path_transition(cp, RDS_CONN_ERROR,
|
||||
RDS_CONN_DOWN)) {
|
||||
/* This can happen - eg when we're in the middle of tearing
|
||||
* down the connection, and someone unloads the rds module.
|
||||
* Quite reproduceable with loopback connections.
|
||||
* Quite reproducible with loopback connections.
|
||||
* Mostly harmless.
|
||||
*
|
||||
* Note that this also happens with rds-tcp because
|
||||
* we could have triggered rds_conn_path_drop in irq
|
||||
* mode from rds_tcp_state change on the receipt of
|
||||
* a FIN, thus we need to recheck for RDS_CONN_ERROR
|
||||
* here.
|
||||
*/
|
||||
rds_conn_path_error(cp, "%s: failed to transition "
|
||||
"to state DOWN, current state "
|
||||
|
|
Loading…
Reference in New Issue