rxrpc_find_service_conn_rcu: fix the usage of read_seqbegin_or_lock()
Subsystems (3)
PATCH 1/1 rxrpc_find_service_conn_rcu: fix the usage of read_seqbegin_or_lock()
rxrpc_find_service_conn_rcu() should make the "seq" counter odd on the second pass, otherwise read_seqbegin_or_lock() never takes the lock.
Signed-off-by Oleg Nesterov <[email protected]>
--- net/rxrpc/conn_service.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/rxrpc/conn_service.c +2 -1
@@ -25,7 +25,7 @@ struct rxrpc_connection *rxrpc_find_service_conn_rcu(struct rxrpc_peer *peer,struct rxrpc_conn_proto k;struct rxrpc_skb_priv *sp =rxrpc_skb (skb);struct rb_node *p; -unsigned int seq =0 ; +unsigned int seq =1 ; k.epoch = sp->hdr.epoch; k.cid = sp->hdr.cid &RXRPC_CIDMASK ;
@@ -35,6 +35,7 @@ struct rxrpc_connection *rxrpc_find_service_conn_rcu(struct rxrpc_peer *peer,* under just the RCU read lock, so we have to check for * changes. */ + seq++;/* 2 on the 1st/lockless path, otherwise odd */ read_seqbegin_or_lock (&peer->service_conn_lock, &seq); p =rcu_dereference_raw (peer->service_conns.rb_node);
Signature · 1 line
2.25.1.362.g51ebf55