From: NeilBrown Date: Fri, 13 Dec 2019 15:46:15 +0000 (-0500) Subject: LU-12542 handle: remove locking from class_handle2object() X-Git-Tag: 2.13.52~61 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F61%2F35861%2F7;p=fs%2Flustre-release.git LU-12542 handle: remove locking from class_handle2object() There is limited value in this locking and test on h_in. If the lookup could have run in parallel with class_handle_unhash_nolock() and seen "h_in == 0", then it could equally well have run moments earlier and not seen it - no locking would prevent that, so the caller much be prepared to have an object returned which has already been unhashed by the time it sees the object. In other words, any interlock between unhash and lookup must be provided at a higher level than where this code is trying to handle it. The locking *does* prevent the refcount from being incremented if the object has already been removed from the list. As the final reference is always dropped after that removal, it indirectly stops the refcount from being incremented after the final reference is dropped. This can be more directly achieved by using refcount_inc_not_zero(). So remove the locking, and replace it with refcount_inc_not_zero(). Change-Id: Id29cee173ed0c3b060ea92e21af6e420970cfa18 Signed-off-by: Mr NeilBrown Reviewed-on: https://review.whamcloud.com/35861 Tested-by: jenkins Reviewed-by: Mike Pershin Reviewed-by: Petros Koutoupis Tested-by: Maloo Reviewed-by: Oleg Drokin --- diff --git a/lustre/obdclass/lustre_handles.c b/lustre/obdclass/lustre_handles.c index 7931442..8a6bd97 100644 --- a/lustre/obdclass/lustre_handles.c +++ b/lustre/obdclass/lustre_handles.c @@ -155,15 +155,12 @@ void *class_handle2object(u64 cookie, const char *owner) if (h->h_cookie != cookie || h->h_owner != owner) continue; - spin_lock(&h->h_lock); - if (likely(h->h_in != 0)) { - refcount_inc(&h->h_ref); + if (refcount_inc_not_zero(&h->h_ref)) { CDEBUG(D_INFO, "GET %s %p refcount=%d\n", h->h_owner, h, refcount_read(&h->h_ref)); retval = h; } - spin_unlock(&h->h_lock); break; } rcu_read_unlock();