diff --git a/lustre/mds/mds_join.c b/lustre/mds/mds_join.c
index 0cb6fdc81ff5b076e888146e7478676034fb990e..1fbaab84daeaa5703bdcf9aba44e0b65270a6771 100644
--- a/lustre/mds/mds_join.c
+++ b/lustre/mds/mds_join.c
@@ -321,7 +321,9 @@ static int mds_join_unlink_tail_inode(struct mds_update_record *rec,
                 le32_to_cpu(tail_lmm->lmm_magic) == LOV_MAGIC);
 
         LASSERT(de_tailparent);
+        LOCK_INODE_MUTEX(de_tailparent->d_inode);
         rc = ll_vfs_unlink(de_tailparent->d_inode, de_tail, mds->mds_vfsmnt);
+        UNLOCK_INODE_MUTEX(de_tailparent->d_inode);
 
         if (rc == 0) {
                 CDEBUG(D_INODE, "delete the tail inode %lu/%u \n",
diff --git a/lustre/mds/mds_open.c b/lustre/mds/mds_open.c
index 291ac5b83764e9fc1aba54424493258728fd9754..8dcc85d071c7e8096f930bc21719bde744e9d7a6 100644
--- a/lustre/mds/mds_open.c
+++ b/lustre/mds/mds_open.c
@@ -1087,7 +1087,9 @@ int mds_open(struct mds_update_record *rec, int offset,
                 dp.ldp_ptr = req;
                 dp.ldp_inum = ino;
 
+                LOCK_INODE_MUTEX(dparent->d_inode);
                 rc = ll_vfs_create(dparent->d_inode, dchild, rec->ur_mode,NULL);
+                UNLOCK_INODE_MUTEX(dparent->d_inode);
                 if (dchild->d_fsdata == (void *)(unsigned long)ino)
                         dchild->d_fsdata = NULL;
 
@@ -1254,8 +1256,11 @@ found_child:
                         ldlm_lock_decref(child_lockh, child_mode);
         case 2:
                 if (rc && created) {
-                        int err = ll_vfs_unlink(dparent->d_inode, dchild,
-                                                mds->mds_vfsmnt);
+                        int err;
+                        LOCK_INODE_MUTEX(dparent->d_inode);
+                        err = ll_vfs_unlink(dparent->d_inode, dchild,
+                                            mds->mds_vfsmnt);
+                        UNLOCK_INODE_MUTEX(dparent->d_inode);
                         if (err) {
                                 CERROR("unlink(%.*s) in error path: %d\n",
                                        dchild->d_name.len, dchild->d_name.name,
diff --git a/lustre/mds/mds_reint.c b/lustre/mds/mds_reint.c
index cf588341c7a9e95ecb46b794cdef69efaf2bf8ca..7d94fe271a66e4afa5a93078759a6bc056474ff6 100644
--- a/lustre/mds/mds_reint.c
+++ b/lustre/mds/mds_reint.c
@@ -905,7 +905,9 @@ static int mds_reint_create(struct mds_update_record *rec, int offset,
                 handle = fsfilt_start(obd, dir, FSFILT_OP_CREATE, NULL);
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
+                LOCK_INODE_MUTEX(dir);
                 rc = ll_vfs_create(dir, dchild, rec->ur_mode, NULL);
+                UNLOCK_INODE_MUTEX(dir);
                 mds_counter_incr(req->rq_export, LPROC_MDS_MKNOD);
                 EXIT;
                 break;
@@ -914,7 +916,9 @@ static int mds_reint_create(struct mds_update_record *rec, int offset,
                 handle = fsfilt_start(obd, dir, FSFILT_OP_MKDIR, NULL);
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
+                LOCK_INODE_MUTEX(dir);
                 rc = ll_vfs_mkdir(dir, dchild, mds->mds_vfsmnt, rec->ur_mode);
+                UNLOCK_INODE_MUTEX(dir);
                 mds_counter_incr(req->rq_export, LPROC_MDS_MKDIR);
                 EXIT;
                 break;
@@ -923,11 +927,13 @@ static int mds_reint_create(struct mds_update_record *rec, int offset,
                 handle = fsfilt_start(obd, dir, FSFILT_OP_SYMLINK, NULL);
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
+                LOCK_INODE_MUTEX(dir);
                 if (rec->ur_tgt == NULL)        /* no target supplied */
                         rc = -EINVAL;           /* -EPROTO? */
                 else
                         rc = ll_vfs_symlink(dir, dchild, mds->mds_vfsmnt, 
                                             rec->ur_tgt, S_IALLUGO);
+                UNLOCK_INODE_MUTEX(dir);
                 mds_counter_incr(req->rq_export, LPROC_MDS_MKNOD);
                 EXIT;
                 break;
@@ -940,8 +946,10 @@ static int mds_reint_create(struct mds_update_record *rec, int offset,
                 handle = fsfilt_start(obd, dir, FSFILT_OP_MKNOD, NULL);
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
+                LOCK_INODE_MUTEX(dir);
                 rc = ll_vfs_mknod(dir, dchild, mds->mds_vfsmnt, rec->ur_mode, 
                                   rdev);
+                UNLOCK_INODE_MUTEX(dir);
                 mds_counter_incr(req->rq_export, LPROC_MDS_MKNOD);
                 EXIT;
                 break;
@@ -1028,12 +1036,16 @@ cleanup:
                  */
                 switch (type) {
                 case S_IFDIR:
+                        LOCK_INODE_MUTEX(dir);
                         err = ll_vfs_rmdir(dir, dchild, mds->mds_vfsmnt);
+                        UNLOCK_INODE_MUTEX(dir);
                         if (err)
                                 CERROR("rmdir in error path: %d\n", err);
                         break;
                 default:
+                        LOCK_INODE_MUTEX(dir);
                         err = ll_vfs_unlink(dir, dchild, mds->mds_vfsmnt);
+                        UNLOCK_INODE_MUTEX(dir);
                         if (err)
                                 CERROR("unlink in error path: %d\n", err);
                         break;
@@ -1740,7 +1752,9 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
                                       NULL);
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
+                LOCK_INODE_MUTEX(dparent->d_inode);
                 rc = ll_vfs_rmdir(dparent->d_inode, dchild, mds->mds_vfsmnt);
+                UNLOCK_INODE_MUTEX(dparent->d_inode);
                 mds_counter_incr(req->rq_export, LPROC_MDS_RMDIR);
                 break;
         case S_IFREG: {
@@ -1751,7 +1765,9 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
                                           le32_to_cpu(lmm->lmm_stripe_count));
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
+                LOCK_INODE_MUTEX(dparent->d_inode);
                 rc = ll_vfs_unlink(dparent->d_inode, dchild, mds->mds_vfsmnt);
+                UNLOCK_INODE_MUTEX(dparent->d_inode);
                 mds_counter_incr(req->rq_export, LPROC_MDS_UNLINK);
                 break;
         }
@@ -1764,7 +1780,9 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
                                       NULL);
                 if (IS_ERR(handle))
                         GOTO(cleanup, rc = PTR_ERR(handle));
+                LOCK_INODE_MUTEX(dparent->d_inode);
                 rc = ll_vfs_unlink(dparent->d_inode, dchild, mds->mds_vfsmnt);
+                UNLOCK_INODE_MUTEX(dparent->d_inode);
                 mds_counter_incr(req->rq_export, LPROC_MDS_UNLINK);
                 break;
         default:
@@ -1961,8 +1979,10 @@ static int mds_reint_link(struct mds_update_record *rec, int offset,
         if (IS_ERR(handle))
                 GOTO(cleanup, rc = PTR_ERR(handle));
 
+        LOCK_INODE_MUTEX(de_tgt_dir->d_inode);
         rc = ll_vfs_link(de_src, mds->mds_vfsmnt, de_tgt_dir->d_inode, dchild,
                          mds->mds_vfsmnt);
+        UNLOCK_INODE_MUTEX(de_tgt_dir->d_inode);
         if (rc && rc != -EPERM && rc != -EACCES)
                 CERROR("vfs_link error %d\n", rc);
 cleanup: