Whamcloud - gitweb
LU-1259 mgs: avoid cancelling IR lock twice
[fs/lustre-release.git] / lustre / mgs / mgs_handler.c
index 345d26b..4fa10d4 100644 (file)
@@ -358,13 +358,23 @@ static int mgs_completion_ast_ir(struct ldlm_lock *lock, int flags,
 
         if (!(flags & (LDLM_FL_BLOCK_WAIT | LDLM_FL_BLOCK_GRANTED |
                        LDLM_FL_BLOCK_CONV))) {
-                struct fs_db *fsdb = (struct fs_db *)lock->l_ast_data;
-                struct lustre_handle lockh;
+                struct fs_db *fsdb;
 
-                mgs_ir_notify_complete(fsdb);
+                /* l_ast_data is used as a marker to avoid cancel ldlm lock
+                 * twice. See LU-1259. */
+                lock_res_and_lock(lock);
+                fsdb = (struct fs_db *)lock->l_ast_data;
+                lock->l_ast_data = NULL;
+                unlock_res_and_lock(lock);
 
-                ldlm_lock2handle(lock, &lockh);
-                ldlm_lock_decref_and_cancel(&lockh, LCK_EX);
+                if (fsdb != NULL) {
+                        struct lustre_handle lockh;
+
+                        mgs_ir_notify_complete(fsdb);
+
+                        ldlm_lock2handle(lock, &lockh);
+                        ldlm_lock_decref_and_cancel(&lockh, LCK_EX);
+                }
         }
 
         RETURN(ldlm_completion_ast(lock, flags, cbdata));