Whamcloud - gitweb
LU-18596 ldlm: avoid LBUG in ll_lock_cancel_bits 77/57577/3
authorSergey Cheremencev <scherementsev@ddn.com>
Fri, 13 Dec 2024 04:42:33 +0000 (07:42 +0300)
committerOleg Drokin <green@whamcloud.com>
Wed, 22 Jan 2025 18:43:48 +0000 (18:43 +0000)
Check that resource and appropriate inode FIDs are
equivalent under ldlm_lock and resource locks in
ll_inode_resrouce_from_lock. While it was in
ll_lock_cancel_bits it might cause following panic:

 ll_lock_cancel_bits()) ### data mismatch with object
 ll_lock_cancel_bits()) LBUG

Signed-off-by: Sergey Cheremencev <scherementsev@ddn.com>
Change-Id: Ifb75b0ed32062f24c67503548cf2e321ebbc9759
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/57577
Tested-by: Maloo <maloo@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Mikhail Pershin <mpershin@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
lustre/llite/llite_lib.c
lustre/llite/namei.c

index de47597..5ced67f 100644 (file)
@@ -1640,6 +1640,13 @@ struct inode *ll_inode_from_resource_lock(struct ldlm_lock *lock)
                lli = ll_i2info(lock->l_resource->lr_lvb_inode);
                if (lli->lli_inode_magic == LLI_INODE_MAGIC) {
                        inode = igrab(lock->l_resource->lr_lvb_inode);
+                       if (inode && !fid_res_name_eq(ll_inode2fid(inode),
+                                            &lock->l_resource->lr_name)) {
+                               LDLM_ERROR(lock,
+                                          "data mismatch with object "DFID"(%p)",
+                                          PFID(ll_inode2fid(inode)), inode);
+                               LBUG();
+                       }
                } else {
                        inode = lock->l_resource->lr_lvb_inode;
                        LDLM_DEBUG_LIMIT(inode->i_state & I_FREEING ?  D_INFO :
index 41c74b0..f5d7a93 100644 (file)
@@ -267,13 +267,6 @@ static void ll_lock_cancel_bits(struct ldlm_lock *lock,
                RETURN_EXIT;
        }
 
-       if (!fid_res_name_eq(ll_inode2fid(inode),
-                            &lock->l_resource->lr_name)) {
-               LDLM_ERROR(lock, "data mismatch with object "DFID"(%p)",
-                          PFID(ll_inode2fid(inode)), inode);
-               LBUG();
-       }
-
        if (bits & MDS_INODELOCK_XATTR) {
                ll_xattr_cache_empty(inode);
                bits &= ~MDS_INODELOCK_XATTR;