From 7d30275ceee9ba2c194020f80dcec05aea24937a Mon Sep 17 00:00:00 2001 From: Andriy Skulysh Date: Mon, 31 Aug 2015 11:39:34 +0300 Subject: [PATCH] LU-7062 ldlm: GPF in _ldlm_lock_debug() Lock's resource can change on a client. Take a resource reference under spinlock to print debug information. Change-Id: Id8acb801ea549bf3c1ce1bcf6349db31578579f3 Xyratex-bug-id: MRP-2760 Signed-off-by: Andriy Skulysh Reviewed-on: https://review.whamcloud.com/16139 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Alex Zhuravlev Reviewed-by: Oleg Drokin --- lustre/ldlm/ldlm_lock.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lustre/ldlm/ldlm_lock.c b/lustre/ldlm/ldlm_lock.c index 6e4663f..034ef30 100644 --- a/lustre/ldlm/ldlm_lock.c +++ b/lustre/ldlm/ldlm_lock.c @@ -2727,9 +2727,19 @@ void _ldlm_lock_debug(struct ldlm_lock *lock, { va_list args; struct obd_export *exp = lock->l_export; - struct ldlm_resource *resource = lock->l_resource; + struct ldlm_resource *resource = NULL; char *nid = "local"; + /* on server-side resource of lock doesn't change */ + if ((lock->l_flags & LDLM_FL_NS_SRV) != 0) { + if (lock->l_resource != NULL) + resource = ldlm_resource_getref(lock->l_resource); + } else if (spin_trylock(&lock->l_lock)) { + if (lock->l_resource != NULL) + resource = ldlm_resource_getref(lock->l_resource); + spin_unlock(&lock->l_lock); + } + va_start(args, fmt); if (exp && exp->exp_connection) { @@ -2847,5 +2857,6 @@ void _ldlm_lock_debug(struct ldlm_lock *lock, break; } va_end(args); + ldlm_resource_putref(resource); } EXPORT_SYMBOL(_ldlm_lock_debug); -- 1.8.3.1