diff --git a/lustre/llite/dcache.c b/lustre/llite/dcache.c
index d82b47bfa8edf3b2cd7c448a8c5487cc271bb035..8b30963dce139c09d075e53b5d3752f4224aa166 100644
--- a/lustre/llite/dcache.c
+++ b/lustre/llite/dcache.c
@@ -62,10 +62,9 @@ void ll_set_dd(struct dentry *de)
         EXIT;
 }
 
-void ll_intent_release(struct lookup_intent *it)
+void ll_intent_drop_lock(struct lookup_intent *it)
 {
         struct lustre_handle *handle;
-        ENTRY;
 
         if (it->it_op && it->d.lustre.it_lock_mode) {
                 handle = (struct lustre_handle *)&it->d.lustre.it_lock_handle;
@@ -73,11 +72,17 @@ void ll_intent_release(struct lookup_intent *it)
                        " from it %p\n", handle->cookie, it);
                 ldlm_lock_decref(handle, it->d.lustre.it_lock_mode);
 
-                /* intent_release may be called multiple times, from
-                   this thread and we don't want to double-decref this
-                   lock (see bug 494) */
+                /* bug 494: intent_release may be called multiple times, from
+                 * this thread and we don't want to double-decref this lock */
                 it->d.lustre.it_lock_mode = 0;
         }
+}
+
+void ll_intent_release(struct lookup_intent *it)
+{
+        ENTRY;
+
+        ll_intent_drop_lock(it);
         it->it_magic = 0;
         it->it_op_release = 0;
         it->d.lustre.it_disposition = 0;
diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h
index 14e04a7711bb3ec9ea5d6217f9c6bf692780b05a..bf97b5f2f8bb5c96d84e6831bdc5666a4f26b775 100644
--- a/lustre/llite/llite_internal.h
+++ b/lustre/llite/llite_internal.h
@@ -178,6 +178,7 @@ extern struct file_operations ll_special_fifo_file_fops;
 extern struct file_operations ll_special_sock_inode_fops;
 
 /* llite/dcache.c */
+void ll_intent_drop_lock(struct lookup_intent *);
 void ll_intent_release(struct lookup_intent *);
 extern void ll_set_dd(struct dentry *de);
 void ll_unhash_aliases(struct inode *);
diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c
index e768933faf237894f6390e423e8539da4574731e..f5bacb5c4ba6647684b28e1a24c922274c2adf7f 100644
--- a/lustre/llite/namei.c
+++ b/lustre/llite/namei.c
@@ -348,6 +348,9 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
         if (rc < 0)
                 GOTO(out, retval = ERR_PTR(rc));
 
+        /* bug 2334: drop MDS lock before acquiring OST lock */
+        ll_intent_drop_lock(it);
+
         rc = lookup_it_finish(req, 1, it, &icbd);
         if (rc != 0) {
                 ll_intent_release(it);