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);