Whamcloud - gitweb
LU-7062 ldlm: GPF in _ldlm_lock_debug() 39/16139/8
authorAndriy Skulysh <andriy.skulysh@seagate.com>
Mon, 31 Aug 2015 08:39:34 +0000 (11:39 +0300)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 9 May 2017 03:43:58 +0000 (03:43 +0000)
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 <andriy.skulysh@seagate.com>
Reviewed-on: https://review.whamcloud.com/16139
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/ldlm/ldlm_lock.c

index 6e4663f..034ef30 100644 (file)
@@ -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);