staging/lustre/llite: fix 'data race condition' issues of lli_flags
authorSebastien Buisson <sebastien.buisson@bull.net>
Wed, 24 Jul 2013 17:17:27 +0000 (01:17 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 24 Jul 2013 17:31:00 +0000 (10:31 -0700)
Fix 'data race condition' defects found by Coverity version
6.5.0:
Data race condition (MISSING_LOCK)
Accessing variable without holding lock. Elsewhere,
this variable is accessed with lock held.

lli->lli_flags need to be protected by lli->lli_lock.

Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-2744
Lustre-change: http://review.whamcloud.com/6571
Signed-off-by: Sebastien Buisson <sebastien.buisson@bull.net>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Keith Mannthey <keith.mannthey@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
Signed-off-by: Peng Tao <tao.peng@emc.com>
Signed-off-by: Andreas Dilger <andreas.dilger@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/lustre/lustre/llite/llite_lib.c
drivers/staging/lustre/lustre/llite/namei.c

index 890268834510b0fcf0045fe2873c1b09f749ed73..b44a3d6d0eddf2b17ec02bafe2d70c115056aca9 100644 (file)
@@ -1189,7 +1189,9 @@ void ll_clear_inode(struct inode *inode)
                LASSERT(lli->lli_opendir_pid == 0);
        }
 
+       spin_lock(&lli->lli_lock);
        ll_i2info(inode)->lli_flags &= ~LLIF_MDS_SIZE_LOCK;
+       spin_unlock(&lli->lli_lock);
        md_null_inode(sbi->ll_md_exp, ll_inode2fid(inode));
 
        LASSERT(!lli->lli_open_fd_write_count);
@@ -1756,7 +1758,9 @@ void ll_update_inode(struct inode *inode, struct lustre_md *md)
                                        /* Use old size assignment to avoid
                                         * deadlock bz14138 & bz14326 */
                                        i_size_write(inode, body->size);
+                                       spin_lock(&lli->lli_lock);
                                        lli->lli_flags |= LLIF_MDS_SIZE_LOCK;
+                                       spin_unlock(&lli->lli_lock);
                                }
                                ldlm_lock_decref(&lockh, mode);
                        }
index 8e948a71dd644e67ecc536a25f65cd2cf5295280..333e55f692f19c656e6ef8e2713025d0ada8232e 100644 (file)
@@ -275,8 +275,11 @@ int ll_md_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
                                CDEBUG(D_INODE, "invaliding layout %d.\n", rc);
                }
 
-               if (bits & MDS_INODELOCK_UPDATE)
+               if (bits & MDS_INODELOCK_UPDATE) {
+                       spin_lock(&lli->lli_lock);
                        lli->lli_flags &= ~LLIF_MDS_SIZE_LOCK;
+                       spin_unlock(&lli->lli_lock);
+               }
 
                if (S_ISDIR(inode->i_mode) &&
                     (bits & MDS_INODELOCK_UPDATE)) {