LU-9971 lnet: use after free in lnet_discover_peer_locked()
When the lnet_net_lock is unlocked, the peer attached to an lnet_peer_ni (found via lnet_peer_ni::lpni_peer_net->lpn_peer) can change, and the old peer deallocated. If we are really unlucky, then all the churn could give us a new, different, peer at the same address in memory. Change the reference counting on the lnet_peer lp so that it is guaranteed to be alive when we relock the lnet_net_lock for the cpt. When the reference count is dropped lp may go away if it was unlinked, but the new peer is guaranteed to have a different address, so we can still correctly determine whether the peer changed and discovery should be redone. LU-9971 lnet: fix peer ref counting Exit from the loop after peer ref count has been incremented to avoid wrong ref count. The code makes sure that a peer is queued for discovery at most once if discovery is disabled. This is done to use discovery as a standard ping for gateways which do not have discovery feature or discovery is disabled. Signed-off-by:Olaf Weber <olaf.weber@hpe.com> Change-Id: Ia44dce20074b27ec0e77d7c1908c6a44ec73d326 Reviewed-on: https://review.whamcloud.com/28944 Reviewed-by:
Amir Shehata <ashehata@whamcloud.com> Tested-by: Jenkins Tested-by:
Maloo <maloo@whamcloud.com> Reviewed-by:
James Simmons <uja.ornl@yahoo.com> Reviewed-by:
Oleg Drokin <green@whamcloud.com> Reviewed-on: https://review.whamcloud.com/38891 Tested-by:
jenkins <devops@whamcloud.com> Reviewed-by:
Chris Horn <chris.horn@hpe.com> Reviewed-by:
James Simmons <jsimmons@infradead.org>
Please register or sign in to comment